aac轉碼後的資料無法直接播放
阿新 • • 發佈:2019-02-19
在使用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);
}