在使用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);
}