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. 如圖所示:
其中,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....