天天看點

音視訊編解碼技術:AAC 音頻編碼技術

作者:音視訊開發老舅

本文目錄:

  • 一、AAC編碼概述
  • 二、AAC編碼規格簡述
  • 三、AAC編碼的特點
  • 四、AAC音頻檔案格式

一、AAC編碼概述

AAC是進階音頻編碼(Advanced Audio Coding)的縮寫,出現于1997年,最初是基于MPEG-2的音頻編碼技術,目的是取代MP3格式。2000年,MPEG-4标準出台,AAC重新內建了其它技術包括SBR或PS特性,目前AAC可以定義為⼀種由 MPEG-4 标準定義的有損音頻壓縮格式

二、AAC編碼規格簡述

AAC共有9種規格,以适應不同的場合的需要:

MPEG-2 AAC LC 低複雜度規格(Low Complexity) 注:比較簡單,沒有增益控制,但提高了編碼效率,在中等碼率的編碼效率以及音質方面,都能找到平衡點

MPEG-2 AAC Main 主規格

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

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

MPEG-4 AAC Main 主規格 注:包含了除增益控制之外的全部功能,其音質最好

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

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

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

MPEG-4 AAC HE 高效率規格(High Efficiency)---這種規格适合用于低碼率編碼,有Nero ACC 編碼器支援

流行的Nero AAC編碼程式隻支援LC,HE,HEv2這三種規格,編碼後的AAC音頻,規格顯示都是LC。HE其實就是AAC(LC)+ SBR技術,HEv2就是AAC(LC)+ SBR + PS技術;

這裡再說明一下HE和HEv2的相關内容:

HE:HE-AAC v1(又稱AACPlusV1,SBR),用容器的方法實作了AAC(LC)+SBR技術。SBR其實代表的是Spectral Band Replication(頻段複制)。簡要叙述一下,音樂的主要頻譜集中在低頻段,高頻段幅度很小,但很重要,決定了音質。如果對整個頻段編碼,若是為了保護高頻就會造成低頻段編碼過細以緻檔案巨大;若是儲存了低頻的主要成分而失去高頻成分就會喪失音質。SBR把頻譜切割開來,低頻單獨編碼儲存主要成分,高頻單獨放大編碼儲存音質,“統籌兼顧”了,在減少檔案大小的情況下還儲存了音質,完美的化解這一沖突。

HEv2:用容器的方法包含了HE-AAC v1和PS技術。PS指“parametric stereo”(參數立體聲)。原來的立體聲檔案檔案大小是一個聲道的兩倍。但是兩個聲道的聲音存在某種相似性,根據香農資訊熵編碼定理,相關性應該被去掉才能減小檔案大小。是以PS技術存儲了一個聲道的全部資訊,然後,花很少的位元組用參數描述另一個聲道和它不同的地方。

三、AAC編碼的特點

(1). AAC是一種高壓縮比的音頻壓縮算法,但它的壓縮比要遠超過較老的音頻壓縮算法,如AC-3、MP3等。并且其品質可以同未壓縮的CD音質相媲美。

(2). 同其他類似的音頻編碼算法一樣,AAC也是采用了變換編碼算法,但AAC使用了分辨率更高的濾波器組,是以它可以達到更高的壓縮比。

(3). AAC使用了臨時噪聲重整、後向自适應線性預測、聯合立體聲技術和量化哈夫曼編碼等最新技術,這些新技術的使用都使壓縮比得到進一步的提高。

(4). AAC支援更多種采樣率和比特率、支援1個到48個音軌、支援多達15個低頻音軌、具有多種語言的相容能力、還有多達15個内嵌資料流。

(5). AAC支援更寬的聲音頻率範圍,最高可達到96kHz,最低可達8KHz,遠寬于MP3的16KHz-48kHz的範圍。

(6). 不同于MP3及WMA,AAC幾乎不損失聲音頻率中的甚高、甚低頻率成分,并且比WMA在頻譜結構上更接近于原始音頻,因而聲音的保真度更好。

(7). AAC采用優化的算法達到了更高的解碼效率,解碼時隻需較少的處理能力。

四、AAC音頻檔案格式

1. ACC 音頻檔案格式類型

AAC的音頻檔案格式有ADIF & ADTS:

ADIF:Audio Data Interchange Format 音頻資料交換格式。這種格式的特征是可以确定的找到這個音頻資料的開始,不需進行在音頻資料流中間開始的解碼,即它的解碼必須在明确定義的開始處進行,這種格式常用在磁盤檔案中。

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

簡單說,ADTS可以在任意幀解碼,也就是說它每一幀都有頭資訊。ADIF隻有一個統一的頭,是以必須得到所有的資料後解碼。這兩種的header的格式也是不同的,一般編碼後的和抽取出的都是ADTS格式的音頻流。

音視訊開發學習資料→「連結」

AAC的ADIF檔案格式如下:

header() raw_data_stream()

AAC的ADTS檔案中一幀的格式如下:

... syncword header() error_check() raw_data_block() ...

ADTS格式中兩邊的空白矩形表示目前一幀前後的資料。

2. ADIF 的 Header 結構

ADIF 的頭資訊如下圖:

音視訊編解碼技術:AAC 音頻編碼技術

ADIF頭資訊位于AAC檔案的起始處,接下來就是連續的 Raw Data Blocks。

3. ADTS 的 Header 頭結構

一個 AAC 原始資料塊長度是可變的,對原始幀加上 ADTS 頭的封裝,就形成了 ADTS 幀。ADTS 頭中相對重要的資訊有:采樣率,聲道數,幀長度 ,每一個帶 ADTS 頭資訊的 AAC 流會清晰的告訴解碼器它需要的這些資訊,解碼器才能解析讀取。一般情況下 ADTS 的頭資訊都是 7 個位元組,分為 2 部分:

  - adts_fixed_header(); —— 固定頭資訊,頭資訊中的每一幀都相同.

  - adts_variable_header(); —— 可變頭資訊,頭資訊則在幀與幀之間可變.

ADTS 的固定頭資訊:

音視訊編解碼技術:AAC 音頻編碼技術

Syncword: 總是0xFFF,代表一個ADTS幀的開始, 用于同步,解碼器可通過0xFFF确定每個ADTS的開始位置.因為它的存在,解碼可以在這個流中任何位置開始, 即可以在任意幀解碼**。

ID:MPEG Version: 0 for MPEG-4, 1 for MPEG-2

Layer:always: '00'

Protection_absent:Warning, set to 1 if there is no CRC and 0 if there is CRC

Profile:表示使用哪個級别的AAC,如profile的值等于 Audio Object Type的值減1,即profile = MPEG-4 Audio Object Type - 1

sampling_frequency_index: 采樣率的下标

channel_configuration:聲道數. 比如2表示立體聲雙聲道.

aac_frame_length: 一個ADTS幀的長度包括ADTS頭和AAC原始流.

adts_buffer_fullness:0x7FF 說明是碼率可變的碼流.

number_of_raw_data_blocks_in_frame:表示ADTS幀中有number_of_raw_data_blocks_in_frame + 1個AAC原始幀.

在實際開發AAC編解碼的時候,尤其是封裝ADTS幀的時候,如何設定相關的Header的值,可以參考如下wiki内容:

  • https://wiki.multimedia.cx/index.php?title=MPEG-4_Audio
  • https://wiki.multimedia.cx/index.php/ADTS

注意:ACC LC和HE在采樣率設定方面不同,LC格式的為正常索引,HE格式的索引為除2後對應的采樣索引,這是因為:HE使用了SBR技術,即 Spectral Band Replication(頻段複制),是以存儲同樣的音頻内容,HE檔案較小。使用時采樣率為LC的一半。

ADTS的可變頭資訊:

音視訊編解碼技術:AAC 音頻編碼技術

(1)Syncword 存在的目的是為了找出幀頭在比特流中的位置,ADTS格式的幀頭同步字為12比特的“1111 1111 1111”.

(2)ADTS的頭資訊為兩部分組成,其一為固定頭資訊,緊接着是可變頭資訊。固定頭資訊中的資料每一幀都相同,而可變頭資訊則在幀與幀之間可變。

4. AAC檔案處理流程

(1). 判斷檔案格式,确定為ADIF或ADTS

(2). 若為ADIF,解ADIF頭資訊,跳至第6步。

(3). 若為ADTS,尋找同步頭。

(4). 解ADTS幀頭資訊。

(5). 若有錯誤檢測,進行錯誤檢測。

(6). 解塊資訊。

(7). 解元素資訊。

注意:有時候在處理AAC音頻流的時候 (比如:把 AAC 音頻的 ES 流從 FLV 封裝格式中抽出來送給硬體解碼器),編碼後的 AAC 檔案在PC或者手機上不能播放,導緻播放錯誤,很大可能的原因是 AAC 檔案的每一幀缺少 ADTS 頭資訊檔案的包裝拼接,這時需要加上頭檔案 ADTS 即可。

繼續閱讀