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

コメントを残す

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

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