一、AAC概述
AAC(Advanced Audio Coding),高級音頻編碼,是基于MPEG-2的音頻編碼技術,于1997年推出,主要用于取代MP3格式。2000年,隨著MPEG-4標準的推出,AAC重新集成了新的技術(如SBR、PS等)特性,稱之為MEPG-4 AAC。AAC共有9種規(guī)格,具體如下所示:
| 編號 | 規(guī)格 | 說明 |
|---|---|---|
| 1 | MPEG-2 AAC LC | 低復雜度規(guī)格 |
| 2 | MPEG-2 AAC Main | 主規(guī)格 |
| 3 | MPEG-2 AAC SSR | 可變采樣率規(guī)格 |
| 4 | MPEG-4 AAC LC | 低復雜度規(guī)格 |
| 5 | MPEG-4 AAC Main | 主規(guī)格 |
| 6 | MPEG-4 AAC SSR | 可變采樣率規(guī)格 |
| 7 | MPEG-4 AAC LTP | 長期預測規(guī)格 |
| 8 | MPEG-4 AAC LD | 低延遲規(guī)格 |
| 9 | MPEG-4 AAC HE | 高效率規(guī)格 |
AAC是一種高壓縮比的音頻壓縮算法,本文主要從數據處理的角度對AAC音頻碼流進行分析。
二、AAC碼流結構
AAC音頻格式有兩種:具體如下:
ADIF(Audio Data Interchange Format),音頻數據交換格式:只有一個統(tǒng)一的頭,必須得到所有數據后解碼,適用于本地文件。
ADTS(Audio Data Transport Stream),音視數據傳輸流:每一幀都有頭信息,可在任意幀解碼,適用于傳輸流。
ADIF格式如下所示:
| ADIF Header | raw_data_stream |
|---|
ADIF Header格式定義如下所示:

ADTS碼流是由連續(xù)的多個ADTS Frame組成的,ADTS Frame是由ADTS Header和AAC ES組成的,具體如下所示:
| ...... | ADTS Header | AAC ES | ADTS Header | AAC ES | ...... |
|---|
ADTS Header,一般為7字節(jié)或9字節(jié)(有CRC校驗),包含采樣率、聲道數、幀長度等信息,主要由adts_fixed_header、adts_variable_header、crc三部分組成。
adts_fixed_header:固定頭,內容是不變的,每一幀的內容都相同,具體格式如下所示:

syncword(12bit):同步字值為0xFFF,所有位為1。
ID(1bit):0表示MPEG-4,1表示MPEG-2。
layer(2bit):所有位值為0。
protection_absent(1bit):0表示有CRC,1表示沒有CRC。
profile(2bit):配置級別,MPEG-2中定義profile取值如下圖所示:

sampling_frequency_index(4bit):采樣頻率,具體取值如下圖所示:

private_bit(1bit):see ISO/IEC 11172-3, subclause 2.4.2.3 (Table 8)。
channel_configuration(3bit):表示聲道數。
original/copy(1bit):編碼默認值為0,解碼忽略此值。
home(1bit):編碼默認值為0,解碼忽略此值。
adts_variable_header:可變頭,內容是變化的,每一幀的內容存在變化,具體格式如下所示:

copyright_identification_bit(1bit):編碼默認值為0,解碼忽略此值。
copyright_identification_start(1bit):編碼默認值為0,解碼忽略此值。
frame_length(13bit):幀長度,即整個ADTS Frame的長度。
adts_buffer_fullness(11bit):默認值為0x7FF,表示可變碼流。
number_of_raw_data_blocks_in_frame(2bit):其值加1表示ADTS Frame中原始數據塊的個數。
三、AAC數據示例
利用UItraEdit工具打開一個AAC文件進行數據分析,如下圖所示:

紅色標注部分為ADTS Header,根據前文所述,第一個Header詳細數據分析如下:
syncword(12bit):值為0xFFF。
ID(1bit):值為1,表示MPEG-2。
layer(2bit):值為0。
protection_absent(1bit):值為1,表示沒有CRC。
profile(2bit):值為1,表示LC。
sampling_frequency_index(4bit):值為4,表示44100Hz。
private_bit(1bit):值為0。
channel_configuration(3bit):值為2,表示雙通道。
original/copy(1bit):值為0。
home(1bit):值為0。
copyright_identification_bit(1bit):值為0。
copyright_identification_start(1bit):值為0。
frame_length(13bit):值為106,表示整個ADTS Frame的長度。
adts_buffer_fullness(11bit):值為0x7FF,表示可變碼流。
number_of_raw_data_blocks_in_frame(2bit):值為0,表示ADTS Frame中原始數據塊的個數為1。