音量をリアルタイムでバー表示する ffmpeg の showvolume の使い方。出力フォーマットは RGBA。難点は dB の値までは表示されないところだが、条件をつければ指定 dB の範囲に色をつけて判断できる。
基本コマンド
ffmpeg -i input -filter_complex showvolume -acodec copy output
ffplay -f lavfi -i amovie=input,showvolume
オプション内容
- rate, r
映像のフレームレート。規定値:25
- b
音量バー同士の隙間幅。範囲:0 – 5(int)。規定値:1
- w
音量バーの横幅。範囲:40 – 1080(int)。規定値:400
- h
音量バーの縦幅。範囲:1 – 100(int)。規定値:20
- f
バーのフェード。小さい値ほど影が残る。範囲:1 – 255(int)。規定値:20
- c
バーの色を指定。色名指定はできない。色指定は 0xaabbggrr 形式
VOLUME は 0dB を示す。if文を使って音量によって色を変えることも出来る
規定値:if(gte(VOLUME,-2), if(gte(VOLUME,-1),0xff, 0xffff),0xff00)
0dB から -1dB 未満は 0xff(red), -1dB から -2dB 未満は 0xffff(yellow),
-2dB 以下は 0xff00(lime)
- t
バーにチャンネル名を乗せる。規定値:1
動画にオーバーレイするコマンド例
showvolume は音声を映像に変えるフィルタなので vf, af が使えず、lavfi で読み込むか、filter_complex を使う。
コマンドは四隅の2方向、計8コマンド
showvolume で規定値のままオーバーレイすると透過して見えないので colorkey を使って見えるようにしている。colorkey を使わない場合は透過色を変更する。
- 左上、右方向
ffmpeg -i input -filter_complex showvolume,colorkey=black:.5[a];[0:0][a]overlay -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
- 左上、下方向
ffmpeg -i input -filter_complex showvolume,transpose=cclock_flip,colorkey=black:.5[a];[0:0][a]overlay -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
- 左下、右方向
ffmpeg -i input -filter_complex showvolume,colorkey=black:.5[a];[0:0][a]overlay=0:H-h -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
- 左下、上方向
ffmpeg -i input -filter_complex showvolume,transpose=cclock,colorkey=black:.5[a];[0:0][a]overlay=0:H-h -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
- 右上、左方向
ffmpeg -i input -filter_complex showvolume,hflip,colorkey=black:.5[a];[0:0][a]overlay=W-w:0 -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
- 右上、下方向
ffmpeg -i input -filter_complex showvolume,transpose=cclock_flip,colorkey=black:.5[a];[0:0][a]overlay=W-w:0 -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
- 右下、左方向
ffmpeg -i input -filter_complex showvolume,hflip,colorkey=black:.5[a];[0:0][a]overlay=W-w:H-h -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
- 右下、上方向
ffmpeg -i input -filter_complex showvolume,transpose=cclock,colorkey=black:.5[a];[0:0][a]overlay=W-w:H-h -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
FFmpeg Filters Documentation :: transpose
colorkey を使ってバーの黒い部分を透過させている:ffmpeg でクロマキー合成
音量でバーの色を変える発展的な使い方
showvolume の色を変更しないと透過の規定値が ff なので動画にオーバーレイするとバーが見えなくなる。特定文字はエスケープしないとエラーになるのを注意する。
-6dB なのでバーの色は lime になる
ffplay -f lavfi aevalsrc="sin(440*2*PI*t):s=8000,volume=1/2,showvolume"
透過が規定値なのでバーが見えない
ffmpeg -f lavfi -i color=white:size=512x384 -f lavfi -i aevalsrc="sin(440*2*PI*t):s=8000,volume=1/2,showvolume" -filter_complex [0:0][1:0]overlay -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
バーの色を 0x7f00ff00(lime) 指定して見える
ffmpeg -f lavfi -i color=white:size=512x384 -f lavfi -i aevalsrc="sin(440*2*PI*t):s=8000,volume=1/2,showvolume=c=0x7f00ff00" -filter_complex [0:0][1:0]overlay -vcodec rawvideo -acodec pcm_s16le -f avi pipe: | ffplay -
出力例(color=0xf0f0ff)
![]()
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 avi pipe: | 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 avi pipe: | 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 avi pipe: | ffplay -
ffmpeg で使える計算書式
colorchannelmixer の使い方