1. 程式人生 > >aac轉碼後的資料無法直接播放

aac轉碼後的資料無法直接播放

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