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

使ったフィルタ一覧

ヒストグラムで比較

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

中心がオリジナルのグラフ。左が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

signalstats、drawtext フィルタの表示例

動画サンプル: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

signalstats、drawtext、histogram-RGB フィルタの表示例

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

2チャンネルの値を2次元で表示する vectorscope

vectorscope の表示例

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

drawgraph の表示例。Y が灰、U が青、V が赤

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

個別チャンネルの値を映像の場所毎に確認できる datascope

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 -

2つの映像の画質評価をする ssim
2つの映像の画質評価をする PSNR

映像に SSIM、PNSR をオーバーレイする。この例では1入力にunsharpフィルタを使ってその差を表示している。
ffplay -i input -vf split=3[a0][a1][b];[b]unsharp,split[b0][b1];[a0][b0]ssim,drawtext=fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:textfile=metadata_ssim.txt[s];[a1][b1]psnr,drawtext=y=40:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"PSNR ("%{metadata\:lavfi.psnr.psnr_avg})',crop=125:30:0:40[p];[s][p]overlay=0:40

そのほかに vmaf スコアも調べられる。
新しい映像の品質評価 libvmaf

bitplanenoise でノイズ係数を調べる

ffmpeg -i input -vf bitplanenoise=bitplane=7,metadata=mode=print:file=noise.txt -an -f null -

各チャンネルのノイズ係数を調べる bitplanenoise

左にbilateralフィルタを当ててノイズ係数を比較してる。
ffplay -i input -vf split[2],bilateral=planes=7,bitplanenoise=7,crop=iw/2:ih:0:0,drawtext=y=20:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:line_spacing=2:textfile=bitplanenoise_drawtext.txt[l];[2]bitplanenoise=7,crop=iw/2:ih:0:0,drawtext=y=20:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:line_spacing=2:textfile=bitplanenoise_drawtext.txt[r];[l][r]hstack

md5, sha256, CRC32 を調べる

結果はコンソールに表示される。

ffmpeg -v error -i input -f hash -hash md5 -
ffmpeg -v error -i input -f hash -hash sha256 -
ffmpeg -v error -i input -f hash -hash CRC32 -

ストリーム毎のハッシュも調べられる。
ffmpeg -v error -i stereo.mp3 -filter_complex "[0:a]pan=mono|c0=c0[left];[0:a]pan=mono|c0=c1[right]" -map "[left]" -map "[right]" -f streamhash -hash md5 -

python – How to compare audio channel differences with FFmpeg? – Stack Overflow

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

コメントを残す

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

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