一共有2種AAC頭格式,一種是StreamMuxConfig,另一種是AudioSpecificConfig
1、AudioSpecificConfig
讀寫header的代碼參考
ffmpeg libavcodec\aacenc.c put_audio_specific_config()
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()
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
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個比特,聲道數
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個比特
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個比特
if (sbrPresentFlag == 1) {
extensionSamplingFrequencyIndex: 4個比特
}
}
}
object type、sample rate詳細表格可以參考
http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio
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
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()
寫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.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格式的官方說明文檔
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。