從零開始學習音視頻編程技術(42) AAC數據解析

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

AudioMuxElement(muxConfigPresent)

{

    //muxconfigPresent 可設置爲0,這樣LATM幀中將不含有AudioSpecificConfig 信息,

    //LATM幀通過RTP包發送出去,

    if (muxConfigPresent) 

    {

    useSameStreamMux;

    if (!useSameStreamMux)

    StreamMuxConfig(); 

     

    }

    if (audioMuxVersionA == 0)

    

        for (i = 0; i <= numSubFrames; i++)

        

        PayloadLengthInfo();

        PayloadMux();

        }

    }

}

可以很簡單的把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  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章