映像フィルタを当てる前後のデータを見える化する


ffmpeg には多くの映像フィルタと音声フィルタがあるが、その効果を調べるのに主観的な判断だけではなく、客観的な判断ができるように数値を映像に表示したり、ヒストグラムを表示したりすることで映像で差違を見える化する。null フィルタを別のフィルタに変更することでフィルタを当てた同士で比較できる。

ヒストグラムで YUV を比較

フィルタを当てる前後をヒストグラムで比較する

中心がオリジナルのグラフ。左がフィルタを当てたグラフ。右が差分で、黒い部分がフィルタを当てたグラフ、白い部分がオリジナルのグラフ
ffplay input -vf split[0][1];[0]pp,histogram,split[0a][0b];[1]null,histogram,split[1a][1b];[0b][1b]blend=c0_mode=difference[01];[0a][1a][01]hstack=3

ヒストグラムで比較

さらに動画を右に配置する

解像度 640×360 の動画を右に配置し、上が 0 識別子のフィルタを当てた動画、下が 1 識別子の動画。640×360 の動画でない場合は scale=640x360 を最初の split の前につなぐ
ffplay input -vf split[0][1];[0]pp,split[0a][0b];[0a]histogram=230:10,split[0c][0d];[1]null,split[1a][1b];[1a]histogram=230:10,split[1c][1d];[0c][1c]blend=c0_mode=difference[01];[0d][1d][01]hstack=3[l];[0b][1b]vstack[r];[l][r]hstack

さらに YUV の値を映像に表示する

ffplay input -vf split[0][1];[0]pp,split[0a][0b];[0a]histogram=230:10,split[0c][0d];[1]null,split[1a][1b];[1a]histogram=230:10,split[1c][1d];[0c][1c]blend=c0_mode=difference[01];[0d][1d][01]hstack=3[l];[0b]signalstats,drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white[0e];[1b]signalstats,drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white[1e];[0e][1e]vstack[r];[l][r]hstack

クリックして拡大

ヒストグラムを透過させてオーバーレイする

ヒストグラムを右上に配置する

入力映像の縦解像度を3で割って10引いた値を histogram の最初の引数に、次に引いた10を指定する。overlay=W-woverlay だけにすれば左上に配置する
ffplay input -vf split[1],format=yuva420p,histogram=170:10,[1]overlay=W-w

さらに YUV の値を左上に表示する

上のコマンドと同じように histogram フィルタの値を指定する
ffplay input -vf signalstats,split[1],format=yuva420p,histogram=170:10,[1]overlay=W-w,drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white

ヒストグラムをだけを表示する

ヒストグラムをチャンネル毎に縦に並べて表示する

ffplay input -vf histogram

ヒストグラムを1つの映像に重ねて表示する

ffplay input -vf histogram=display_mode=overlay

drawgraph で YUV のグラフを表示する

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 の表示例。Y が灰、U が青、V が赤

datascope で YUV の値を表示する

datascope フィルタは各チャンネルの値を表示するフィルタ
ffplay input -vf datascope=1280x720:0:0:0:0

datascope の出力サンプル

SSIM, PNSR で比較する

input1 に元の動画を、input2 に比較する動画を入力する
結果はコンソールに表示される
ffmpeg -i input1 -i input2 -filter_complex ssim -an -f null -
ffmpeg -i input1 -i input2 -filter_complex psnr -an -f null -

md5, sha256, CRC32 を調べる

結果はコンソールに表示される
ffmpeg -i input -f hash -hash md5 -
ffmpeg -i input -f hash hash sha256 -
ffmpeg -i input -f hash -hash CRC32 -

そのほかにも調べられる:FFmpeg Formats Documentation : hash

使用したフィルタ

コメントを残す

メールアドレスが公開されることはありません。

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