3入力目をマスクにして、1入力目の映像と2入力目の映像をマスクに合わせて出力する。マスクをどの程度指定するかで1入力目と2入力目の割合を指定できる。アルファチャンネルを追加するalphamerge
フィルタと負荷は変わらない。
別ファイルの情報から元映像を透過させる alphamerge
マスクの各チャンネル(YUVA、RGBAなど)の値から1、2入力に対応したチャンネルがブレンド、またはスルーされ、スルーされるときは1入力目がそのまま出力される。3入力目の各チャンネルのピクセル値が0ならば1入力目を、255(8bit)ならば2入力目が出力させる。既定値は1、2入力がブレンドされる。アルファチャンネルは0が完全透過になる。
マスクの指定には別ファイルを使う方法と、フィルタを当てて各チャンネルを調整する方法とがある。各チャンネルを調整にはlut
フィルタが使いやすい。別ファイルを使う場合にはモノクロ映像を使うことでその部分にだけフィルタを当てるのが手軽になる。
Windows の ffmpeg で生放送する方法 : LUT(ルックアップテーブル)
基本コマンド
ffmpeg -i input1 -i input2 -i input3 -filter_complex maskedmerge=15 -c:a copy output
公式ドキュメント:FFmpeg Filters Documentation : maskedmerge
オプション
- planes[int]
フィルタを当てるチャンネル指定。フィルタが当たらなければ1入力のチャンネルが出力される
詳しくはffmpeg について | チャンネルの順番と注意点を参照
既定値:15(すべてのチャンネル)
範囲:0 から 15 まで
コマンド例
以下は全て YUV 動画を元とし、効果がわかりやすいようにノイズフィルタをかけている。マスク部分のlutyuv
フィルタのUVは、(0:0)にするとYに応じてUVにフィルタを当てる。(255:255)にすると UVは2入力だけ反映させる。
暗いところだけノイズ
輝度65以下にnoise
フィルタを当てる。
ffplay -i input -vf split=3[0v][1v][2v];[0v]noise=alls=100:allf=t+u[0v];[2v]lutyuv=y='255*gt(val\,65)':u=255:v=255[2v];[0v][1v][2v]maskedmerge
明るいところだけノイズ
輝度160以上にnoise
フィルタを当てる。
ffplay -i input -vf split=3[0v][1v][2v];[0v]noise=alls=100:allf=t+u[0v];[2v]lutyuv=y='255*lt(val\,160)':u=255:v=255[2v];[0v][1v][2v]maskedmerge
特定の区間だけ
輝度119以上137以下にnoise
フィルタを当てる。
ffplay -i input -vf split=3[0v][1v][2v];[0v]noise=alls=100:allf=t+u[0v];[2v]lutyuv=y='255*if(between(val\,119\,137)\,0\,1)':u=255:v=255[2v];[0v][1v][2v]maskedmerge
公式ドキュメント:FFmpeg Filters Documentation : lut, lutrgb, lutyuv
その他の方法
以下方法が手軽に低負荷で出来るようになったが、今回の方法でもチャンネルを指定することで2つのフィルタを使いわけることができる。
似たフィルタ