音量をリアルタイムでメーター表示する 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
音量でメーターの色を変える発展的な使い方
-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にリンクしている。