ffmpeg には多くの映像フィルタと音声フィルタがあるが、その効果を調べるのに主観的な判断だけではなく、客観的な判断ができるように数値を映像に表示したり、ヒストグラムを表示したりすることで映像の差違を見える化する。null
フィルタを別のフィルタに変更することでフィルタを当てた同士で比較できる。
目次
使ったフィルタ一覧
- 文字を描写する drawtext
- YUV RGB を比較計算する blend
- 映像の上に映像をのせる overlay
- 2つの映像の画質評価をする ssim
- 2つの映像の画質評価をする PSNR
- ffmpeg でヒストグラムを表示する
- 一定間隔で映像に線を引く drawgrid
- YUV のデータを数値で表示する signalstats
- ffmpeg で YUV, RGB波形を表示する waveform
- 2チャンネルの値を2次元で表示する vectorscope
- メタデータを映像化する drawgraph, adrawgraph
- 各チャンネルのノイズ係数を調べる bitplanenoise
- 個別チャンネルの値を映像の場所毎に確認できる datascope
- Windows の ffmpeg で生放送する方法 : スタック(映像を並べる)
ヒストグラムで比較
フィルタを当てる前後をヒストグラムで比較する
中心がオリジナルのグラフ。左がpp
フィルタを当てたグラフ。右が差分で、黒い部分がフィルタを当てたグラフ、白い部分がオリジナルのグラフ
ffplay -i input -vf split[0][1];[0]pp,histogram=250:8,split[0a][2];[1]null,histogram=250:8,split[1a][3];[2][3]blend=c0_mode=difference[23];[0a][1a][23]hstack=3,drawgrid=0:0:16:16:green
YUV RGB を比較計算する blend
ffmpeg でヒストグラムを表示する
RGB で比較。
ffplay -i input -vf split[0][1];[0]pp,format=gbrp,histogram=250:8,split[0a][2];[1]null,format=gbrp,histogram=250:8,split[1a][3];[2][3]blend=all_mode=difference[23];[0a][1a][23]hstack=3,drawgrid=0:0:16:16:green
YUV の値を映像に表示する
[0] が上、[1] が下に並べる。
ffplay -i input -vf split[0][1];[0]null,signalstats,drawtext=fontfile=C\\://WINDOWS/Fonts/arial.ttf:textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white[0a];[1]null,signalstats,drawtext=fontfile=C\\://WINDOWS/Fonts/arial.ttf:textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white[1b];[0a][1b]vstack
動画サンプル:big buck bunny
ヒストグラムをオーバーレイする
RGB のヒストグラム
ffplay -i input -vf split=2[0][1];[1]format=rgba,histogram=50:6:2:bgopacity=0.5[1a];[0][1a]overlay
ffplay -i input -vf split[1],format=rgba,histogram=50:6:2:bgopacity=0.5,[1]overlay
さらに YUV の値を左上に表示する
YUV の映像のときに数値をさらに描写する。
ffplay -i input -vf split=2[0][1];[1]format=rgba,histogram=50:6:2:bgopacity=0.5[1a];[0]signalstats,drawtext=fontfile=C\\://WINDOWS/Fonts/arial.ttf:textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white[0a];[0a][1a]overlay=y=100
waveform で波形を表示する
映像の上にoverlay
フィルタを使った例。
ffplay -i input -vf split=2[0][1];[1]format=yuva420p,waveform=filter=color:graticule=green:opacity=1:bgopacity=0.75[1a];[0][1a]overlay
ffmpeg -i input -vf split=2[0][1];[1]format=yuva420p,waveform=filter=color:graticule=green:opacity=1:bgopacity=0.75[1a];[0][1a]overlay output
ffmpeg で YUV, RGB波形を表示する waveform
vectorscope で波形を表示する
ffmpeg -i input -vf vectorscope -c:a copy output
ffplay -i input -vf vectorscope=m=1:x=1:y=2:i=.04:e=0
drawgraph で YUV のグラフを表示する
ffplay -i input -vf signalstats,drawgraph=m1=lavfi.signalstats.YAVG:fg1=0xFF808080:m2=lavfi.signalstats.UAVG:fg2=0xFF0000FF:m3=lavfi.signalstats.VAVG:fg3=0xFFFF0000:min=0:max=255:bg=white:slide=scroll:mode=bar,drawgrid=0:0:0:32
ffplay -f lavfi -i "movie=input,signalstats,drawgraph=m1=lavfi.signalstats.YAVG:fg1=0x808080:m2=lavfi.signalstats.UAVG:fg2=0x0000FF:m3=lavfi.signalstats.VAVG:fg3=0xFF0000:min=0:max=255:bg=white:slide=scroll:mode=bar,drawgrid=0:0:0:32,format=yuv420p"
メタデータを映像化する drawgraph, adrawgraph
waveform、vectorscopeを併用する
ffmpeg -i input.mp4 -vf 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 -c:a copy output
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]"
ffplay / ffmpeg with audio and video filters – Stack Overflow
datascope で YUV の値を表示する
datascope
フィルタは各チャンネルの値を表示するフィルタ。
ffplay input -vf datascope=1280x720:0:0:0:0