M4A是封裝於MPEG4,使用AAC(進階音訊編碼, Advanced Audio Coding)格式壓縮的音訊檔案。若拿相同大小的MP3和AAC格式的音樂檔案來比較,AAC的音質通常會比MP3還要來得好。在低位元率下,HE-AAC和HE-AACv2的音質遠勝於MP3。AAC的取樣精度最高可到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的輸出品質可以直接從音樂檔案的頻譜看出來,可以參閱這篇文章來學習如何判斷音樂檔案的音質。

如果可以的話,筆者比較建議使用iTunes自帶的AAC編碼器,透過QAAC來操作,可以參考這篇文章(尚未提供)。

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

AAC、HE-AAC、HE-AACv2、M4A、MP4到底有什麼不一樣?

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

安裝FDK AAC

基於Debian的Linux發行版執行以下指令來安裝:

sudo apt install fdkaac

基於紅帽的Linux發行版要加入RPM Fusion的Nonfree軟體庫,然後執行以下指令來安裝:

sudo dnf install fdkaac

FDK AAC 使用方法

fdkaac自帶文件

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

fdkaac --help

linux-fdkaac

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

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

根據fdkaac自帶的文件,我們可以知道fdkaac支援八種AAC規格(Profile),分別是MPEG-4 AAC LC、MPEG-4 HE-AAC、MPEG-4 HE-AAC v2、MPEG-4 AAC LD、MPEG-4 AAC ELD、MPEG-2 AAC LC、MPEG-2 HE-AAC、MPEG-2 HE-AAC v2。在這篇文章中我們是要轉出M4A格式的檔案,因此是使用MPEG4的封裝方式。MPEG4的AAC也分為好幾種,一般我們所說的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檔案來使用不同的-p-m參數值實際轉檔測試。

先來看看WAV檔的頻譜:

linux-lame

-p 2 -m 5

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

將測試用的WAV檔使用-p 2 -m 5轉換後,得到的音樂檔的變動位元率平均為203kbps,檔案大小約為原先的14%,頻譜如下:

linux-fdkaac

從上圖可以發現將WAV轉換成-p 2 -m 5的M4A後,19.7kHz以上的頻率完全被過濾掉,19.7kHz以下的頻譜有明顯的改變。但是音質和原始WAV檔案並沒有太大差異。

-p 2 -m 4

將測試用的WAV檔使用-p 2 -m 4轉換後,得到的音樂檔的變動位元率平均為127kbps,檔案大小約為原先的9%,頻譜如下:

linux-fdkaac

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

-p 2 -m 3

將測試用的WAV檔使用-p 2 -m 3轉換後,得到的音樂檔的變動位元率平均為92kbps,檔案大小約為原先的7%,頻譜如下:

linux-fdkaac

從上圖可以發現將WAV轉換成-p 2 -m 3的M4A後,16kHz以上的頻率完全被過濾掉,16kHz以下的頻譜有明顯的改變,音質受到很大的影響。

-p 2 -m 2

將測試用的WAV檔使用-p 2 -m 2轉換後,得到的音樂檔的變動位元率平均為79kbps,檔案大小約為原先的6%,頻譜如下:

linux-fdkaac

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

-p 2 -m 1

將測試用的WAV檔使用-p 2 -m 1轉換後,得到的音樂檔的變動位元率平均為82kbps(比-p 2 -m 2還高,很奇怪),檔案大小約為原先的6%,頻譜如下:

linux-fdkaac

從上圖可以發現將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轉換後,得到的音樂檔的變動位元率平均為116kbps,檔案大小約為原先的8%,頻譜如下:

linux-fdkaac

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

-p 5 -m 4

將測試用的WAV檔使用-p 5 -m 4轉換後,得到的音樂檔的變動位元率平均為82kbps,檔案大小約為原先的6%,頻譜如下:

linux-fdkaac

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

-p 5 -m 3

將測試用的WAV檔使用-p 5 -m 3轉換後,得到的音樂檔的變動位元率平均為61kbps,檔案大小約為原先的4%,頻譜如下:

linux-fdkaac

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

-p 5 -m 2

將測試用的WAV檔使用-p 5 -m 2轉換後,得到的音樂檔的變動位元率平均為58kbps,檔案大小約為原先的4%,頻譜如下:

linux-fdkaac

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

-p 5 -m 1

將測試用的WAV檔使用-p 5 -m 1轉換後,得到的音樂檔的變動位元率平均為47kbps,檔案大小約為原先的3%,頻譜如下:

linux-fdkaac

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

-p 29 -m 5

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

將測試用的WAV檔使用-p 29 -m 5轉換後,得到的音樂檔的變動位元率平均為67kbps,檔案大小約為原先的5%,頻譜如下:

linux-fdkaac

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

-p 29 -m 4

將測試用的WAV檔使用-p 29 -m 4轉換後,得到的音樂檔的變動位元率平均為51kbps,檔案大小約為原先的4%,頻譜如下:

linux-fdkaac

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

-p 29 -m 3

將測試用的WAV檔使用-p 29 -m 3轉換後,得到的音樂檔的變動位元率平均為38kbps,檔案大小約為原先的3%,頻譜如下:

linux-fdkaac

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

-p 29 -m 2

將測試用的WAV檔使用-p 29 -m 2轉換後,得到的音樂檔的變動位元率平均為34kbps,檔案大小約為原先的2%,頻譜如下:

linux-fdkaac

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

-p 29 -m 1

將測試用的WAV檔使用-p 29 -m 1轉換後,得到的音樂檔的變動位元率平均為34kbps(跟-p 29 -m 2差一點點),檔案大小約為原先的2%,頻譜如下:

linux-fdkaac

從上圖可以發現將WAV轉換成-p 29 -m 1的M4A後,16.4kHz以上的頻率完全被過濾掉,6.5kHz到16.4kHz的頻譜形狀改變劇烈,在6.5kHz以下的頻率改變也很明顯,頻譜和-p 29 -m 2轉出來的結果差異不大,但因為缺了中高頻訊號,所以音質聽起來很差。

使用-p-m參數來轉檔

以上測了AAC-LC、HE-AAC、HE-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套件。

基於Debian的Linux發行版可以使用以下指令來安裝:

sudo apt install flac

基於紅帽的Linux發行版可以使用以下指令來安裝:

sudo dnf install flac

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

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

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

APE(MAC)轉M4A

APE(或是MAC)為Monkey's Audio的格式,在Linux上如果要進行解碼,得使用以下的非官方套件(基於Debian的Linux發行版):

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

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

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

Ogg轉M4A

必須要先有vorbis-tools套件。

基於Debian的Linux發行版可以使用以下指令來安裝:

sudo apt install vorbis-tools

基於紅帽的Linux發行版可以使用以下指令來安裝:

sudo dnf install vorbis-tools

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

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

Opus轉M4A

必須要先有opus-tools套件。

基於Debian的Linux發行版執行以下指令來安裝:

sudo apt install opus-tools

基於紅帽的Linux發行版執行以下指令來安裝:

sudo dnf install opus-tools

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

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

MP3轉M4A

必須要先有lame套件。

基於Debian的Linux發行版執行以下指令來安裝:

sudo apt install lame

基於紅帽的Linux發行版執行以下指令來安裝:

sudo dnf install lame

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

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