在Linux上使用FDK AAC將音樂轉成M4A(AAC、HE-AAC、HE-AACv2)格式


M4A是封裝於MPEG4,使用AAC(進階音訊編碼, Advanced Audio Coding)格式壓縮音訊檔案。若拿相同大小的MP3AAC格式的音樂檔案來比較,AAC音質通常會比MP3還要來得好。在低位元率下,HE-AACHE-AACv2音質遠勝於MP3AAC取樣精度最高可到32位元,MP3則只有16位元;AAC取樣頻率最高可以達到96kHz,MP3則只有48kHz。因此現在愈來愈多做線上音樂的廠商,直接將音樂專輯的母片轉成AAC格式的M4A檔案來賣,有的音質甚至還勝於直接從CD轉出來16位元、44.1kHz的WAV。在Linux系統上如果要將音樂檔案轉成M4A格式,雖然可以使用FAAC來輕易達成,但FAAC只支援AAC-LC,若要使用HE-AAC或是HE-AACv2,可以使用FDK AAC來進行編碼。

FDK AAC的輸出品質可以直接從音樂檔案的頻譜看出來,可以參閱這篇文章來學習如何判斷音樂檔案的音質

如果只是要轉成AAC而非HE-AAC或是HE-AACv2格式的話,筆者比較建議使用FAAC,可參考這篇文章

在繼續瞭解FDK AAC之前,您必須要先知道FDK AAC「只是」AAC編碼器,它不能夠將AAC格式的音樂檔案轉換成其他的格式。而且,在一般情形下(無自帶額外解碼器),FDK AAC只能夠讀取RAW PCM(WAV)格式,如果要將其它格式的檔案轉成M4A(例如FLAC轉成M4A),必須配合其它工具一起使用才行!

AACHE-AACHE-AACv2M4AMP4到底有什麼不一樣?

AAC是編碼格式,屬於MPEG2的技術。HE-AAC(High-Efficiency AAC)是AAC加上SBR(Spectral Band Replication),用於低位元率的編碼格式,HE-AACv2AAC加上SBRPS(Parametric Stereo),用於更低位元率的編碼格式,兩者都屬於MPEG4的技術。M4AMP4都是MPEG4標準下的檔案封裝格式,MP4包含了視訊與音訊,M4A則只有音訊而已。MPEG2AAC若要用在MPEG4,則需要封裝成MPEG4AAC,才能夠在MP4M4A等檔案格式上使用。

以下均以Linux Mint為例。

安裝FDK AAC

參考以下文章連結,安裝FDK AAC

https://magiclen.org/linux-fdk-aac/

FDK AAC 使用方法

fdkaac自帶文件

安裝好FDK AAC(libfdk-aacfdkaac)後,在終端機下輸入以下指令,可以查看fdkaac的用法:

fdkaac --help

linux-fdkaac-2

從上圖中可以看到fdkaac可以設定的參數十分多樣,但其實我們只要會使用「-p」和「-m」參數就已經足夠應付大部分的狀況。

fdkaac快速調整聲音輸出格式和品質(-p和-m參數)

根據fdkaac自帶的文件,我們可以知道fdkaac支援八種AAC規格(Profile),分別是MPEG-4 AAC LCMPEG-4 HE-AACMPEG-4 HE-AAC v2、MPEG-4 AAC LD、MPEG-4 AAC ELD、MPEG-2 AAC LCMPEG-2 HE-AACMPEG-2 HE-AAC v2。在這篇文章中我們是要轉出M4A格式的檔案,因此是使用MPEG4的封裝方式。MPEG4AAC也分為好幾種,一般我們所說的AAC,其實就是指AAC LC(低複雜度, Low Complexity),其餘的都是後來AAC的變化版本。HE(高效能, High-Efficiency)可在低位元率下保持原音質,節省許多檔案佔用空間;LD(低延遲, Low Delay)和ELD(增強低延遲, Enhanced Low Delay)適合用於即時(Real-Time)的網路語音傳輸。調整fdkaac輸出的AAC規格,可使用「-p」參數,在本篇文章中將會使用到2(MPEG-4 AAC LC)、5(MPEG-4 HE-AAC)和29(MPEG-4 HE-AAC v2)。選定AAC的輸出規格後,可以使用「-m」參數來調整輸出的採樣率、變動位元率、頻寬、通道,這個值的範圍是「1~5」,愈大音質愈高。以下將會以擁有高於CD音質WAV檔案(16bit, 48000Hz, 約41.6MB)來使用不同的「-p」和「-m」參數值實際轉檔測試。

先來看看WAV檔的頻譜:

linux-fdkaac-2

-p 2 -m 5

設定「-p 2 -m 5」,可以輸出fdkaac能夠支援AAC變動位元率的最高音質

將測試用的WAV檔用「-p 2 -m 5」轉換後,得到大小約為7.0MB的M4A檔案,變動位元率平均為258kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 2 -m 5」的M4A後,頻譜在20.5kHz以上有了明顯的改變,在20.5kHz以下的改變則不明顯,音質和原始WAV檔案無異,檔案大小卻小了將近六倍!

-p 2 -m 4

將測試用的WAV檔用「-p 2 -m 4」轉換後,得到大小約為3.8MB的M4A檔案,變動位元率平均為138kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 2 -m 4」的M4A後,15.6kHz以上的頻率完全被過濾掉,在15.6kHz以下的頻率也有些微的改變,音質已經受到很大的影響。

-p 2 -m 3

將測試用的WAV檔用「-p 2 -m 3」轉換後,得到大小約為3.2MB的M4A檔案,變動位元率平均為116kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 2 -m 3」的M4A後,14.4kHz以上的頻率完全被過濾掉,在14.4kHz以下的頻率也有些微的改變,音質受到很大的影響。

-p 2 -m 2

將測試用的WAV檔用「-p 2 -m 2」轉換後,得到大小約為2.8MB的M4A檔案,變動位元率平均為102kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 2 -m 2」的M4A後,13.2kHz以上的頻率完全被過濾掉,在13.2kHz以下的頻率也有些微的改變,音質受到非常大的影響。

-p 2 -m 1

將測試用的WAV檔用「-p 2 -m 1」轉換後,得到大小約為2.6MB的M4A檔案,變動位元率平均為95kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 2 -m 1」的M4A後,13.2kHz以上的頻率完全被過濾掉,在13.2kHz以下的頻率有了明顯的改變,音質受到非常大的影響。

-p 5 -m 5

設定「-p 5 -m 5」,可以輸出fdkaac能夠支援HE-AAC變動位元率的最高音質

將測試用的WAV檔用「-p 5 -m 5」轉換後,得到大小約為3.3MB的M4A檔案,變動位元率平均為120kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 5 -m 5」的M4A後,22.2kHz以上的頻率完全被過濾掉,10kHz到22.2kHz的頻譜形狀改變劇烈,在10kHz以下的頻率改變則不明顯。音質和原始WAV檔案相比雖有很大的差異,但也還可以接受,檔案大小卻小了十二到十三倍!

-p 5 -m 4

將測試用的WAV檔用「-p 5 -m 4」轉換後,得到大小約為2.6MB的M4A檔案,變動位元率平均為95kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 5 -m 4」的M4A後,22.2kHz以上的頻率完全被過濾掉,10kHz到22.2kHz的頻譜形狀改變劇烈,在10kHz以下的頻率改變則不明顯,頻譜和「-p 5 -m 5」轉出來的結果差異不大。音質和原始WAV檔案相比雖有很大的差異,但也還可以接受,檔案大小卻小了十六倍!

-p 5 -m 3

將測試用的WAV檔用「-p 5 -m 3」轉換後,得到大小約為2.3MB的M4A檔案,變動位元率平均為84kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 5 -m 3」的M4A後,22.2kHz以上的頻率完全被過濾掉,10kHz到22.2kHz的頻譜形狀改變劇烈,在10kHz以下的頻率改變則不明顯,頻譜和「-p 5 -m 3」轉出來的結果差異不大。音質和原始WAV檔案相比雖有很大的差異,但也還可以接受,檔案大小卻小了十八倍到十九倍!

-p 5 -m 2

將測試用的WAV檔用「-p 5 -m 2」轉換後,得到大小約為2.1MB的M4A檔案,變動位元率平均為78kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 5 -m 2」的M4A後,22.2kHz以上的頻率完全被過濾掉,10kHz到22.2kHz的頻譜形狀改變劇烈,在10kHz以下的頻率改變則不明顯,頻譜和「-p 5 -m 2」轉出來的結果差異不大。音質和原始WAV檔案相比雖有很大的差異,但也還可以接受,檔案大小卻小了十九倍到二十倍!

-p 5 -m 1

將測試用的WAV檔用「-p 5 -m 1」轉換後,得到大小約為1.4MB的M4A檔案,變動位元率平均為51kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 5 -m 1」的M4A後,17kHz以上的頻率完全被過濾掉,6kHz到17kHz的頻譜形狀改變劇烈,在6kHz以下的頻率改變則不明顯。音質聽起來很差。

-p 29 -m 5

設定「-p 29 -m 5」,可以輸出fdkaac能夠支援HE-AACv2變動位元率的最高音質

將測試用的WAV檔用「-p 29 -m 5」轉換後,得到大小約為1.7MB的M4A檔案,變動位元率平均為62kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 29 -m 5」的M4A後,20.3kHz以上的頻率完全被過濾掉,8.7kHz到20.3kHz的頻譜形狀改變劇烈,在8.7kHz以下的頻率改變也很明顯。音質和原始WAV檔案相比雖有很大的差異,但和「-p 5 -m 1」比起來卻好上不少,不仔細聽的話也還可以接受。檔案大小小了二十四到二十五倍!

-p 29 -m 4

將測試用的WAV檔用「-p 29 -m 4」轉換後,得到大小約為1.4MB的M4A檔案,變動位元率平均為50kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 29 -m 4」的M4A後,20.3kHz以上的頻率完全被過濾掉,8.7kHz到20.3kHz的頻譜形狀改變劇烈,在8.7kHz以下的頻率改變也很明顯,頻譜和「-p 29 -m 5」轉出來的結果差異不大。音質和原始WAV檔案相比雖有很大的差異,但和「-p 5 -m 1」比起來卻好上不少,不仔細聽的話也還可以接受。檔案大小小了將近三十倍!

-p 29 -m 3

將測試用的WAV檔用「-p 29 -m 3」轉換後,得到大小約為1.3MB的M4A檔案,變動位元率平均為45kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 29 -m 3」的M4A後,20.3kHz以上的頻率完全被過濾掉,8.7kHz到20.3kHz的頻譜形狀改變劇烈,在8.7kHz以下的頻率改變也很明顯,頻譜和「-p 29 -m 5」轉出來的結果差異不大。音質和原始WAV檔案相比雖有很大的差異,但和「-p 5 -m 1」比起來卻好上不少,不仔細聽的話也還可以接受。檔案大小小了三十二倍!

-p 29 -m 2

將測試用的WAV檔用「-p 29 -m 2」轉換後,得到大小約為1.2MB的M4A檔案,變動位元率平均為43kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 29 -m 2」的M4A後,20.3kHz以上的頻率完全被過濾掉,8.7kHz到20.3kHz的頻譜形狀改變劇烈,在8.7kHz以下的頻率改變也很明顯,頻譜和「-p 29 -m 5」轉出來的結果差異不大。音質和原始WAV檔案相比雖有很大的差異,但和「-p 5 -m 1」比起來卻好上不少,不仔細聽的話也還可以接受。檔案大小小了三十四到三十五倍!

-p 29 -m 1

將測試用的WAV檔用「-p 29 -m 1」轉換後,得到大小約為985KB的M4A檔案,變動位元率平均為35kbps,頻譜如下:

linux-fdkaac-2

從上圖可以發現將WAV轉換成「-p 29 -m 2」的M4A後,18kHz以上的頻率完全被過濾掉,7.3kHz到18kHz的頻譜形狀改變劇烈,在7.3kHz以下的頻率改變也很明顯,頻譜和「-p 29 -m 5」轉出來的結果差異很大,音質聽起來很差。

使用-p和-m參數來轉檔

以上測了AAC-LCHE-AACHE-AACv2三種不同的AAC規格在不同的「-m」參數值下的輸出結果。在音質的部份,自然還是位元率高出許多的「-p 2 -m 5」參數最接近原始音質,聽起來和原始WAV沒有差異。但將其降一級,使用「-p 2 -m 4」參數輸出之後,AAC-LC音質表現就不如「-p 5 -m 2」的HE-AAC了。用「-p 29 -m 5」輸出的HE-AACv2音質比「-p 5 -m 2」的HE-AAC還來的差一點,但和「-p 29 -m 5」音質接近的「-p 29 -m 2」,其檔案大小又小了「-p 5 -m 2」的HE-AAC將近兩倍。若是真的很需要極致地減少檔案佔用空間,HE-AACv2算是不錯的編碼格式。所以說,如果是要收藏音樂的話,「-p 2 -m 5」是首選,它可以省下十二倍到十三倍的空間,又可以保留原始音質。如果有檔案傳送需求的話,「-p 5 -m 2」是首選,在保有可接受的音質下,可以省下十九倍到二十倍的空間。如果有儲存空間壓力的話,「-p 29 -m 2」是首選,可以在保持著還可以聽個大概的條件下,讓檔案大小減少三十四到三十五倍。

如果我們要使用「-p 5 -m 2」進行轉檔,可以使用以下指令:

fdkaac -p 5 -m 2 -o 輸出檔案路徑 輸入檔案路徑

fdkaac與其他解碼器合作

由於fdkaac所支援的輸入格式有限,因此常會與其他解碼器一同工作,利用外部的解碼器將特殊格式的音樂檔進行解碼,再將解碼結果傳給fdkaac進行格式轉換的工作。在終端機預設的bash script下可以使用「|」字元將兩個指令隔開在同一行中。字元「|」左邊的指令輸出到標準輸出串流(stdout)中的資料,會成為字元「|」右邊指令的標準輸入串流(stdin)。使用「-」字元可以指定要使用標準輸入/輸出串流的參數位置。

FLAC轉M4A

必須要先有flac套件,可以使用以下指令來安裝:

sudo apt-get install flac

使用以下指令可以將FLAC格式的音樂檔案轉成M4A音樂檔

flac -c -d 輸入檔案路徑 | fdkaac -p 5 -m 2 -o 輸出檔案路徑 -

flac的-c參數表示將輸出改成stdout(同-o -),-d參數表示要進行解碼(decode)。

APE(MAC)轉M4A

APE(或是MAC)為Monkey's Audio的格式,由於官方政策的關係,在Linux上如果要進行解碼,只能使用以下的非官方套件:

32位元版本64位元版本

使用以下指令可以將APE(或是MAC)格式的音樂檔案轉成M4A音樂檔

mac 輸入檔案路徑 - -d | fdkaac -p 5 -m 2 -o 輸出檔案路徑 -

mac的-d參數表示要進行解碼(decode)。

Ogg轉M4A

必須要先有vorbis-tools套件,可以使用以下指令來安裝:

sudo apt-get install vorbis-tools

使用以下指令可以將Ogg格式的音樂檔案轉成M4A音樂檔

oggdec 輸入檔案路徑 -o "./oggtemp.wav" ; fdkaac -p 5 -m 2 -o 輸出檔案路徑 "./oggtemp.wav" ; rm "./oggtemp.wav"

Opus轉M4A

必須要先有opus-tools套件,可以使用以下指令來安裝:

sudo apt-get install opus-tools

使用以下指令可以將Opus格式的音樂檔案轉成M4A音樂檔

opusdec --force-wav 輸入檔案路徑 - | fdkaac -p 5 -m 2 -o 輸出檔案路徑 -

MP3轉M4A

這很明顯是用音質較差的聲音來源(MP3)包裝成看起來音質較高的檔案格式(M4A),沒有意義。

關於作者

Magic Len

各位好,我是Magic Len,是這網站的管理員。我是台灣台中大肚山上人,畢業於台中高工資訊科和台灣科技大學資訊工程系,曾在桃機航警局服役。我熱愛自然也熱愛科學,喜歡和別人分享自己的知識與經驗。如果你有興趣認識我,可以加我的Facebook,並且請註明是從MagicLen來的。

相關文章