FFmpeg全名是Fast Forward MPEG(Moving Picture Experts Group),為開源的影音多媒體處理框架,可以進行影音的解碼、編碼、編碼轉換、混合、抽取、串流和濾鏡,無論影音格式是從哪個地方出來的,從過去到現在的影音格式它幾乎都能夠支援。當然,它也可以利用FDK AAC這款高品質的開源AAC編碼器來進行AAC和M4A的轉檔。



FDK AAC的fdkaac指令工具常用的轉檔參數不外乎就是控制音質的-m以及控制AAC Profile(例如AAC-LC、HE-AAC、HE-AACv2等)的-p-m後面接的數值範圍在1 ~ 5之間,數值愈大音質愈高。-p後面接的數值如果是2,表示要使用AAC-LC,此為預設值;5表示要使用HE-AAC;29表示要使用HE-AACv2。

有關於fdkaac的詳細用法可以參考這篇文章:

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

FDK AAC本身的指令工具固然好用,但它所支援的輸入格式有限。如果要更方便使用fdkaac來進行AAC/M4A轉檔,甚至是直接將影片中的音軌轉成AAC格式的話,就要透過FFmpeg來完成了。不過FFmpeg有著自己的一套複雜的命令列介面(CLI),與fdkaac的用法並不相同。

fdkaac-m參數會對應到FFmpeg的-vbr參數,且FFmpeg要設定AAC的Profile的話得使用-profile:a參數。-profile:a參數後不是接數值,是直接輸入要使用的Profile名稱,例如要用AAC-LC就要輸入aac_low,不過這可以省略,因為AAC-LC本就是預設的Profile;用HE-AAC要輸入aac_he;用HE-AACv2要輸入aac_he_v2

fdkaac-m參數,即FFmpeg的-vbr參數,它會直接影響到輸出聲音訊號的位元率,下表是44.1kHz雙聲道時的位元率,參考就好,畢竟此處是在介紹VBR(變動位元率)的編碼方式,實際編碼結果會跟輸入的聲音訊號有很大的關聯,尤其是使用HE-AAC或是HE-AACv2時候通常位元率會低很多。

FFmpeg 參數 位元率
-vbr 1 ~40 kbps
-vbr 2 ~64 kbps
-vbr 3 ~96 kbps
-vbr 4 ~128 kbps
-vbr 5 ~192 kbps

透過FFmpeg輸出音質最高的AAC-LC的指令如下:

ffmpeg -i 輸入的影音檔案路徑 -acodec libfdk_aac -vbr 5 輸出的影音檔案路徑

透過FFmpeg輸出音質最高的HE-AAC的指令如下:

ffmpeg -i 輸入的影音檔案路徑 -acodec libfdk_aac -profile:a aac_he -vbr 5 輸出的影音檔案路徑

透過FFmpeg輸出音質最高的HE-AACv2的指令如下:

ffmpeg -i 輸入的影音檔案路徑 -acodec libfdk_aac -profile:a aac_he_v2 -vbr 5 輸出的影音檔案路徑

CBR(固定位元率)編碼

fdkaac指令工具雖有支援CBR編碼方式,但一般情況下我們不太會用CBR的方式進行AAC編碼,除非我們想要利用以下公式來預估編碼後的AAC或是M4A檔案的大小:

#{{{
{ \text{固定位元率(Kbps, Kb/s)} \times \text{時間(s, 秒)} \over \text{8(b/B)} } = \text{AAC或是M4A檔案的大小(KB)}
}}}#

使用FFmpeg來操作FDK AAC編碼器時,若要使用CBR編碼方式,可以直接傳入-b:a(-ab)參數並在其後接上想要使用的固定位元率即可。例如以下指令可以輸出固定位元率為320kbps的AAC音訊:

ffmpeg -i 輸入的影音檔案路徑 -acodec libfdk_aac -b:a 320k 輸出的影音檔案路徑

另外,我們可以在指令加上-cutoff參數,並在後面接上一個頻率數值,這個頻率數值可以控制FDK AAC編碼器在編碼的時候要過濾掉多少頻率以上的聲音訊號。FDK AAC預設就會根據固定位元率或是-m參數來過濾高頻訊號了,但我們可以利用FFmpeg的-cutoff參數來手動控制,-cutoff的數值範圍為188 ~ 20000。例如以下指令可以輸出固定位元率為320kbps的AAC音訊,並且能保有最高20kHz的聲音訊號:

ffmpeg -i 輸入的影音檔案路徑 -acodec libfdk_aac -b:a 320k -cutoff 20000 輸出的影音檔案路徑