この記事でわかること

テスト済みバージョン: FFmpeg 6.1(ubuntu-latest / CI検証済み)
対象 OS: Windows / macOS / Linux


EBU R128ラウドネス正規化とは

EBU R128は欧州放送連合(EBU)のオーディオラウドネス標準です。以下を定義しています:

指標単位EBU R128ターゲット
統合ラウドネス(I)LUFS−23 LUFS
トゥルーピーク(TP)dBTP最大 −1 dBTP
ラウドネスレンジ(LRA)LU推奨 18 LU以下

LUFS(Loudness Units Full Scale)は人間の聴覚に基づく知覚ラウドネスの尺度です。最大サンプル値のみを見るピーク正規化とは異なり、コンテンツが実際にどのくらい大きく_聴こえるか_を正規化します。

ストリーミングプラットフォーム(YouTube、Spotify、Apple Musicなど)は、EBU R128や米国放送標準ATSC A/85に基づく独自のラウドネスターゲットを使用しています。


1パス正規化(クイック)

最もシンプルな使い方は1パスでloudnormを適用することです:

ffmpeg -i input.mp3 -af loudnorm output.mp3

デフォルトでは統合ラウドネス −23 LUFS、トゥルーピーク −2 dBTP、ラウドネスレンジ 7 LU をターゲットとします。1パスモードは処理しながらソースのラウドネスを推定するため、多くのユースケースで十分な精度があります。

ターゲット値のカスタマイズ

ffmpeg -i input.mp3 -af "loudnorm=I=-16:TP=-1.5:LRA=11" output.mp3
パラメータ説明デフォルト
I統合ラウドネスターゲット(LUFS)−23
TPトゥルーピーク上限(dBTP)−2
LRAラウドネスレンジターゲット(LU)7

I=-16はストリーミングプラットフォーム(SpotifyやYouTube)のターゲットに近い値です。放送(EBU R128)にはI=-23を使用してください。


2パス正規化(精度重視)

最も精確な正規化のためには2パス方式を使います:

パス1 — ソースのラウドネスを計測:

ffmpeg -i input.mp3 -af "loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json" -f null /dev/null

出力なし(-f null /dev/null)で実行し、計測値を含むJSONブロックをstderrに出力します:

{
        "input_i" : "-27.06",
        "input_tp" : "-4.28",
        "input_lra" : "7.20",
        "input_thresh" : "-37.06",
        "output_i" : "-16.00",
        "output_tp" : "-1.50",
        "output_lra" : "7.20",
        "output_thresh" : "-26.00",
        "normalization_type" : "dynamic",
        "target_offset" : "0.00"
}

パス2 — 計測値を使って適用:

パス1のinput_iinput_tpinput_lrainput_threshloudnormフィルターのmeasured_Imeasured_TPmeasured_LRAmeasured_threshとして使用します:

ffmpeg -i input.mp3 -af "loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=-27.06:measured_TP=-4.28:measured_LRA=7.20:measured_thresh=-37.06:linear=true" output.mp3

linear=trueは、計測値に基づくシンプルなリニアゲイン適用を指示します(ダイナミックコンプレッションなし)。これは重要なオプションです。指定しないと、シンプルなゲイン調整で十分な場合でもダイナミックレンジコンプレッションが適用される場合があります。


動画ファイルへの適用(映像再エンコードなし)

動画ファイルのラウドネスを映像を再エンコードせずに正規化するには:

ffmpeg -i input.mp4 -c:v copy -af "loudnorm=I=-16:TP=-1.5:LRA=11" output.mp4

-c:v copyで映像をそのまま通過させ、音声のみ再エンコードします。


出力値の読み方

パス1のJSON出力の各フィールドの意味:

フィールド意味
input_i計測された統合ラウドネス(LUFS)
input_tp計測されたトゥルーピーク(dBTP)
input_lra計測されたラウドネスレンジ(LU)
input_threshラウドネスゲーティング閾値
normalization_typelinear(リニアゲイン)またはdynamic(ダイナミック処理)

normalization_typeがパス1でlinearの場合、音声はシンプルなゲインで調整できます。dynamicの場合、パス2でダイナミックレンジコンプレッションが適用されます。


よくある問題

出力が期待より大きく/小さく聴こえる

1パスモードではエンコードしながらラウドネスを推定します。ラウドネスが変動するファイルでは推定が不正確になることがあります。重要なコンテンツには常に2パスを使用してください。

パス1の出力に問題がある

パス1(-f null /dev/null)は出力ファイルを生成しません — 計測のみです。精度が重要な場合はパス1をスキップしないでください。

トゥルーピークのクリッピング

ソースのピークが0 dBFSに非常に近い場合、単純なゲインアップでサンプルが0を超えることがあります。TPパラメータで出力トゥルーピークを制限してこれを防ぎます。TP=-1以下に設定してください。


関連記事


テスト環境: ffmpeg 6.1.1 / Ubuntu 24.04(GitHub Actions)
一次ソース: ffmpeg.org/ffmpeg-filters.html#loudnorm / trac.ffmpeg.org/wiki/AudioVolume