AAC文件格式解析
(今天有了一個(gè)新任務(wù),要把RTSP的音頻流存成文件,格式是AAC的。
網(wǎng)上找了很久,也沒(méi)有找到關(guān)于AAC文件的格式。
后來(lái)請(qǐng)教了一個(gè)專門作編解碼的同事,在ISO MPEG的文檔里可能會(huì)有相關(guān)的信息。
花了很長(zhǎng)時(shí)間去找ISO的文檔,ISO是收費(fèi)的,網(wǎng)絡(luò)是免費(fèi)了,雖然難了點(diǎn),但還是找到了部分的文檔。其中辛苦不足為外人道也。
在找了個(gè)quicktime可以播放的aac文件,邊看文檔,邊分析一下,總算是基本搞定了。但是有的文檔沒(méi)找到,還有些字段不知是什么意思。不管了,反正能放了:)
AAC格式是frame head + frame length, 沒(méi)有文件頭。感到比較奇怪的,我覺(jué)得應(yīng)該是有文件頭的,文檔上也有adts_fixed_header,但是好像沒(méi)有頭quicktime也能放,那就先不管了吧。
參見(jiàn)ISO/IEC 11496-3 1.1 Interchange format streams
adts_frame()
{
byte_alignment()
adts_fixed_header()
adts_variable_header()
adts_error_check()
óISO/IEC ISO/IEC CD 14496-3 Subpart 4: 1998
MPEG-4 CD 14496-3 Subpart 4 / 20:09 / 22.06.98 11
for( i=0; i<number_of_raw_data_blocks_in_frame+1; i++) {
raw_data_block()
}
}
adts_fixed_header()
{
syncword 12 bslbf
ID 1 bslbf
layer 2 uimsbf
protection_absent 1 bslbf
profile 2 uimsbf
sampling_frequency_index 4 uimsbf
private_bit 1 bslbf
channel_configuration 3 uimsbf
original/copy 1 bslbf
home 1 bslbf
emphasis 2 bslbf
}
adts_variable_header()
{
copyright_identification_bit 1 bslbf
copyright_identification_start 1 bslbf
frame_length 13 bslbf
adts_buffer_fullness 11 bslbf
number_of_raw_data_blocks_in_frame 2 uimsfb
}
存文件的代碼:
static char head1[7];
int temp = frame_len + 7;
head1[0] = (char)0xff;
head1[1] = (char)0xf9;
int sr_index = rtp_aac_get_sr_index(aac_param_ptr->sample_rate);
head1[2] = (0x01<<6)|(sr_index<<2)|0x00;
//head1[3] = (char)0x80; //雙聲道? a=rtpmap:97 mpeg4-generic/44100/2
head1[3] = (char)0x40; //單聲道? a=rtpmap:97 mpeg4-generic/44800
head1[4] = (temp>>3)&0xff;
head1[5] = ((temp&0x07)<<5|0x1f);
head1[6] = (char)0xfc;
fwrite(head1,1,sizeof(head1),g_file_audio);
fwrite(frame_buf,1,frame_len,g_file_audio);
其中frame_buf是一幀的數(shù)據(jù),framec_len是幀長(zhǎng)度。
簡(jiǎn)單的說(shuō)明和困惑:
長(zhǎng)度為7個(gè)字節(jié)
syncword 12 bit 1111 1111 1111
ID 1 bit 1 for mpeg audio
layer 2 bit not sure, I set to 00
protection_absent 1 bit set to 1
profile 2 bit 1 for AAC main
sampling_frequency_index 4 bit sample rate index
private_bit 1 bit set to 0
channel_configuration 3 bit 是不是聲道數(shù)?
在SDP中有 a=rtpmap:97 mpeg4-generic/44100/2 此時(shí) channel_configuration = 010
a=rtpmap:97 mpeg4-generic/44800 此時(shí) channel_configuration = 001
original/copy 1 bit set to 0
home 1 bit set ot 0
emphasis 2bit set to 00
copyright_identification_bit 1 bit set to 0
copyright_identification_start 1 bit set to 0
frame_length 13 bit 這個(gè)長(zhǎng)度是包括head 7個(gè)字節(jié)的
最后添FC 最后兩個(gè)字段沒(méi)搞清楚
文檔不全,對(duì)編解碼也知之甚少,只能靠分析別人的文件和試驗(yàn)了,至少能出聲音了。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。