FFmpeg 9.1 AAC Encoder Rewrite
FFmpeg 9.1 AAC Encoder Rewrite
FFmpeg 9.1では、従来の最適化されていないネイティブ実装に代わるものとして、完全に書き直されたネイティブAACエンコーダーが導入されました。新しいエンコーダーは、さまざまなビットレートにおいて優れたオーディオ品質を実現し、GoogleのZimtohrliやViSQOLなどの指標においてfdk-aacやAppleのqaacを凌駕しています。
技術アーキテクチャと最適化
新しいエンコーダーは、レート制御、Rate-Distortion Optimization (RDO)、およびすべてのコアコーディングツールのゼロベースでの書き直しです。主な技術的改善点は以下の通りです:
- Full RDO Integration: Perceptual Noise Substitution (PNS)、Temporal Noise Shaping (TNS)、Intensity Stereo (I/S)、およびMid/Side (M/S) コーディングを含むすべてのコーディングツールがRDOループに統合されています。エンコーダーは、任意のビットレートのカットオフやヒューリスティックを避け、与えられたビット予算内で最高の品質を提供できる場合にのみツールを利用します。
- Perceptual Optimization: 単純なバンドエネルギー曲線に依存する一部の競合製品とは異なり、新しいエンコーダーはRDOにマスクト・バンド・エネルギーを使用し、可聴周波数により多くのビットを適切に割り当てます。
- Strict CBR Implementation: 固定ビット予算ターゲットがコーディング効率を大幅に向上させるため、エンコーダーはConstant Bit Rate (CBR)向けに最適化されています。開発者は
-q:a(実質的なVBRモード) の使用を推奨していません。 - Strategic Band Zeroing: エンコーダーは、マスクト・バンドをゼロにするかPNSを適用することで、スペクトログラムに意図的に「穴」を残します。この設計上の選択は、すべてのバンドを低品質でコーディングしようとする試みよりも、可聴バンドの高品質なコーディングを優先しています。
パフォーマンス・ベンチマーク
開発者によると、新しいエンコーダー(特にnmrコーダー)は、ZimtohrliとViSQOL(Zimが低く、ViSが高いほど良い)で測定した場合、ほとんどのビットレートにおいてfdk-aacやAppleのエンコーダーを上回っています。
| Bitrate (kbps) | 8.1 fast | 8.1 twoloop | nmr | fdk-aac | apple | libopus | | :--- | :--- | :--- | :--- | :--- | :--- | | 64 | 0.01315 / 2.65 | 0.00696 / 3.24 | 0.00309 / 3.83 | 0.00322 / 3.69 | 0.00612 / 3.29 | 0.00100 / 4.59 | | 96 | 0.00338 / 3.77 | 0.00268 / 3.99 | 0.00134 / 4.04 | 0.00153 / 3.98 | 0.00175 / 3.87 | 0.00039 / 4.62 | | 128 | 0.00229 / 4.10 | 0.00170 / 4.28 | 0.00072 / 4.47 | 0.00143 / 4.27 | 0.00081 / 4.44 | 0.00020 / 4.68 | | 160 | 0.00129 / 4.30 | 0.00108 / 4.44 | 0.00051 / 4.56 | 0.00065 / 4.31 | 0.00117 / 4.51 | 0.00084 / 4.68 | | 256 | 0.00105 / 4.41 | 0.00121 / 4.55 | 0.00031 / 4.61 | 0.00103 / 4.45 | 0.00067 / 4.63 | 0.00002 / 4.73 |
注: Zim/ViSの値が記載されています。Opusは全体的に最高のパフォーマンスを維持しています。
使用ガイドラインと制約
新しいエンコーダーで最良の結果を得るためには、ユーザーは以下の特定の設定に従う必要があります:
- Sample Rate: エンコーダーは主に48kHzオーディオ向けに最適化されています。44.1kHzと96kHzもサポートされていますが、最大品質を得るためには48kHzが推奨されます。
- Downmixing: 出力がダウンミックスされることが予想される場合、ユーザーは元の信号の位相を保持するために
-aac_is 0 -aac_pns 0を使用すべきです。 - Bandwidth Cutoff: 開発者は、
-cutoffフラグを使用して、128kbpsでは16kHzに、160kbps以上では18kHzに帯域幅を制限することを提案しています。
コミュニティ・フィードバックと既知の問題
HydrogenAudioでの初期ユーザーテストでは、いくつかの興味深い点が浮き彫りになりました:
- General Quality: ユーザーは134kbpsと200kbpsにおいて「素晴らしいリスニング体験」を報告しており、従来のネイティブエンコーダーの「チャープ音(chirping)」のようなアーティファクトが大幅に改善されたと述べています。
- TNS Ticking: あるユーザーは、高ビットレート(192kbps)において「カチカチという音(ticking sound)」を報告しましたが、これはTNSを無効にすることで(
-aac_tns 0)解消されました。開発者は、これがlibavcodec/aacenc_tns.cにおける過度に攻撃的なTNS設定に起因する可能性があると示唆しています。 - Stereo Image at Low Bitrates: 64kbpsステレオの場合、一部のユーザーは新しいエンコーダーが従来のエンコーダーよりも「ぼやけた(smeary)」または「金属的な(metallic)」音になると感じると報告していますが、開発者は、64kbpsは一般的に高品質なステレオAACとしては低すぎるビットレートであると述べています。
コマンドライン・エキザンプル
新しいエンコーダーに移行するユーザーには、以下のコマンドが推奨されます:
# Standard high-quality encode
ffmpeg -i input.flac -map 0:0 -c:a aac -b:a 128000 output.m4a
# Encode while disabling Intensity Stereo to maintain phase
ffmpeg -i input.flac -map 0:0 -c:a aac -aac_is 0 -b:a 128000 output.m4a
# Encode while disabling PNS to maintains phase
ffmpeg -i input.flac -map 0:0 -c:a aac -aac_pns 0 -b:a 128000 output.m4a