# [FFmpeg] AAC 編碼基本說明 ## 簡介 Advanced Audio Coding (AAC) 是 MP3 的後繼格式,它被定義於 MPEG-4 part 3 (ISO/IEC 14496-3)。它通常使用在 MP4 容器內;對於音樂習慣上使用 .m4a 副檔名。第二常見使用是在 MKV (Matroska) 檔內,因為它比 MP4 支援更多以文字為基礎的軟字幕 (例如 ass, ssa...)。本文中的範例將使用 MP4 與 M4A 副檔名。 FFmpeg 可以支援 4 個 AAC-LC 編碼器 (aac, libfaac, libfdk_aac, libvo_aacenc) 與兩個 AAC-HE 編碼器 (libaacplus, libfdk_aac)。libaacplus, libfaac, libfdk_aac 的授權不與 GPL 相容,所以當 GPU 授權原始碼也包含在內時 GPU 不允許包含原始碼授權依據這些授權的二進位檔的發布。因此這些編碼器被指定為 "non-free",且你不能下載內建它們的 ffmpeg。這可以透過自行編譯 ffmpeg 來解決。 對於 AAC-LC 品質而言,其答案可能是: Native FFmpeg AAC encoder (aac) >= libfdk_aac > libfaac > libvo_aacenc > 註:`>=` 代表大於或等於。 Non-free FFmpeg 自動建置腳本: https://github.com/m-ab-s/media-autobuild_suite ## 位元率 推薦位元率: $$ 位元率 >= 128kbps * 聲道數 / 2 $$ 由以上得知, 雙聲道推薦 位元率 >= 128kbps,6聲道則推薦位元率 384kbps。 ## libfdk_aac 編碼器 The Fraunhofer FDK AAC 編解碼程式庫,這是目前 ffmpeg 所能提供的最高品質 AAC 編碼器。此為額外編碼碼函式庫,需要 ffmpeg 建置組態 (configuration) 中含有 -`-enable-libfdk-aac` (如果也使用 --enable-gpl 則還需要 `--enable-nonfree`)。 ### Constant Bit Rate (CBR, 常數位元速率) 模式 指定一個目標位元速率。它可以讓你精準控制輸出檔案大小 (= 位元率 * 時間長度),且它與 HE-AAC profile 相容。 範例: 轉換一個音訊檔為 AAC 並以 M4A (MP4) 容器來封裝: ```powershell ffmpeg -i input.wav -c:a libfdk_aac -b:a 128k output.m4a ``` 轉換一個影片的 5.1 生到音訊為 AAC,並複製其視訊串流: ```powershell ffmpeg -i input.mp4 -c:v copy -c:a libfdk_aac -b:a 384k output.mp4 ``` ### Variable Bit Rate (VBR, 可變位元速率) 模式 指定一個目標品質,而不是特定的位元速率。設定值範圍為 1-5,較高的值會得到較高的位元率與品質。使用 `-vbr` 選項來設定 VBR 等級。 範例: 轉換一個音訊檔為 AAC 並以 M4A (MP4) 容器來封裝: ```powershell ffmpeg -i input.wav -c:a libfdk_aac -vbr 3 output.m4a ``` 轉換一個影片的 5.1 生到音訊為 AAC,並複製其視訊串流: ```powershell ffmpeg -i input.mp4 -c:v copy -c:a libfdk_aac -vbr 3 output.mp4 ``` ### High-Efficiency AAC 簡稱 AAC-HE 又名為 aacPlus,這是一對專門針對低位元速率的 AAC profiles (version 1 與 version 2),AAC-HE v1。對於雙聲道而言 ,AAC-HE v1 適用於 64kbps 以下,而 AAC-HE v2 適用於 32kbps 以下。但大多數播放設備不支援播放任何版本的 AAC-HE 而只能播放 AAC-LC。 > 注意:AAC-HE v2 只能支援雙聲道。對於單聲道,則使用 AAC-HE v1。 如果需要指定 Profile 則使用 `-profile` 選項。 Profiles: * aac_low MPEG-4 AAC LC (default) * aac_he MPEG-4 HE-AAC (SBR) * aac_he_v2 MPEG-4 HE-AAC v2 (SBR+PS) * aac_ld MPEG-4 AAC LD * aac_eld MPEG-4 AAC ELD 例如: ```powershell ffmpeg -i input.wav -ac 2 -c:a libfdk_aac -profile:a aac_he -vbr 3 output.m4a ``` ## 原生 FFmpeg AAC 編碼器 原生 FFmpeg AAC 編碼器,這是目前 ffmpeg 所能提供的第二高品質 AAC 編碼器。而且它已包含在 ffmpeg 內,不像本文中其它 AAC 編碼器那樣需要一個外部程式庫。在 128kbps 位元速率通常可以產生與 `libfdk_aac` 相同甚至更高的品質,但在 96kbps 以下偶爾聽起來會比較差。這是預設的 AAC 編碼器。缺點是此編碼器還不支援 AAC-HE profile。 ### 指定位元率 使用 `-b` 選項來指定輸出位元率為 160kbps: ```powershell ffmpeg -i input.wav -c:a aac -b:a 160k output.m4a ``` ### 指定品質 使用 `-q` 選項來指定輸出品質等級為 6: ```powershell ffmpeg -i input.wav -strict experimental -c:a aac -q:a 6 output.m4a ``` 設定值有效範圍為 0.1 - 10。比較高的設定值會得到較高的輸出品質與位元率大小。此 VBR 是實驗性的並且有可能得到比 CBR 更差的結果。 ###### tags: `ffmpeg`