AAC基本格式
AAC音頻格式有ADIF和ADTS:
ADIF:Audio Data Interchange Format 音頻數據交換格式。這種格式的特徵是可以確定的找到這個音頻數據的開始,不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。故這種格式常用在磁盤文件中。
ADTS:Audio Data Transport Stream 音頻數據傳輸流。這種格式的特徵是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始。它的特徵類似於mp3數據流格式。
簡單說,ADTS可以在任意幀解碼,也就是說它每一幀都有頭信息。ADIF只有一個統一的頭,所以必須得到所有的數據後解碼。且這兩種的header的格式也是不同的,目前一般編碼後的和抽取出的都是ADTS格式的音頻流。
語音系統對實時性要求較高,基本是這樣一個流程,採集音頻數據,本地編碼,數據上傳,服務器處理,數據下發,本地解碼
一、ADTS格式
1. ADTS(Audio Data Transport Stream)頭之於AAC
AAC音頻文件的每一幀都由一個ADTS頭和AAC ES(AAC音頻數據)組成。
ADTS是幀序列,本身具備流特徵,在音頻流的傳輸與處理方面更加合適。
ADTS 整體結構
AAC數據幀
2. ADTS頭分析
ADTS頭包含了AAC文件的採樣率、通道數、幀數據長度等信息。ADTS頭分爲固定頭信息和可變頭信息兩個部分,固定頭信息在每個幀中的是一樣的,可變頭信息在各個幀中並不是固定值。ADTS頭一般是7個字節((28+28)/ 8)長度,如果需要對數據進行CRC校驗,則會有2個Byte的校驗碼,所以ADTS頭的實際長度是7個字節或9個字節。
2.1 固定頭信息:adts_fixed_header()
ADTS頭的固定頭信息在每個幀中都是一樣的。
adts_fixed_header
-
syncword:幀同步標識一個幀的開始,固定爲0xFFF
-
ID:MPEG 標示符。0表示MPEG-4,1表示MPEG-2
-
layer:固定爲'00'
-
protection_absent:標識是否進行誤碼校驗。0表示有CRC校驗,1表示沒有CRC校驗
-
profile:標識使用哪個級別的AAC。1: AAC Main 2:AAC LC (Low Complexity) 3:AAC SSR (Scalable Sample Rate) 4:AAC LTP (Long Term Prediction)
-
sampling_frequency_index:標識使用的採樣率的下標
-
private_bit:私有位,編碼時設置爲0,解碼時忽略
-
channel_configuration:標識聲道數
-
original_copy:編碼時設置爲0,解碼時忽略
-
home:編碼時設置爲0,解碼時忽略
其中sampling_frequency_index如下:
sampling_frequency_index
channel_configuration如下:
channel_configuration
2.2 可變頭信息:adts_variable_header()
adts_variable_header.png
-
copyrighted_id_bit:編碼時設置爲0,解碼時忽略
-
copyrighted_id_start:編碼時設置爲0,解碼時忽略
-
aac_frame_length:ADTS幀長度包括ADTS長度和AAC聲音數據長度的和。即 aac_frame_length = (protection_absent == 0 ? 9 : 7) + audio_data_length
-
adts_buffer_fullness:固定爲0x7FF。表示是碼率可變的碼流
-
number_of_raw_data_blocks_in_frame:表示當前幀有number_of_raw_data_blocks_in_frame + 1 個原始幀(一個AAC原始幀包含一段時間內1024個採樣及相關數據)。
二、LATM格式
LATM 的全稱爲“Low-overhead MPEG-4 Audio TransportMultiplex”(低開銷音頻傳輸複用),
是MPEG-4 AAC制定的一種高效率的碼流傳輸方式,MPEG-2 TS 流也採用LATM
作爲AAC 音頻碼流的封裝格式之 LATM格式也以幀爲單位,主要由AudioSpecificConfig(音頻特定配置單元)與音頻負載組成。
AudioSpecificConfig 描述了一個LATM 幀的信息,音頻負載主要由PayloadLengthInfo(負載長度信息)和PayloadMux(負載淨荷)組成。
AudioSpecificConfig 信息可以是帶內傳,也可以是帶外傳。所謂帶內傳,就是指每一個LATM 幀,都含有一個AudioSpecificConfig 信息;
而帶外傳,則每一個LATM幀都不含有AudioSpecificConfig 信息,而通過其他方式把AudioSpecificConfig信息發送到解碼端,
由於AudioSpecificConfig 信息一般是不變的,所以只需發送一次即可。由此可見,
AudioSpecificConfig 信息採用帶內傳輸可適應音頻編碼信息不斷變化的情況,
而採用帶外傳輸,可以節省音頻傳輸碼率。帶內或帶外傳,由muxconfigPresent 標誌位決定。例如流媒體應用中,
muxconfigPresent 可設置爲0,這樣LATM幀中將不含有AudioSpecificConfig 信息,LATM幀通過RTP包發送出去,
AudioSpecificConfig 可通過SDP文件一次性傳送到解碼端。
AudioSpecificConfig主要參數
numSubFrames 子幀的數目
numProgram 複用的節目數
numLayer 複用的層數
frameLengthType 負載的幀長度類型,包括固定長度與可變長度
audioObjectType音頻對象類型
samplingFrequency採樣率
channelConfiguration聲道配置
音頻負載由若干子幀組成,每個子幀由PayloadLengthInfo和PayloadMux組成,
與ADTS幀淨荷一樣,音頻負載主要包含原始幀數據。
AAC打包成TS流通常有兩種方式,分別是先打包成ADTS或LATM。ADTS的每一幀都有個幀頭,在
每個幀頭信息都一樣的狀況下,會有很大的冗餘。LATM格式具有很大的靈活性,每幀的音頻配置單元既可以帶內傳輸,
又可以帶外傳輸。正因爲如此,LATM不僅適用於流傳輸還可以用於RTP傳輸,
RTP傳輸時,若音頻數據配置信息是保持不變,可以先通過SDP會話先傳輸StreamMuxConfig(AudioSpecificConfig)信息,
由於LATM流由一個包含了一個或多個音頻幀的audioMuxElements(音頻複用元素)序列組成。
一個完整或部分完整的audioMuxElement可直接映射到一個RTP負載上。
下面是一個audoMuxEmlemt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
可以很簡單的把ADTS幀轉換爲LATM幀,根據ADTS頭的信息,生成StreamMuxConfig,
將ADTS中的原始幀提取出來,前面加上PayloadLengthInfo做爲LATM的音頻幀。
按照上述格式打包生成AudioMuxElement,作爲RTP的負載傳輸.
本文總結自以下網址:
https://www.jianshu.com/p/b5ca697535bd
https://blog.csdn.net/qingkongyeyue/article/details/77621950
音視頻技術交流討論歡迎加 QQ羣 121376426