ffmpeg寫 mov+aac 文件時注意事項

關於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字節,需要看你怎麼編碼的)。 

發佈了136 篇原創文章 · 獲贊 5 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章