關於AAC的介紹請大家谷歌百度了,我連個半路出家都算不上,對這些一竅不通。 AAC格式網上大概說的有兩種數據流,ADTS流跟 Raw流,這裏只討論 aac adts。
關於AAC ADTS類型介紹:http://blog.csdn.net/bsplover/article/details/7426476 。
最近一個項目設計到音頻, 也就是寫mov+aac格式文件,卡在AAC這裏很久了,網上其實高手挺多,方法其實也有很多,就是說的不是很直白,我呢也看不懂理論一大堆的,然後自己一邊找一邊改,皇天不負有心人啊,折騰了這麼久終於弄出來了,其實這個問題如果是看文檔的話也是很簡單的,關鍵是我半路出家,什麼都不知道,只有瞎折騰了。不說廢話了。
ffmpeg寫 mov+aac時呢,音頻有兩個值得注意的地方。
1: av_new_stream 的時候。
寫aac音頻時,要添加兩個字節的信息到AVCodecContext
char dsi[2];
make_dsi( (unsigned int)get_sr_index( (unsigned int)samples ), (unsigned int)channels, dsi );
c->extradata = (uint8_t*)dsi;
c->extradata_size = 2;
void make_dsi( unsigned int sampling_frequency_index, unsigned int channel_configuration, unsigned char* dsi )
{
unsigned int object_type = 2; // AAC LC by default
dsi[0] = (object_type<<3) | (sampling_frequency_index>>1);
dsi[1] = ((sampling_frequency_index&1)<<7) | (channel_configuration<<3);
}
int get_sr_index(unsigned int sampling_frequency)
{
switch (sampling_frequency) {
case 96000: return 0;
case 88200: return 1;
case 64000: return 2;
case 48000: return 3;
case 44100: return 4;
case 32000: return 5;
case 24000: return 6;
case 22050: return 7;
case 16000: return 8;
case 12000: return 9;
case 11025: return 10;
case 8000: return 11;
case 7350: return 12;
default: return 0;
}
}
2. 就是ffmpeg 寫AAC音頻數據不能含有ADTS頭(ADTS頭7字節,需要看你怎麼編碼的)。