ffmpeg 3.2 でリリースしたビデオフィルタ。映像を3入力し、1入力目を基本の映像として、1入力目と比較して2入力目は差分の値がプラスのときに、1入力と比較して3入力目は差分の値がマイナスのときに、その差分だけ1入力と入れ換えるmaskedclamp
フィルタの使い方。同じようなことがblend
フィルタでもできるが、こちらは3入力できるところが特徴である。4.2.2 以降のバージョンで変更があり挙動がよくわからなくなっている。
基本コマンド
同じ映像を3入力しても出力映像は変わらない。
ffmpeg -i input -vf split=3[0][1][2];[0][1][2]maskedclamp=undershoot=0:overshoot=0:planes=15 output
ffplay -i input -vf split=3,maskedclamp=0:0:15
公式ドキュメント:FFmpeg Filters Documentation : maskedclamp
オプション
- undershoot[int]
2入力のプラスされた差分を指定した値だけマイナスにする。マイナスにしても1入力の値は超えない。4.2.2 以降で設定の影響がわからなくなった
既定値:0
範囲:0 から 65535 まで - overshoot[int]
3入力のマイナスされた差分を指定した値だけプラスにする。プラスにしても1入力の値は超えない。4.2.2 以降ではマイナスされた差分を指定した値だけプラスにする。プラスにしても1入力の値は超えない。さらにマイナス部分が丁度無くなったところから2入力のプラスされた差分を指定した値だけマイナスにする。マイナスにしても1入力の値は超えない
既定値:0
範囲:0 から 65535 まで - planes[int]
フィルタを当てるチャンネル指定
詳しくはffmpeg について | チャンネルの順番と注意点を参照
既定値:15(すべて)
挙動を調べる
2入力目のYを+10して、3入力目のYを-10にしている。overshoot=0で3入力目のマイナスがそのまま影響している。
ffplay -f lavfi -i color,geq=lum='st(0,14);(255/(ld(0)-1))*trunc(X/(W/ld(0))):cb=128:cr=128' -vf split=4[0][1][2][3];[1]lutyuv=val+10:val:val[1v];[2]lutyuv=val-10:val:val[2v];[0][1v][2v]maskedclamp=undershoot=0:overshoot=0:planes=15,signalstats,drawtext=y=40:fontfile=C\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:textfile=signalstat_drawtext.txt[b];[3]signalstats,drawtext=y=40:fontfile=C\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:textfile=signalstat_drawtext.txt[t];[t][b]vstack
overshoot=10で3入力目のマイナスと同じ値なので元の映像と同じになる(下のコマンドだと0に-10しても0のままでさらに+10しているから元に戻らない)。
ffplay -f lavfi -i color,geq=lum='st(0,14);(255/(ld(0)-1))*trunc(X/(W/ld(0))):cb=128:cr=128' -vf split=4[0][1][2][3];[1]lutyuv=val+10:val:val[1v];[2]lutyuv=val-10:val:val[2v];[0][1v][2v]maskedclamp=undershoot=0:overshoot=10:planes=15,signalstats,drawtext=y=40:fontfile=C\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:textfile=signalstat_drawtext.txt[b];[3]signalstats,drawtext=y=40:fontfile=C\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:textfile=signalstat_drawtext.txt[t];[t][b]vstack
overshoot=15で(-10+15=5)になる。
ffplay -f lavfi -i color,geq=lum='st(0,14);(255/(ld(0)-1))*trunc(X/(W/ld(0))):cb=128:cr=128' -vf split=4[0][1][2][3];[1]lutyuv=val+10:val:val[1v];[2]lutyuv=val-10:val:val[2v];[0][1v][2v]maskedclamp=undershoot=0:overshoot=15:planes=15,signalstats,drawtext=y=40:fontfile=C\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:textfile=signalstat_drawtext.txt[b];[3]signalstats,drawtext=y=40:fontfile=C\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:textfile=signalstat_drawtext.txt[t];[t][b]vstack
4.2.2 以前
color
ソースはリミテッドレンジの YUV(16:128:128)なので効果がわかりやすいようにlutyuv
フィルタでフルレンジ(0:128:128)に変換している。lutyuv
フィルタの最初の引数が Y になるので(100:128:128)に識別子 1 は変換されmaskedclamp
の2入力になる。すると1入力と2入力を比較して Y が +100 なので出力は(100:128:128)になるが、maskedclamp
の最初の引数が 5 なので -5 して(95:128:128)になる。
ffplay -f lavfi color -vf lutyuv=0:128:128,split=3[0][1][2];[1]lutyuv=100[1a];[0][1a][2]maskedclamp=5:0:1,signalstats,drawtext=fontfile=C\://WINDOWS/Fonts/arial.ttf:textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white
今度はmaskedclamp
の3引数 planes=0 にしてどのチャンネルも影響を受けないようにすると出力結果は元のフルレンジ(0:128:128)のままである。
ffplay -f lavfi color -vf lutyuv=0:128:128,split=3[0][1][2];[1]lutyuv=100[1a];[0][1a][2]maskedclamp=5:0:0,signalstats,drawtext=fontfile=C\://WINDOWS/Fonts/arial.ttf:textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white