AAC文件格式與解碼流程

1 文件格式

1.1 概述及分類

AAC“Advanced Audio Coding”的縮寫,中文稱爲“高級音頻編碼”,被手機界稱爲“21世紀數據壓縮方式”,AAC所採用的運算方式是與MP3的運算有所不同,AAC同時可以支持多達48個音軌,15個低頻音軌,更多種取樣率和比特率與及有多種言語的兼容能力,更高的譯碼效率,總括來說,AAC可以在對比MP3文件縮小30%的前題下提供更好的音質。

AAC幀與幀之間編碼完全獨立,所以其廣泛運用於流媒體。

由於對AAC有重要貢獻的公司比較多,如Fraunhofer,Dolby, Sony和AT&T,導致AAC子格式多,很容易搞混。他們是共分爲9種規格,以適應不同場合的需要:

a) MPEG-2 AAC LC 低複雜度規格 (Low Complexity)

b) MPEG-2 AAC Main 主規格

c) MPEG-2 AAC SSR 可變取樣率規格 (Scaleable Sample Rate)

d) MPEG-4 AAC LC 低複雜度規格(Low Complexity),現在的手機比較常見的MP4文件中的音頻部份就包括了該規格音頻文件

e) MPEG-4 AAC Main 主規格

f) MPEG-4 AAC SSR 可變取樣率規格 (Scaleable Sample Rate)

g) MPEG-4 AAC LTP 長時期預測規格(Long Term Predicition)

h) MPEG-4 AAC LD 低延遲規格(Low Delay)

i) MPEG-4 AAC HE 高效率規格(High Efficiency)(即AAC+,含SBR)

上述的規格中,主規格“Main”包含了除增益控制之外的全部功能,其音質是最好,而低複雜度規格則是比較簡單,沒有了增益控制,但提高了編碼效率,至“SSR”對“LC”規格大體是相同,但是多了增益的控制功能,另外,MPEG-  4/AAC/LTP/LD/HE,都是用在低碼率下編碼,特別是“HE”是有Nero ACC編碼器支持,是近來多用的一種編碼率種,不過通常來說,Main規格和LC規格的音質相差是不大。

以上規格的劃分是比較官方的分發,wiki上也是如此劃分。事實上MPEG-4與MPEG-2 AAC流除了在文件頭(header)上並沒有什麼區別。只是一些應用軟件象QuickTime並不承認MPEG-2 AAC。Real的解碼程序中,並未對這2種進行區分。所以從編解碼來看,按如下劃分更清晰:

a)LC profile:最簡單的profile,蘋果iTune使用這種格式(iTune也使用Apple LosslessAAC ,不過似乎沒有劃分到AAC家族中,一個文件通常上20M)。

b) MAIN profile: LC profile + 後向預測(backwards prediction)

c) SRS: sample-rate scalability,submitted by Sony and reportedly

d) LTP:long term prediction, main profile + forward prediction

e)HE-AAC: high efficiency AAC,又叫aacPlus,使用SBR,可能使用PS.AAC + SBR(Spectral Band Replication)aacPlusv1, AAC + SBR + PS(Parametric Stereo)aacPlus v2.  如圖所示:

image

其中,aacPlus v1已被運動圖像專家組MPEG指定爲其標準MPEG-4 HE AAC.

1.2 AAC的編碼器

a) FhG Fraunhofer IIS研發的權威編碼器,擁有很好的音質,不對外開放。

b) Nero AAC可能是目前最完美的AAC編碼器了,同時支持"LC AAC/HE AAC"規格,Nero AAC編碼器提供了品質最好的"VBR LC AAC"格式,同時亦對面"HE AAC"規格保證了在低碼率下也有良好的表現,千千靜聽 + Nero插件,就可以編碼AAC文件了,我當初就這麼做測試向量的,哈哈。

c) QuickTime/iTune Apple公司的兩款Media軟件都提供了AAC編碼功能,其編碼技術來自“DolbyLaboratories”,是目前音質最好的中碼編率編碼器,它編碼的48kbps立體聲音質比其它AAC編碼器好20 - 25%,甚至64 kbps的Dolby AAC音效可媲美128 kbps的MP3。

d) FAAC:免費,開源,鄭重推薦。

1.3 文件後綴名

用aac編碼的文件可能使用這三種後綴名:aac,m4a,mp4.

AAC:以aac爲後綴的文件無文件頭,由一些列的幀組成文件,幀頭分ADIF和ADTS兩種。

M4A:用MP4作爲container,這種MP4文件裏面只有音頻幀,無視頻幀。由MP4文件頭+一系列的幀組成,幀頭比AAC爲後綴的文件要短。所以在保持壓縮數據不變的情況下,將AAC轉爲M4A,文件會小一些,因爲每幀省幾個字節,合起來省下的字節數通常比MP4文件頭還大。

MP4:可以同時有視頻幀和音頻幀,也可以只有音頻或視頻幀。

注:在下面的1.5節中,會詳細說一下AAC爲後綴的文件格式,MP4 container的格式可以參照我的另一篇文章,MPEG4-Part14 -- MP4 file format

1.4 編碼工具推薦

FAAC 和 千千靜聽+nero插件

1.5 File format specification--以aac爲後綴名的文件格式

AAC沒有文件頭,由幀序列組成。一共有2種格式的幀頭,ADTS和ADIF。一個文件中通常不會2種幀共存,並且大多數AAC文件包含的幀爲    ADTS。

ADIF:Audio Data Interchange Format 音頻數據交換格式。這種格式的特徵是可以確定的找到這個音頻數據的開始,不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。故這種格式常用在磁盤文件中。

ADTS:Audio Data Transport Stream 音頻數據傳輸流。這種格式的特徵是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始。

//以下對文件格式說明使用的表格來自ISO-IEC-13818-7

1.5.1 ADIF

ADIF的幀序列按如下方式組成一個文件:

                                          Table 2– Syntax of adif_sequence()

Syntax

No. of bits

Mnemonic

adif_sequence()

   

{

   

adif_header();

   

byte_alignment();

   

raw_data_stream();

   

}

   

其中Header結構如下:

                                  Table 3 – Syntax of adif_header()

Syntax

No. of bits

Mnemonic

adif_header()

   

{

   

adif_id;

32

bslbf

copyright_id_present;

1

bslbf

if (copyright_id_present) {

   

copyright_id;

72

bslbf

}

   

original_copy;

1

bslbf

home;

1

bslbf

bitstream_type;

1

bslbf

bitrate;

23

uimsbf

num_program_config_elements;

4

bslbf

if (bitstream_type == ‘0’) {

   

adif_buffer_fullness;

20

uimsbf

}

   

for (i = 0; i < num_program_config_elements + 1; i++) {

   

program_config_element();

   

}

   

}

   

1.5.2 ADTS

ADTS文件有幀序列組成,如下表所示:

Table 4 – Syntax of adts_sequence()

Syntax

No. of bits

Mnemonic

adts_sequence()

   

{

   

while (nextbits() == syncword) {

   

adts_frame();

   

}

   

}

   

 

每幀除去最前面的同步字後,結構如下:

Table 5 – Syntax of adts_frame()

Syntax

No. of bits

Mnemonic

adts_frame()

   

{

   

adts_fixed_header();

   

adts_variable_header();

   

if (number_of_raw_data_blocks_in_frame == 0) {

   

adts_error_check();

   

raw_data_block();

   

}

   

else {

   

adts_header_error_check();

   

for (i = 0; i <= number_of_raw_data_blocks_in_frame; i++) {

   

raw_data_block();

   

adts_raw_data_block_error_check();

   

}

   

}

   

}

   

 

其中,ADTS頭分兩部分,固定頭和可變頭,固定頭每幀一樣,可變頭幀與幀可以不同。

Table 8 – Syntax of adts_fixed_header()

Syntax

No. of bits

Mnemonic

adts_fixed_header()

   

{

   

syncword;

12

bslbf

ID;

1

bslbf

layer;

2

uimsbf

protection_absent;

1

bslbf

profile;

2

uimsbf

sampling_frequency_index;

4

uimsbf

private_bit;

1

bslbf

channel_configuration;

3

uimsbf

original/copy;

1

bslbf

home;

1

bslbf

}

   

 

Table 9 – Syntax of adts_variable_header()

Syntax

No. of bits

Mnemonic

adts_variable_header()

   

{

   

copyright_identification_bit;

1

bslbf

copyright_identification_start;

1

bslbf

frame_length;

13

bslbf

adts_buffer_fullness;

11

bslbf

number_of_raw_data_blocks_in_frame;

2

uimsfb

}

   

 

2 解碼流程

to be continued....

 

轉自:http://blog.csdn.net/evanwu_85/article/details/5946594

發佈了340 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章