1. 程式人生 > >AAC頭部格式

AAC頭部格式

www length 論文 ews amp aud eat pat ont

一共有2種AAC頭格式,一種是StreamMuxConfig,另一種是AudioSpecificConfig
1、AudioSpecificConfig 讀寫header的代碼參考
ffmpeg libavcodec\aacenc.c put_audio_specific_config() ffmpeg libavcodec\mpeg4audio.c avpriv_mpeg4audio_get_config()
fdk-aac libMpegTPEnc\src\tpenc_asc.cpp transportEnc_writeASC() libaacplus aacplusenc.c aacplusEncGetDecoderSpecificInfo() ISO文檔 14496-3
1.6.2.1 "Syntax - AudioSpecificConfig"
http://www.nhzjj.com/asp/admin/editor/newsfile/2010318163752818.pdf 該Header的主要成員
audioObjectType: 基本的object type用5個比特表示。2是AAC-LC,5是SBR,29是PS。
samplingFrequencyIndex: 4個比特,用來表示采樣率表中的索引號
channelConfiguration: 4個比特,聲道數 if (audioObjectType == 5 || audioObjectType == 29) extensionSamplingFrequencyIndex: 4個比特,表明實際的音頻采樣率 audioObjectType: 5個比特,表明基本層編碼的AOT
GASpecificConfig
frameLengthFlag: 1個比特,0表示幀長為1024,1表示幀長為960
DependsOnCoreCoder: 1個比特
extensionFlag: 1個比特 剩余的擴展字段 syncExtensionType: 11個比特,0x2b7表示HE-AAC的擴展 if (syncExtensionType == 0x2b7) { extensionAudioObjectType: 5個比特 if ( extensionAudioObjectType == 5 ) { sbrPresentFlag: 1個比特
if (sbrPresentFlag == 1) {
extensionSamplingFrequencyIndex: 4個比特 } } } object type、sample rate詳細表格可以參考
http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio 如果是HE-AAC,有兩種explicit和implicit一共三種聲明模式。在explicit模式一(hierarchical signaling),AOT是5,然後在channels之後會有擴展的采樣率和AOT字段(這裏的AOT用於表明基本層編碼,一般是2 AAC-LC),fdk_aac采用的這種方式;在explicit模式二(backward compatible signaling),AOT仍然是2(AAC-LC),但在GASpecificConfig後會有同步字0x2b7和sbrPresentFlag,libaacplus采用的是這種方式;在implicit模式,AOT仍然是2(AAC-LC),AudioSpecificConfig沒有任何擴展,仍只是2個字節,需要靠解碼器在AAC碼流中找到SBR的數據 參考論文《A closer look into MPEG-4 High Efficiency AAC》 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.129.4563&rep=rep1&type=pdf http://developer.apple.com/library/ios/#technotes/tn2236/_index.html 2、StreamMuxConfig
寫header的代碼參考
ffmpeg libavformat\latmenc.c latm_write_frame_heade()
ffmpeg libavcodec\aacdec.c read_stream_mux_config()
fdk-aac libMpegTPEnc\src\tpenc_latm.cpp CreateStreamMuxConfig() ISO文檔 14496-3
1.7.3 Multiplex Layer 其他相關的 1、TS流可以使用ADTS和LATM兩種封裝格式。在ffmpeg的mpegtsenc中,用了一個amux的AVFormatContext,先把非ADTS的raw aac流寫成ADTS或者LATM格式,然後再寫入TS流 2、FLV/RTMP有兩種AAC AUDIO DATA,0是AudioSpecificConfig,1是raw的AAC流。可以參考flv格式的官方說明文檔 http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf 3、AAC的LATM over RTP打包格式定義在RFC 3016。SDP中幾個參數含義:object,就是AAC的AOT;cpresent=0,表示StreamMuxConfig不出現在碼流中;config,就是StreamMuxConfig用base16進行編碼。每個RTP包的載荷,最前面是PayloadLengthInfo,每出現一個0xFF表示幀長度+255,直至非0xFF就是剩余的長度;然後就是PayloadMux即AAC的裸流

4、AAC的另外一種RTP打包格式是mpeg4-generic,定義在RFC 3640。SDP中幾個參數含義:config,就是AudioSpecificConfig的十六進制表示;sizeLength=13; indexLength=3,這是每個rtp包頭都是固定的。每個RTP包的載荷,最前面2個字節一般是0x00 10,這是 AU-headers-length,表示AU header的長度是16個比特也就是2個字節。後面2個字節,高13位是AAC幀的長度,低3位為0。

AAC頭部格式