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