LUFS、いわゆる平均ラウドネス値を調べるebur128フィルタの使い方。

LUFS(Loudness Unit Referred to Full Scale)とは平均ラウドネス値の単位で、LKFS(Loudness K Weghted Full Scale)とも言われている。

任意のラウドネス値に音量を調整する loudnorm

ニコニコ動画にも2020年1月29日(水)より大きすぎる音量感を抑制する方向でのみラウドネスノーマライゼーション(自動音量調整機能)を追加することが発表された。
動画音量の自動調整機能を導入します【PC版ニコニコ動画】|ニコニコインフォ
ニコニコ動画のラウドネスノーマライゼーション(自動音量調整機能)について:ニコニコ窓口:niconico窓口チャンネル(ニコニコ窓口担当) – ニコニコチャンネル:社会・言論

音量測定用AviUtlプラグイン「loudness.auf」 – ニコニコ動画

技術的な話

基本コマンド

  • ラウドネスの値を映像化して再生
    ffplay -f lavfi -i "amovie=input.mp4,ebur128=video=1:size=640x480:meter=9[out0][out1]"
  • ラウドネスの値を映像化して動画出力
    ffmpeg -i input.mp4 -filter_complex "ebur128=video=1:size=640x480:meter=9" -pix_fmt yuv420p output.mkv
  • フレーム毎のログ表示
    ffmpeg -i input.mp4 -vn -filter_complex ebur128=framelog=info -f null -
  • 結果だけをログ表示
    ffmpeg -i input.mp4 -vn -filter_complex ebur128=framelog=verbose -f null -
  • M:400ミリ秒毎のラウドネス値 の値だけ
    ffmpeg -i input.mp4 -filter_complex "[0:a]ebur128=video=1[out1];[out1]crop=64:12:159:4" -pix_fmt yuv420p output.mkv
  • S:3秒毎の移動平均ラウドネス値 の値だけ
    ffmpeg -i input.mp4 -filter_complex "[0:a]ebur128=video=1[out1];[out1]crop=64:12:231:4" -pix_fmt yuv420p output.mkv
  • I:全体の平均ラウドネス値 の値だけ
    ffmpeg -i input.mp4 -filter_complex "[0:a]ebur128=video=1[out1];[out1]crop=92:12:337:4" -pix_fmt yuv420p output.mkv
  • LRA:ラウドネスレンジ の値だけ
    ffmpeg -i input.mp4 -filter_complex "[0:a]ebur128=video=1[out1];[out1]crop=104:12:495:4" -pix_fmt yuv420p output.mkv
  • 目盛りだけ
    ffmpeg -i input.mp4 -filter_complex "[0:a]ebur128=video=1[out1];[out1]crop=15:452:16:24" -pix_fmt yuv420p output.mkv
  • 右のバーだけ
    ffmpeg -i input.mp4 -filter_complex "[0:a]ebur128=video=1[out1];[out1]crop=22:434:611:39" -pix_fmt yuv420p output.mkv
  • 2つのグラフを比較して再生
    ffplay -f lavfi -i "amovie=input.mp4,asplit[1],ebur128=video=1:target=-10[0v][0a];[1]ebur128=video=1:size=640x480:target=0[1v][1a];[0v][1v]hstack[out0];[0a][1a]amix[out1]"

公式ドキュメント:FFmpeg Filters Documentation : ebur128

オプション

  • video[boolean]
    ラウドネスの値を映像化するかどうか。有効にすると映像と音声の2出力になる
    既定値:0(音声だけ)
  • size[image_size]
    ラウドネスの値を映像化したときの解像度。最小値は 640×480
    既定値:640×480
  • meter[int]
    RBU スケールメーター(左のメモリ)の値の最大値
    既定値:9
    範囲:9 から 18 まで
  • framelog[int]
    ログレベルの指定
    • -8, quiet:1フレーム当たりのログを表示しない
    • 32, info:1フレーム当たりのログを表示する。既定値
    • 40, verbose:1フレーム当たりのログを表示しない
  • metadata[boolean]
    メタデータに表示に切り替える。100ms 毎に1フレーム描写する
    既定値:0
  • peak[flags]
    ピークモードの指定
    • none:ピークモードの設定をしない。既定値
    • sample:ピークサンプルモード
    • true:トゥルーピークモード
  • dualmono[boolean]
    モノラル入力をデュアルモノラルのように扱う
    既定値:0
  • panlaw[double]
    デュアルモノラルのファイルのパンローを設定する
    既定値:-3.0103
    範囲:-10 から 0 まで
  • target[int]
    LUFS のどの値の基準を相対的なレベルとして描写するかの指定。波形が見切れる場合に調整する
    既定値:-23
    範囲:-23 から 0 まで
  • gauge[int]
    ゲージ値の指定
    • 0, momentary, m:瞬時。既定値
    • 1, shortterm, s:短期
  • scale[int]
    ラウドネスのスケール値の指定。映像出力のみに影響を与える
    • 0, absolute, LUFS:絶対値。既定値
    • 1, relative, LU:相対値
ebur128フィルタを映像化した表示例

TARGET:targetの指定
M:400ミリ秒毎のラウドネス値
S:3秒毎の移動平均ラウドネス値
I:全体の平均ラウドネス値
LRA:ラウドネスレンジ

ログ表示の内容

  Integrated loudness:
    I:         平均ラウドネス LUFS(音量感)
    Threshold: しきい値 LUFS

  Loudness range:
    LRA:        ラウドネスレンジ LU
    Threshold: しきい値 LUFS
    LRA low:   最小ラウドネス LUFS
    LRA high:  最大ラウドネス LUFS

メタデータ出力内容。
ebur128=metadata=1でメタデータを出力する。

lavfi.r128.M
lavfi.r128.S
lavfi.r128.I
lavfi.r128.LRA
lavfi.r128.LRA.low
lavfi.r128.LRA.high

adrawgraph の描写例

M、S、I、LRAが最大最小の範囲を指定して描写できる。
ffplay -f lavfi -i "amovie=input,ebur128=metadata=1,adrawgraph=lavfi.r128.M:min=-32:max=0"
ffplay -f lavfi -i "amovie=input,ebur128=metadata=1,adrawgraph=lavfi.r128.M:min=-32:max=0:mode=bar"
ffplay -f lavfi -i "amovie=input,ebur128=metadata=1,adrawgraph=lavfi.r128.S:min=-32:max=0"
ffplay -f lavfi -i "amovie=input,ebur128=metadata=1,adrawgraph=lavfi.r128.I:min=-32:max=0"
ffplay -f lavfi -i "amovie=input,ebur128=metadata=1,adrawgraph=lavfi.r128.LRA:min=0:max=2"

M、S、Iを同時に表示する。
ffplay -f lavfi -i "amovie=input,ebur128=metadata=1,adrawgraph=m1=lavfi.r128.M:min=-32:max=0:m2=lavfi.r128.S:m3=lavfi.r128.I"

adrawgraphも同じオプション。
メタデータを映像化する drawgraph, adrawgraph

ametadata の利用例

ametadataフィルタで表示する例。
ffplay -f lavfi -i amovie=input,ebur128=metadata=1,ametadata=print:key=lavfi.r128.M,ametadata=print:key=lavfi.r128.S,ametadata=print:key=lavfi.r128.I[out0];amovie=input[out1]

fileでテキストに出力する。
ffmpeg -i input -af ebur128=metadata=1,ametadata=mode=print:file=foo.txt -vn -f null -

任意のタグだけ選ぶならkeyで指定する。
ffmpeg -i input -af ebur128=metadata=1,ametadata=mode=print:file=foo.txt:key=lavfi.r128.M -vn -f null -

複数トラックを解析してテキストに出力する。
ffmpeg -i input -filter_complex [0:a:0]ebur128=metadata=1,ametadata=mode=print:file=foo.txt;[0:a:1]ebur128=metadata=1,ametadata=mode=print:file=bar.txt -vn -f null -

ffmpeg | 識別子の指定方法:任意のトラックを指定する
メタデータをコンソールに表示する metadata, ametadata

他のフィルタを併用して映像で並べる

showvolume、ebur128、avectorscopeフィルタのログを縦に並べる。
ffplay -f lavfi "amovie=input.mp4,asplit=3[sv][eb][av];[sv]showvolume=b=4:f=0:ds=log:c=VOLUME:w=640:h=68[sv-v];[eb]ebur128=video=1:size=640x480:meter=18[eb-v][out1];[av]avectorscope=s=640x460:zoom=1.3:rc=2:gc=200:bc=10:rf=1:gf=8:bf=7[av-v];[sv-v][eb-v][av-v]vstack=3"

1920×1080の映像を右に並べる。CPUが強くないと音が途切れ途切れになる。
ffplay -f lavfi "movie=input.mp4,split=4[v][wf][wfc][vs];[wf]waveform=m=1:d=0:r=0:c=7[wf-vus];[wf-vus][v]scale2ref=iw:1220-ih[wf-va][sig];[wf-va]setsar=1[wf-v];[wfc]waveform=m=0:d=0:r=0:c=7,scale=610x610,setsar=1[wfc-v];[vs]vectorscope=m=color3:g=color,scale=610x610,setsar=1[vs-v];[sig][wf-v]vstack[2c];[wfc-v][vs-v]vstack[3c];[2c][3c]hstack[out0];amovie=input.mp4[out1]"

運用方法

テレビ放送では-24LUFS ±1dB、PS3では-23LUFS ±2dB、Vitaでは-18LUFS程度とされている。ニコ生では配信内容で目安となる値を変えて、ゲーム配信ならPS3に倣って-23程度に、雑談配信なら-24程度を目標とする。

ニコニコ動画は-15LKFS/LUFSを基準とすることにした。

この値を目標に音量を変更するにはloudnormフィルタが最適である。
任意のラウドネス値に音量を調整する loudnorm

具体的な区間で特定の音量に上げ下げするにはvolumeフィルタとタイムライン編集を併用する。
Windows の ffmpeg で生放送する方法 – volume 音量調整
特定の区間だけフィルタを当てるタイムライン編集について

10秒から180秒までvolumeフィルタで2dB上げる。
ffmpeg -i input -af volume=2dB:enable='between(t,10,3*60)' -c:v copy output

複数の区間にフィルタを当てるには複数回volumeフィルタを当てる。
ffmpeg -i input -af volume=2dB:enable='between(t\,10\,3*60)',volume=2dB:enable='between(t\,200\,4*60)' -c:v copy output

その他のオーディオフィルタ

2 thoughts on “適切な音量が調べられる ffmpeg の ebur128 の使い方

  • sirouto

    複数の音声トラックを持つファイルの場合、それぞれのトラックに対してラウドネス解析を行い、ログ表示をさせたい場合はどのようにすればいいのでしょうか?

    • admin

      1番目と2番目の音声トラックを解析する。適宜トラック数が増えれば[0:a:0]の3番目の数値を増やしてください。他にも質問があればお気軽にしてください
      ffmpeg -i input -filter_complex [0:a:0]ebur128=metadata=1,ametadata=mode=print:file=foo.txt;[0:a:1]ebur128=metadata=1,ametadata=mode=print:file=bar.txt -vn -f null –

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)