aac转码后的数据无法直接播放

14 篇文章 1 订阅
9 篇文章 0 订阅

在使用ffmpeg对音频进行转码,发现从编码器里面出来的音频数据,存成的aac文件并不能用播放器(VLC)播放,goldwave也不行,原因:缺少包头信息,即ADTS头。具体这方面的资料大家可以问度娘。
编码出来的每一个AVPacket的数据,在写入到AAC文件前,都需要先写一个ADTS头(包含音频采样率信息,声道数信息,帧长度等),问题来了,如何构造一个正确的ADTS头?下面我就把简单的构造adts头的函数贴出来,供大家参考,如果有需要改进的地方,还请指教:

#define ADTS_HEAD_LEN 7

#define adts_sample_rates[]={96000,882000,64000,48000,441000,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0};

int FindAdstSRIndex(int samplerate)
{
    int i;
    for(i=0;i < 16;i++)
    {
        if(samplerate == adts_sample_rates[i])
            return i;
    }
    return 16 - 1;
}

void MakeAdtsHeader(unsigned char *data,int samplerate, int channels ,int iFrameLen)
{
    int profile = 1;//aac lc
    int sr_index = FindAdtsSRIndex(samplerate);
    int adts_len = ADTS_HEAD_LEN;
    int framesize = adts_len + iFrameLen;

    memset(data, 0, adts_len  * sizeof(unsigned char));
    data[0] += 0xFF;

    data[1] += 0xF0;
    data[1] += 1;

    data[2] += ((profile << 6) & 0xC0);
    data[2] += ((sr_index << 2) & 0x3C);
    data[2] += ((channels >> 2) & 0x1);

    data[3] += ((channels << 6) & 0xC0);
    data[3] += ((framesize >> 11) & 0x3);

    data[4] += ((framesize >> 3) & 0xFF);

    data[5] += ((framesize << 5) & 0xE0);
    data[5] += ((0X7FF >> 6) & 0x1F);

    data[6] += ((0X7FF << 2) & 0x3F);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值