音量をリアルタイムでメーター表示する ffmpeg のshowvolumeのフィルタの使い方。出力フォーマットは RGBA。条件をつければ指定 dB の範囲に色を変えられる。

基本コマンド

映像をメーターに差し替える。
ffmpeg -i input -filter_complex showvolume=r=25:b=1:w=400:h=20:t=1:v=1:s=0 -c:a copy output
ffplay -f lavfi -i amovie=input,showvolume

2チャンネルのメーターだけを再生する。
ffplay -f lavfi "amovie=input,asplit[a][out1];[a]showvolume=b=4:w=720:h=68[out0]"

音量メーターの例

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

オプション内容

  • rate, r[video_rate]映像のフレームレート
    既定値:25
  • b[int]
    音量メーター同士の隙間幅
    既定値:1
    範囲:0 から 5 まで
  • w[int]
    音量メーターの横幅
    既定値:400
    範囲:80 から 8192 まで
  • h[int]
    音量メーターの縦幅
    既定値:20
    範囲:1 から 900 まで
  • f[double]
    音量メーターのフェード。小さい値ほど影が残る
    既定値:0.95
    範囲:0 から 1 まで
  • c[string]
    メーターの色を指定。色名指定はできない。色指定は 0xaabbggrr 形式で 0xrrggbbaa ではないことに注意
    VOLUME は 0dB を示す。if文を使って音量によって色を変えることも出来る
    既定値:”PEAK*255+floor((1-PEAK)*255)*256+0xff000000″

    以下の評価式が使える

    • VOLUME
      現在の最大音量 dB
    • PEAK
      現在のピーク
    • CHANNEL
      現在のチャンネル番号。0 から
  • t[boolean]
    音量メーターにチャンネル名を乗せる
    既定値:1(表示する)
  • v[boolean]
    音量の数値を表示する
    既定値:1(表示する)
  • dm[double]
    最大音量が何秒表示するかの指定
    既定値:0
    範囲:0 から 9000 まで
  • dmc[color]
    最大音量ラインの色指定
    既定値:”orange”
  • o[int]
    縦表示か横表示かのメーターがどちらに伸びるかの表示形式の指定
    • 0, h
      横でステレオなら上がFL、下がFR。既定値
    • 1, v
      縦でステレオなら左がFL、右がFR
  • s[int]
    音量メーターをメモリ表示にする
    既定値:0
    範囲:0 から 5 まで
  • p[float]
    背景の透過指定
    既定値:0(透過しない)
    範囲:0 から 1 まで
  • m[int]
    モードの指定
    • 0, p
      ピーク。既定値
    • 1, r
      rms
  • ds[int]
    表示形式の指定
    • 0, lin
      linear。既定値
    • 1, log
      log

発展的な使い方

動画にオーバーレイするコマンド例

showvolumeフィルタは音声を映像に変えるフィルタなので-vf、-afが使えず、-f lavfiで読み込むか、-filter_complexを使う。

ffmpeg -i input -filter_complex [0:a]showvolume[s];[0:v][s]overlay -c:a copy ouput
ffplay -f lavfi -i amovie=input,showvolume[a];movie=input[v];[v][a]overlay

showvolume を動画にオーバーーレイした例

big buck bunny

音量でメーターの色を変える発展的な使い方

-6dB なのでメーターの色は lime になる。
ffplay -f lavfi -i aevalsrc="sin(440*2*PI*t):s=8000,volume=1/2,showvolume"

2つの条件で色を変える場合。
-6dB 未満は 0x7f00ff00(lime)、-6dB 以上は 0x7f00ffff(yellow)
ffmpeg -i input -filter_complex showvolume=c='if(lte(VOLUME,-6),0x7f00ff00,0x7f00ffff)'[a];[0:0][a]overlay -vcodec rawvideo -acodec pcm_s16le -f nut - | ffplay -

3つの条件で色を変える場合。
-6dB 以下は 0x7f00ff00(lime)、-6dB から -4dB 未満は 0x7f00ffff(yellow)、-4dB 以上は 0x7f0000ff(red)
ffmpeg -i input -filter_complex showvolume=c='if(lte(VOLUME,-4),if(lte(VOLUME,-6),0x7f00ff00,0x7f00ffff),0x7f0000ff)'[a];[0:0][a]overlay -vcodec rawvideo -acodec pcm_s16le -f nut - | ffplay -

showvolumeフィルタで透過を変更すると思ったように変えられないので、透過具合をcolorchannelmixerフィルタで変更する。最後の 2 がポイントで 1 以上にすれば色が濃くなり、1 未満にすると色が薄くなる。
ffmpeg -i input -filter_complex showvolume=c='if(lte(VOLUME,-4),if(lte(VOLUME,-6),0x7f00ff00,0x7f00ffff),0x7f0000ff)',colorchannelmixer=1:0:0:0:0:1:0:0:0:0:1:0:0:0:0:2[a];[0:0][a]overlay -vcodec rawvideo -acodec pcm_s16le -f nut - | ffplay -

ffmpeg で使える評価式
RGBA の各値を別のチャンネルに混ぜ合わせる colorchannelmixer の使い方

bandpassフィルタで範囲を区切って合わせるとスペクトラムを作ることができる。コマンドが長いのでgistにリンクしている。

Can you customize how abitscope looks? : ffmpeg

コメントを残す

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

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