1. 程式人生 > >MPEG-4標準定義的音訊壓縮格式AAC詳解

MPEG-4標準定義的音訊壓縮格式AAC詳解

一、AAC簡介

AAC代表Advanced Audio Coding(高階音訊編碼),是一種由MPEG-4標準定義的有損音訊壓縮格式,由Fraunhofer發展,Dolby, Sony和AT&T是主要的貢獻者。在使用MP4作為各種內容的容器格式的新多媒體MPEG-4標準中,它是MPEG Layer III / MP3的天然後繼者。AAC能夠在一條音軌中包括48條全頻寬(直到96khz)音訊聲道,加上15條低頻增強(LFE Low Frequency Enhanced,到120Hz)聲道,直到15條資料流並且更多。

與MPEG-4視訊一樣,AAC有著不同的Profile,其中Low Complexity Profile(LC AAC) (也叫MAIN @ Level 2)最被廣泛用於商業市場(例如Apple非常著名的iTunes音樂庫),其他有象Long Term Prediction Profile(LTP/長期預測), Scalable Sampling Rate Profile(SSR/可變取樣率) 和Low Delay Profile(LD/低延遲)。

HE-AAC和LC-AAC是MPEG4 AAC標準的不同的Profile(類)。LC意思是”Low Complexity”(低複雜性)而HE意思是”High Efficiency”(高效性)。HE-AAC也稱之為AAC SBR/aac+/aacPlus等。注意HE-AAC注重於低碼流的編碼並很適合多聲道檔案(更小的檔案尺寸)。對於HE-AAC檔案,也需要一個可用的HE解碼器。

從學術上講,HE-AAC混合了AAC與SBR技術。SBR代表的是Spectral Band Replication(頻段複製)。SBR的關鍵是在低碼流下提供全頻寬的編碼而不會產生產生多餘的訊號。傳統認為音訊編碼在低碼流下意味著減少頻寬和降低取樣率(見MP3 FAQ #7)或產生令人不快的噪音訊號。SBR解決問題的方法是讓核心編碼去編碼低頻訊號,而SBR解碼器通過分析低頻訊號產生高頻訊號和一些保留在位元流中的指導訊號(通常碼流極低,~2 kbps)。這就是採用無SBR解碼器的原因,這樣你的頻寬(Frequency Response/頻率響應)會被嚴重浪費。這也是為什麼被叫做Spectral Band Replication的原因,它只是增加音訊的頻寬,而非重建。

二、AAC與其他流行音訊編碼的比較

其他優秀格式在128kbps與LC AAC的音質比較:

注意Lame(可用的最好MP3編碼器)和Vorbis在他們最新的版本中提供了更加優良的音質(同樣你可以看這裡)。

也注意在這次測試中使用的WMA9 Pro編碼,是一種與標準WMA9編碼完全不同,並且提供更加優良音質的編碼(使用在音像店和CD唱機裡)並且不是向後相容的。

低位元率和多聲道編碼的AAC提供了高效延展性(HE ACC),同樣在低位元率中是一種最好的格式之一:

其他流行格式在64kbps與HE AAC的音質比較:

注意QT是在QuickTime中提供的LC AAC編碼,He是在Nero中。

繼承Parametric Stereo(引數立體聲)延伸(PS AAC)技術,同時使用HE AAC用於低位元速率的它(Nero完善中)不得不題及。在32kbps它如何與其他編碼比較可以看這裡。

由rjamorim總結出公共收聽測試結果,在128kbps比較這些AAC編碼方式可以在這裡和那裡得到答案。

三、如何編碼AAC?

單LC Profile:

  • FAAC (免費高階音訊編碼器):免費開源的LC-ACC [CLI, DirectShow (3ivx), foobar, CoolEdit, WinAMP]
  • Apple’s AAC:CBC只能用於QuickTime < 7,QuickTime 7和之後版本包括VBR AAC。Apple的編碼不能處理多聲道。[Quicktime專業版, iTunes]iTunes 使用同樣的編碼但可以免費獲取。使用QuickTime編碼的命令列解碼器同樣可行。iTunes/Apple編碼是以最初Dolby編碼為基礎,並且為音質作了較大的調整,儘管只採用CBC但事實上音質非常好。
  • PsyTEL AACENC:多聲道不要用它,因為它會產生錯誤的聲道對映。[命令列, AACMachine ( BeSweet的GUI ) ]
  • Dicas’ Compaact AAC編碼器
  • Sorenson AAC編碼器
  • WinAMP版本5和以上的版本擁有在Dolby編碼基礎上的LC ACC編碼器特色,但並沒有像iTunes那麼多的調節功能。

LC & HE Profile:

  • Nero Burning Rom(在額外的選單中編碼檔案)和附隨的Wave Editor允許LC和HE AAC兩種編碼。另外可以在cd-rw.org得到Nero AAC/MP4外掛。
  • RealPlayer 10 黃金版和Real Producer 10同樣也包括基於Coding Technologies執行的HE/LC AAC編碼器。RP10 黃金版現在預設編碼AAC成M4A,並且是一種極好的免費AAC編碼解決方案。用Real Producer編碼HE AAC,你也需要Helix的其他外掛包。

GUIs/前端:

  • BeSweet:由於DSPguru的貢獻,可以通過BeSweet編碼Nero AAC。有兩個非常優秀的GUIs,附帶Doom9指南的OagMachine和BeSweetGUI。注意:BeSweet使用者需要確定使用更新的正式版本,更多資訊請參閱Q#19。
  • foobar2000:使用nero aac編碼/解碼器外掛(foo_nero.dll)你可以直接轉換任何音訊到Nero LC/HE AAC,同樣有可以參考的指南。注意為了diskwriter外掛你需要foobar特別版。用diskwriter外掛和命令列的FAAC(可以從rarewares得到)Foobar也同樣可以編碼成FAAC aac。
  • HeadAC3he的新版本也可以從AC3, WAV或是任何其他HeadAC3he支援的輸入格式編碼到FAAC aac。
  • winLame:DeXt製作的multi-tool GUI,現在支援通過FAAC編碼AAC。
    其他平臺下(Linux, MAC OS 10, 其他等等)編碼:

FAAC和FAAD是GPL(GNU通用公共許可證)軟體,可以在OS X, Linux和絕大部分Unixes下編譯。FAAC編碼也在avidemux, mencoder, gstreamer和其他編碼工具下實現。大多數主要的多媒體Distributions產品都包括這些。

普通的FAAC編譯說明如下:(摘錄於FAAC文件)

  1. 確保你已經安裝autoconf, automake和libtool。為了支援mp4, libmp4v2必須也安裝(包括在較老的faad2源中,或是新的FAAC cvs(Concurrent Version System/版本控制系統)原始碼)。
  2. 解壓源文件:tar xvzf faac-x.xx.tar.gz
  3. dir(顯示列表) cd到FAAC原始碼
  4. Run: # ./bootstrap
  5. # ./configure
  6. # make
  7. # make install

Binary版也同樣可用於幾個平臺: Debian RPMs

四、AAC問答

1、有沒有可能在轉換AC3/DTS到AAC後還能保留5.1聲道呢?

可以,用Oagmachine/BeSweetGuI就可以實現。Doom9有篇相關的教材。不過,記住AC3和DTS都是有損音訊格式,任何在它們基礎上的轉碼行為都將導致更嚴重的音質損失。當音訊轉碼時並且需要大幅度減小檔案體積時,HE-AAC推薦使用。同樣,音訊轉換還可以通過graphedit搭配3ivx濾鏡套件(AC3->AC3 parser->AC3 filter->3ivx audio encoder->3ivx media muxer->MP4)或者foobar來實現。需要更多AC3和DTS的轉碼的資訊請見這兩種編碼各自的FAQ部分。

2、目前有沒有一個開源的AAC編/解碼器存在呢?

FAAC和FAAD2(僅LC)就是開源的AAC編解碼器。CoreAAC Directshow filter,winamp外掛和許多AAC解碼器其實都是源於FAAD2,都具有解碼HE-AAC和LC的能力。官方FAAC/FAAD2站點如下:www.audiocoding.com。

3、我怎麼混合AAC到AVI/OGM/MKV/MP4?

AVI:AVI MUX GUI是僅有的允許混合AAC到AVI的應用軟體。注意不推薦AVI作為AAC的容器格式,推薦現代的容器格式如(AAC專門容器格式)。
OGM:Ogg Mux Nic能直接混合LC AAC到OGM。對於HE-AAC,請使用3ivx濾鏡套件與Graphedit。
MKV:MKVtoolnix和AVI MUX GUI都能混合AAC到Matroska。
MP4:3ivx濾鏡套件與Graphedit。
Nero Recode2能自動直接把DVD轉換帶有NeroDigital或HE AAC的MP4。其他一些支援MP4混合的軟體包括Ivan&Menno和mp4UI。更多關於MP4(MPEG-4)容器格式的資訊請看MP4 FAQ。

注意當從raw .aac流混合HE-AAC時,你必須在MKVtoolnix和AVImux GUI中讓muxer是“AAC is SBR”。當混合.mp4時,SBR自動被偵測。

4、關於AAC回放我需要什麼?

下載並安裝CoreAAC DirectShow filter或3ivx audio decoder(3ivx codec內有)都能在directshow播放器傑出地回放(LC和HE都可)。 關於最新的CoreAAC濾鏡與winamp/foobar外掛, 請看在HydrogenAudio.org中john33的帖子。

注意對於MP4流,在directshow播放器上回放3ivx或其他的MPEG-4分離濾鏡(splitter)是必需的。對於raw AAC流,rarewares上的AACparser濾鏡也是必需的。當muxing成OGM或Matroska時,適當的分離濾鏡)也是必需的。更多資訊請參看New Container Formats 版塊的FAQs。

5、關於在linux / Unix下回放AAC有什麼要求?

任何最新版及相關版的mplayer包括了對MP4格式與用FAAD解碼AAC的支援。FAAD已經包含在mplayer的原始碼中,而且無需另外的庫檔案或編譯。

VLC支援AAC當然MP4也是,但如果你的VLC是原始碼包版的你就需要安裝FAAD作為AAC支援。通常你在編譯VLC的原始碼前需要檢查VLC需要的庫檔案目錄。

MPEG-4標準定義的音訊壓縮格式 AAC 詳解(4)
2009-02-01 www.av110.net / 整理 點選:7295次 標籤:MPEG-4 AAC
6、MPEG-4與MPEG-2 AAC的不同點是什麼?

事實上MPEG-4與MPEG-2 AAC流除了在檔案頭(header)上並沒有什麼區別。但是一些應用軟體象QuickTime並不承認MPEG-2 AAC。使用Ivan & Menno改變檔案頭。別的程式象Nic的AAC Patch或foobar2000都可修正檔案頭。

7、.AAC,.MP4,*.M4A(audio/x-m4p AAC audio(受保護))之間的區別是什麼?

AAC檔案通常包含帶ADTS檔案頭的AAC或者原始(raw)AAC資料流。Raw AAC若沒有編碼其中幾條資料流是不能被處理的。MP4,在另一層面,是一種包含AAC流和其他許多符合MPEG4標準的東西的容器格式。這兩種資料格式是很不同的,因此你不能給它們相互重新命名,它們只是被混合入容器格式中或者被分離出。混合AAC到MP4和其分離Ivan & Menno可以完成。 M4A是MP4容器中常見的音軌,其實是我們自己重新命名字尾的。Itunes, Winamp5和Realplayer金版現在預設都編碼成M4A。注意M4A和MP4檔案能通過簡單重新命名相互混淆,但它們都是同一種容器格式的擴充套件。

注意“Export ISO 13818-7 Stream”選項在Nero編碼器產生的是帶ADTS檔案頭的*.AAC檔案。再次提醒這不是原始AAC資料流,Ivan & Menno能轉換成原始aac。

更多關於MP4容器格式的資訊請到恰當的FAQ尋找。

8、我怎樣可以分割合併AAC檔案?

AAC在MP4中:
MP4Box可以被用來分割合併所有包括這些AAC音訊的MP4檔案。完整資訊可參閱此帖。

有ACC的MP4也可以直接被QuickTime專業版編輯。

原始AAC流:

原始AAC流(*.aac) 可以使用BeSplit分割合併。

分割: besplit -core( -input in.aac -prefix out -type aac -ending ) -split( 0.0 x.x )

這個命令可以剪下in.aac成兩部分:0.0 秒到x.x 秒和 x.x 秒到檔案結尾(-ending)。

合併:
首先產生一個列表檔案,一個文字檔案用分隔線把每個要被合併的檔案列於表上。然後儲存成join.lst並且使用BeSplit:

besplit -core( -input join.lst -prefix out -type aac -join )

也可以通過命令提示符來合併AAC流(*.aac) :
copy /b first.aac + second.aac joined.aac

9、AAC音訊格式的優缺點各是什麼?

優點:
低位元率(具有與其他編碼可比的音質)和較小檔案尺寸,要求使用SBR技術。
多聲道(可以實現直到48 條全頻寬聲道)
AAC是MPEG-4標準的正式音訊格式,並且未來硬體支援也是很有希望的。

缺點:
暫時沒有單獨的回放AAC可用。
AAC是重大的專利技術。

10、有沒有可能通過S/PDIF端回放AAC?

這是可行的,雖然並不是所有的硬體上都可以實現。只有一部分硬體支援解碼AAC,且沒有一個DirectShow濾鏡有能力實現AAC的訊號pass-through。當然,這在將來一定會實現的。點選這裡和那裡閱讀更多的S/PDIF和AAC的硬體支援資訊。

然而,在通過S/PDIF回放AAC成為可行之前,有不少DirectShow的濾鏡可以通過S/PDIF進行實時的6聲道AAC=>AC3的轉換,Haaan的Dolby Out DS濾鏡,1.x版本的AC3Filter都可以實現。雖然,理論上來說,實時轉錄過程會有一定程度的音質損失,但使用640kbps全碼仍然會得到完美的監聽效果和最小的音質損失。

11、5.1 LC AAC和5.1HE AAC各聲道的位元速率是如何分配的?怎樣的位元速率設定才能使5.1的AAC各聲道均分為128kbps?

為了使每個聲道的位元速率相同,我們必須新增2x(立體聲的位元速率)(FL(左前置)、FR(右前置)、RL(左後置)& RR(右後置))+1x(單聲道的位元速率(Centre))+一點附加的位元速率給低音炮。這樣的話,為了達到各聲道位元速率統一,總位元速率要等於立體聲位元速率的2.5至3倍。所以,為了得到每聲道128kbps:128kbps*2.5=320kbps。對於LC AAC而言,320kbps是一個高質量的位元速率。然而,考慮到AAC的效率和聲道聯結方式,128kbps的HE-AAC同樣可以提供很不錯的音質及5.1聲道。

12、nero使用的HE-AAC的位元速率是多少?

96kbps或更低的CBR位元速率時使用HE-AAC;流媒體或更低的VBR位元速率使用HE-AAC。如果輸入源是5.1的aiff,則nero可以生成的128kbps的HE-AAC。

13、我在使用BSN/Oagmachine編碼AAC的時候如何設定增益調節(gain)?

雖然BeSweet/Bsn有Hybrid(混合)增益調節的元件,但現在沒有一個Directshow濾鏡有能力處理Hybrid增益調節的資訊。所以,現在我們不推薦此類設定,使用標準化或前期增益調節來代替吧。

14、有沒有可以被VirtualDub呼叫的AAC ACM(Audio Compression Manager/聲音壓縮管理器)編碼嗎?

由於目前AAC與AVI之間並未完全相容,所以還沒有ACM AAC編碼。在FAAC開發過程中曾經試圖做過類似的努力卻並未成功。

15、我已經安裝了所有的BeSweet和Bsn檔案,但Besweet/Nero並沒有開始編碼,請幫幫我?

要通過BeSweet/BSN/Oagmachine/BeSweet GUI來編碼Nero AAC,那麼有三個dll動態連結檔案是必須的:’aac.dll’, ‘aacenc32.dll’和’NeroIPP.dll’。這三個dll要放入BeSweet資料夾。從60023版開始,aac.dll和aacenc32.dll要檢查登錄檔中是否有NeroIPP的dll,所以系統中必須要安裝Nero Ultra Edition或NeroMix。

16、在用OagMachine/BeSweet編碼時我看不到Nero GUI編碼視窗,要如何才能啟用它?

Oagmachine裡,在AAC編碼選項下檢查“show configuration dialogue”。如果你使用的是命令列模式,就請在命令列裡的’-bsn’後加上’-config’即可。

17、為什麼我回放用Oagmachine/BeSweet GUI編碼的48Khz的AC3/DTS檔案時聲音會變慢?

那可能你使用的時老版本的BeSweet,從bsn.dll v0.21以後(與BeSweet捆綁)這個bug就已經被修復。請查一下你BeSweet檔案的記錄檔案,確定你使用的是bsn.dll v0.21。
老版本更多的bug資訊:
Nero編碼器是通過位元率、配置和聲道數來準確判定相應的取樣率的。當你使用的bsn版本早於0.21時,nero內部的重取樣功能預設不被開啟,從而你必須在Nero編碼器中手動修改取樣率。這裡有一篇由bond編寫的關於如何決定正確的取樣率及相關大量解釋的文章。

18、如何我才能使自己編碼出來的AAC是HE而非LC?

讓CoreAAC DirectShow filter勾上“AAC+SBR”功能選項。Foobar2000裡也同樣如此。3ivx音訊解碼設定裡選擇的是HE-AAC。

19、在使用600X nero外掛時,Oagmachine/BeSweetGUI裡的哪個選項是負責控制多聲道的?

在6.0011和它之前的老版本里請使用-6chold選項,而6.0011之後的請用-6chnew。

20、我用Nero編碼的HE-AAC裡有爆音存在,我做錯了什麼嗎?

在Nero編碼GUI裡開啟PNS選項後就會產生這個問題,去掉這個PNS後就可以解決。