広告 MP3、AAC音質関連

高品質でAAC変換できると言われるFFmpeg libfdk_aacエンコーダをハイレゾピュアー音源(24bit)で音質評価してみました。

スポンサーリンク

 

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)評価を追記しました。

 

libefdk_aac エンコーダ付きで FFmpegをインストールする

libefdk_aac ライブラリ付きでFFmpegをインストールするには、Homebrew を経由する必要があります。 HomebrewがmacOS にインストールされていない方は、以下をクリックしてHomebrewをインストールします。

FFmpegインストール(手順)

ターミナルを開き、下の様にコマンドラインを入力してリターンしてインストールを開始します。 多少時間はかかりますが自動的にインストールされます。

 ターミナル
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コマンドライン

libefdk_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版もり ...

 

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変換
    前記コマンドラインの(libefdk_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で動作させています。(詳しくは、ここをクリック

libefdk_aac エンコーダの歪率

blankTHD:0.00084%
THD+N:0.02107%

NativeAACエンコーダの歪率

blankTHD:0.00003%
THD+N:0.00056%

歪率は、THDとTHD+Nで示され、スペクトル画面の赤矢印の枠内に表示されています。 THDは全高調波歪の割合でTHD+Nは、ノイズを加えた基本波成分の比(%)です。

ポイント

スペクトルを見ると、libefdk_aac エンコーダは、NativeAACエンコーダに比べてノイズが多く含まれていることが分かります。 歪率の側面で見ると、libefdk_aac エンコーダによるAAC変換は、CDフォーマットの歪率に近似しており、16bit入力でエンコードされていると考えられます。 (下のメモからも、libefdk_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入力でエンコードを行っていると言えます。

参考テスト

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)」を作成します。 このファイルを、前記コマンドラインの libefdk_aacとNativeAACエンコーダでAACファイルを出力します。 AAC変換元(オリジナル)のPink-noiseとAACに変換した夫々のファイルをAudacityに取込み周波数解析を行います。

周波数解析を行う時にチョットしたテクニックが必要です。 AAC変換すると若干のディレイを伴う場合があり、このディレイを取り除く作業が必要です。 基準となる波形の先頭を見極めて、この先頭と一致させる様にディレイ部分を削除します。 わかり易くする為に波形を拡大しておき、時間軸をズームしてディレイ部分を削除します。 その後、トラックの全選択を行って 解析 > スペクトル表示 を選択し周波数解析を行います。

Audacityの周波数解析は、周波数とレベルのtextデータが書き出せるので、NumbersやExcelなどの表計算ソフトを起動した後、書き出したtextファイルを開き周波数とレベルのデータを全選択コピーして、表計算ソフトにペーストします。 周波数に対する AACレベルからPink-noise音源レベルを引き算すれば、その値がAACの周波数に対する絶対誤差になります。 数式で表すと、

絶対誤差=測定値ー真値=【AACレベル】ー【Pink-noise音源レベル】

周波数を横軸に絶対誤差を縦軸にしたグラフ(散布図)を下に示します。 下のグラフは、320kbpsと参考で160kbpsに分けて、 libefdk_aacNativeAACエンコーダのAACの絶対誤差を示しています。 なお、この絶対誤差は、周波数に対するPink-noise5秒間に含まれるPeak値を現しています。

320kbpsの場合

blank

19khzまでの
統計データ
libefdk_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

参考:160kbpsの場合

blank

16khzまでの
統計データ
libefdk_aac Native_AAC
x(平均) -0.12db -0.33db
σ(stdevp) 0.08db 0.49db
x+3σ 0.14db 1.15db
x-3σ -0.37db -1.08db
変動幅(2*3σ) 0.51db 2.95db
max 0.20db 1.09db
min -0.48db -4.12db

 

ポイント

この結果から分かること

  • Nativeよりもlibefdk_aacエンコーダの方が、peak値の誤差(劣化)が少なく再現性が良い。 
    (320kbpsでの3σの変動幅が0.26dbと良好でNativeの1/2)
  • libefdk_aacエンコーダは、160kbpsにビットレートを落としても絶対誤差の悪化が少なく、Nativeの320kbpsと同等。 再エンコードしても劣化し難いことが想定される。
  • Nativeエンコーダは出来るだけビットレートを高く(256kbps以上に)して使用すべき。
劣化量(続編)
blank
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変換
    前記コマンドラインの libefdk_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周波数を測定

libefdk_aac エンコーダのCut-off

blankCut-off周波数:20khz

NativeAACエンコーダのCut-off

blankCut-off周波数:23.6khz

ポイント

libefdk_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変換した音源

オリジナル・ハイレゾFlac音源

Flac Down load

192Khz 24bit
337MiB 8分50秒

blank

このFlacファイルは、1962年録音盤のBeethoven 第9の2楽章のレコードからデジタイズしたものです。

リアル音源の絶対誤差

(解析条件) Audacity解析時間: 先頭から218.5s 関数窓: hann size 16384

リアル音源絶対誤差グラフ

blank

リアル音源絶対誤差統計データ

19khzまでの
統計データ
libefdk_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
夫々のエンコーダをリアル音源の絶対誤差で調べたところ、多少libfdk_AACの方が若干良好な結果でした。 その差は僅かで、聴感上の違いは認識できないレベルの様に思われます。

 

試聴(ポイント)

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)を使った libefdk_aac エンコーダの紹介でした。 実のところ、FFmpegは使いこなしの面でも多岐にわたって正しくオプション設定がされているか不安な面もあり、この記事中で誤りなどがあれば、ご指摘頂けると幸いです。

 

ハイレゾ音源を変換するオススメ・関連記事

 

 

スポンサーリンク

 

スポンサーリンク

 

t