AAC encoder library: libfdk_aac
libfdk_aac エンコーダは、FFmpegのAACページのFAQで「NativeAAC エンコーダよりも、libfdk_aac エンコーダが最高品質を提供するエンコーダーである」と述べられていますし、又ネットでも評価の高い投稿が見受けられます。 そこで、ハイレゾピュアー音源ファイル(24bit)を用いて「libfdk_aac エンコーダ」と「NativeAAC エンコーダ」で夫々をAAC変換した時の音質(歪率とcutoff周波数)比較を行ってみました。
結論から言いますと、libfdk_aac エンコーダが16bit入力でエンコードされるのでハイレゾ音源(24bit)をAAC変換した場合、「歪率」が悪化してしまうことが分かりました。(一方のNativeAAC エンコーダは歪率面から非常に良好で、24bit入力でエンコードを行っていると言えます。)
しかし、libfdk_aac エンコーダは、Pink-noiseによる絶対誤差で評価するとNativeAACよりも劣化が少いので、CD音源(16bit)を低ビットレートでAAC変換するのに適しているのかも知れません。 以下、FFmpegとlibfdk_aac ライブラリーを含めたインストールから libfdk_aacエンコーダの評価までの紹介です。
※2022/12/25:絶対誤差(Pink-noise)評価を追記しました。
libfdk_aac エンコーダ付きで FFmpegをインストールする
libfdk_aac ライブラリ付きでFFmpegをインストールするには、Homebrew を経由する必要があります。 HomebrewがmacOS にインストールされていない方は、以下をクリックしてHomebrewをインストールします。
FFmpegインストール(手順)
以下のURLページを参考にさせて頂きました。
URL:https://www.web-dev-qa-db-ja.com/ja/macos/homebrewと共にインストールされたffmpegでlibfdkaacを有効にする/808740012/
ターミナルを開き、下の様にコマンドラインを入力してリターンしてインストールを開始します。 多少時間はかかりますが自動的にインストールされます。
ターミナルbrew tap homebrew-ffmpeg/ffmpeg brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-fdk-aac
FFmpegインストール完了 後の確認
ターミナルで、下の様に-hオプションで help が表示されることを確認します。
ターミナルffmpeg -h(⏎) ffmpeg version 5.1 Copyright (c) 2000-2022 the FFmpeg developers built with Apple clang version 13.1.6 (clang-1316.0.21.2.5) configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.1-with-options_1 --enable-shared --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-libaom --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-demuxer=dash --enable-opencl --enable-audiotoolbox --enable-videotoolbox --enable-neon --disable-htmlpages --enable-libfdk-aac --enable-nonfree libavutil 57. 28.100 / 57. 28.100 //中略 -canvas_size size set canvas size (WxH or abbreviation) -spre preset set the subtitle options to the indicated preset
AAC変換のFFmpegコマンドライン
libfdk_aac エンコーダの場合
ターミナルで、下のコマンドラインを入力します。
ターミナルffmpeg -i "変換元ファイル.wav" -acodec libfdk_aac -vn -ar 48000 -ab 320k -cutoff 20000 "変換後のファイル名.m4a"
このコマンドラインのピンク文字がオプションを示し、サンプルレート48khz、ビットレート320kbps(CBR)、カットオフ20khzでAAC変換されます。
オプション説明
- -i
入力を示すオプションです。 変換元のファイルはwav,flac 等に対応しています。 - -acodec libfdk_aac
libfdk_aacエンコーダを指定しています。 - -vn
-vnは、オーディオを指定します。(-vnを指定しないとエラーになりAAC変換できない場合があります)
-vnオプションの代わりに-c:v copy オプションを使用すると 音声ファイルに含まれているArtwork(画像)を継承してAAC変換が出来る様になります。(2024/4/7追記) - -ar 48000
-ar がサンプルレートのオプションで周波数を指定します。 48000が指定サンプリング周波数48khzになります。 - -ab 320k
-ab がビットレートのオプションでbpsを指定します。 320kが指定ビットレート320kbps(CBR)になります。 - -cutoff 20000
libfdk_aacエンコーダの場合cutoff を指定しないと、17khzでハイカットされます。 cutoffは最大で20khz迄のため20000 を指定しています、 CDフォーマットのナイキスト周波数より低いです。
NativeAACエンコーダの場合
ターミナルffmpeg -i "変換元ファイル.wav" -aac_coder twoloop -vn -ar 48000 -ab 320k "変換後のファイル名.m4a"
このコマンドラインで、サンプルレート48khz、ビットレート320kbps(VBR)でAAC変換されます。
オプション説明
- -i
入力を示すオプションです。 変換元のファイルはwav,flac 等に対応しています。 - -aac_coder twoloop
このオプションは、https://qiita.comの「FFmpegでよく使う例、コーデックをまとめてみた」の記事を参考にさせて頂きました。 - -vn
-vnは、オーディオを指定します。(-vnを指定しないとエラーになりAAC変換できない場合があります)
-vnオプションの代わりに-c:v copy オプションを使用すると 音声ファイルに含まれているArtwork(画像)を継承してAAC変換が出来る様になります。(2024/4/7追記) - -ar 48000
-ar がサンプルレートのオプションで周波数を指定します。 48000が指定サンプリング周波数48khzになります。 - -ab 320k
-ab がビットレートのオプションでbpsを指定します。 320kが指定ビットレート320kbpsになります。 ファイルサイズの制約上の理由からなのか?不明ですが160kbpsを境に、それ以下でCBRモード、それ以上でVBRモードになります。
NativeAACエンコーダは、過去記事で紹介しています。
-
-
ハイレゾ・ピュアー音源でFFmpegのNativeAACエンコーダを評価してみました。
FFmpeg(エフエフエムペグ)はMacOSのターミナルからコマンドラインを使って動画と音声を記録・変換・再生するための多機能フリーソフトウェアです。(Windows版やLinax版もり ...
補 足
一々、ターミナルを介してコマンドラインを実行する作業は面倒です。 そこで、Macのショートカットアプリでコマンドラインを組込んだショートカットを作成しておけば変換作業の効率化が図れます。 下の記事で複数の音声ファイルを一括変換するショートカットを紹介しています。 ショートカット化することをオススメします。
-
-
MacのショートカットアプリでFFmpegによるAACやMP3への変換作業を自動化する
例えば、FFmpegのAAC及びMP3用エンコーダは多数ありその特徴に合わせて一々、ターミナルを介してコマンドラインを実行しなければならず、変換作業が面倒です。 そこで、Macのショートカットアプリで ...
AACエンコーダの歪率(sin 1khz -20db)
AACエンコーダの音質指標の一つとして、sin 1khz 信号ファイル(24bit)をAACエンコーダに通すと「歪率」がどの程度悪化するか?を調べます。
歪率測定の手順
- sin 1khz音源ファイルの作成
歪率確認用として、sin 1khz -20db wav(24bit 192khz)ファイルをWindowsソフトのWaveGeneの加算モードで5秒間生成した音源ファイルを作成(歪率:THD+N = 0.00006%) - sin 1khz 音源ファイルをAAC変換
前記コマンドラインの(libfdk_aacとNativeAAC)でAAC変換してm4aファイルを出力 - m4aファイルをWavファイルに変換
WaveSpectraを使うにはm4aファイルをwavフォーマットに変換する必要があります。 Apple Digital Mastersドロップレットツールに含まれているデコード確認用ツール(Audio to WAVE 48K Droplet.app)で、夫々のm4aファイルをツールにドロップしてサンプルレート48khzのWAVファイルに変換 - WaveSpectraでスペクトル描画と歪率測定
夫々の48khzのWAVファイルをWindowsソフトのWaveSpectraにドロップしてスペクトルと歪率(THD,THD+N)を測定
(備考)WindowsソフトのWaveGeneとWaveSpectraは、macOS上のWineで動作させています。(詳しくは、ここをクリック)
歪率は、THDとTHD+Nで示され、スペクトル画面の赤矢印の枠内に表示されています。 THDは全高調波歪の割合でTHD+Nは、ノイズを加えた基本波成分の比(%)です。
ポイント
スペクトルを見ると、libfdk_aac エンコーダは、NativeAACエンコーダに比べてノイズが多く含まれていることが分かります。 歪率の側面で見ると、libfdk_aac エンコーダによるAAC変換は、CDフォーマットの歪率に近似しており、16bit入力でエンコードされていると考えられます。 (下のメモからも、libfdk_aacの入力仕様は16bitになっていることが確認できます。)
Fraunhofer FDK AACのページによれば、「Sample Format」の節に
”The FDK library is based on fixed-point math and only supports 16-bit integer PCM input.”
(DeepL訳:FDK libraryは、固定小数点演算をベースとしており、16ビット整数のPCM入力のみをサポートしています。)
一方、NativeAACエンコーダによるAAC変換は、歪率面から非常に良好で、24bit入力でエンコードを行っていると言えます。
参考テスト
-20db sin 1khz音源ファイルをCDフォーマット(16bit , fs=44.1khz)にした場合の歪率を調べてみました。 (WaveSpectra条件:Hanning size=16384)
libfdk_aac | NativeAAC | CD File(org) | |
THD | 0.00091% | 0.00032% | 0.00032% |
THD+N | 0.02427% | 0.01720% | 0.01750% |
※以上の歪率結果から見ると、NativeAAC は CD File(org) と同等の歪率で、libfdk_aac が僅かですが 歪率が悪化しています。
AACエンコーダの絶対誤差(Pink-noise):追記
2022/12/25:追記エンコーダの違いで、Pink-noiseのピュアー音源の劣化量がどうなるか?追加確認してみました。
AAC変換元(オリジナル)のPink-noiseは、WeveGeneで「-20db pink-noise 5秒間のwaveファイル(24bit 48khz)」を作成します。 このファイルを、前記コマンドラインの libfdk_aacとNativeAACエンコーダでAACファイルを出力します。 AAC変換元(オリジナル)のPink-noiseとAACに変換した夫々のファイルをAudacityに取込み周波数解析を行います。
周波数解析を行う時にチョットしたテクニックが必要です。 AAC変換すると若干のディレイを伴う場合があり、このディレイを取り除く作業が必要です。 基準となる波形の先頭を見極めて、この先頭と一致させる様にディレイ部分を削除します。 わかり易くする為に波形を拡大しておき、時間軸をズームしてディレイ部分を削除します。 その後、トラックの全選択を行って 解析 > スペクトル表示 を選択し周波数解析を行います。Audacityの周波数解析は、周波数とレベルのtextデータが書き出せるので、NumbersやExcelなどの表計算ソフトを起動した後、書き出したtextファイルを開き周波数とレベルのデータを全選択コピーして、表計算ソフトにペーストします。 周波数に対する AACレベルからPink-noise音源レベルを引き算すれば、その値がAACの周波数に対する絶対誤差になります。 数式で表すと、
絶対誤差=測定値ー真値=【AACレベル】ー【Pink-noise音源レベル】
周波数を横軸に絶対誤差を縦軸にしたグラフ(散布図)を下に示します。 下のグラフは、320kbpsと参考で160kbpsに分けて、 libfdk_aacとNativeAACエンコーダのAACの絶対誤差を示しています。 なお、この絶対誤差は、周波数に対するPink-noise5秒間に含まれるPeak値を現しています。
320kbpsの場合
19khzまでの 統計データ |
libfdk_aac | Native_AAC |
x(平均) | -0.07db | -0.15db |
σ(stdevp) | 0.04db | 0.10db |
x+3σ | 0.06db | 0.14db |
x-3σ | -0.20db | -0.44db |
変動幅(2*3σ) | 0.26db | 0.59db |
max | 0.07db | 0.23db |
min | -0.24db | -0.59db |
ポイント
この結果から分かること
- Nativeよりもlibfdk_aacエンコーダの方が、peak値の誤差(劣化)が少なく再現性が良い。
(320kbpsでの3σの変動幅が0.26dbと良好でNativeの1/2) - libfdk_aacエンコーダは、160kbpsにビットレートを落としても絶対誤差の悪化が少なく、Nativeの320kbpsと同等。 再エンコードしても劣化し難いことが想定される。
- Nativeエンコーダは出来るだけビットレートを高く(256kbps以上に)して使用すべき。
-
-
Pink-noiseでビットレートと劣化量の関係を調べてみました。 劣化量(続編)
AAC変換する時にビットレートを低く(オプション)設定すると劣化量がどの程度に増加するものなのか?ネットで調べても具体例が無く、その特性を知りたくなりました。 そこで、今回はFFmpegAACエンコ ...
AACエンコーダのcut-off 周波数
AACエンコーダの音質指標の一つとして、pink noise 信号ファイル(fs=192khz)をAACエンコーダに通すと上限再生周波数(cut-off)がどの程度低下するか?を調べます。(上記コマンドラインで指定したオプションで評価します)
cut-off 周波数・測定の手順
- pink noise音源ファイルの作成
cut-off 周波数確認用として、pink noise -20db wav(24bit 192khz)ファイルをWindowsソフトのWaveGeneの加算モードで5秒間生成した音源ファイルを作成 - pink noise音源ファイルをAAC変換
前記コマンドラインの libfdk_aacとNativeAAC オプションでAAC変換してm4aファイルを出力 - m4aファイルをWavファイルに変換
WaveSpectraを使うにはm4aファイルをwavフォーマットに変換する必要があります。 Apple Digital Mastersドロップレットツールに含まれているデコード確認用ツール(Audio to WAVE 96K Droplet.app)で、夫々のm4aファイルをツールにドロップしてサンプルレート96khzにアップコンバートしたWAVファイルに変換
(スペクトルの横軸を48khzする目的で96khzにアップコンバートしています) - WaveSpectraでスペクトル描画
夫々の96khzのWAVファイルをWindowsソフトのWaveSpectraにドロップしてスペクトルを描画して、cut-off周波数を測定
ポイント
libfdk_aac エンコーダによるAAC変換は、cutoffオプションで20khzに規定しているので当然ながら20khzでハイカットされています。 ただ、cutoffオプションは、20khz以上にするとエラーになりますし、cutoffオプションを無記載にすると、320kbpsであっても、17khzでハイカットされてしまいます。
一方、NativeAACエンコーダによるAAC変換は、Cut-off周波数が23.6khzですので、少なくもCDのナイキスト周波数(44.1khz/2=22.05khz)を超えています。(cutoffオプションを使っていないことに注目してください)
ハイレゾリアル音源からAAC変換した音源( 試聴)とマトメ
夫々のエンコーダでAAC変換した音源
libfdk_aac エンコーダ
48khz 320kbps(CBR) file size:21.3MB
NativeAACエンコーダ
48khz 320kbps(VBR) file size:20.7MB
リアル音源の絶対誤差
(解析条件) Audacity解析時間: 先頭から218.5s 関数窓: hann size 16384
リアル音源絶対誤差グラフ
リアル音源絶対誤差統計データ
19khzまでの 統計データ | libfdk_aac | Native_AAC |
x(平均) | -0.11db | -0.13db |
σ(stdevp) | 0.08db | 0.13db |
x+3σ | 0.12db | 0.25db |
x-3σ | -0.35db | -0.52db |
変動幅(2*3σ) | 0.47db | 0.77db |
max | 0.22db | 0.41db |
min | -0.42db | -0.79db |
試聴(ポイント)
Sony HAP-Z1ES HDDオーディオプレーヤに夫々の3つの音源ファイルを転送して、「我が家のB級オーディオ」で確認してみました。
何分、駄耳のため正しい評価になっているか自信がありませんが、ストリングスの音をフォーカスして試聴したところ、NativeAACエンコーダがオリジナルのFlac音源のサウンドに近い様に感じました。(プラセボ効果か?も知れません)
大きく見れば、夫々3つの音源は、甲乙つけ難く殆どその音質差は感じられませんでした。
HAP-Z1ES
詳しくは、ここをクリック
libfdk_aac エンコーダのマトメ
2022/12/25:絶対誤差(Pink-noise)追記による見直し書き換え
libfdk_aacエンコーダはNativeAACに比べて、16bit入力でエンコードされ歪率に不利があるものの、Pink-noiseの絶対誤差の評価結果から、peak値の誤差(劣化)が少なく再現性が良いことが分かりました。 つまり、CDなど16bit音源をAAC変換するなら libfdk_aac 一択ですね。
NativeAACエンコーダは、24bit対応であることから量子化ノイズが少ないことを意味して静寂性に優れ、クラッシク系の楽曲に向き、一方のlibfdk_aacエンコーダは、Pink-noise絶対誤差でpeak値の誤差(劣化)が少ない結果だったのでポップス・ジャズ等の楽曲に向いているかも知れません。
また、絶対誤差の結果からNativeAACエンコーダは低ビットレートに不利ですが、libfdk_aac エンコーダは低ビットレートでも劣化し難いという特徴が分かりました。
これらの特性を踏まえて、夫々のエンコーダを選ぶのがベターと思われます。 今後、libfdk_aac エンコーダが24bit入力対応になることを期待します。
以上、ハイレゾピュアー音源(24bit)を使った libfdk_aac エンコーダの紹介でした。 実のところ、FFmpegは使いこなしの面でも多岐にわたって正しくオプション設定がされているか不安な面もあり、この記事中で誤りなどがあれば、ご指摘頂けると幸いです。
ハイレゾ音源を変換するオススメ・関連記事
AAC変換アプリ・ランキング
AAC(MP3)に変換する・5つのヒント