使うにはまだリリースされていない 2.8.2(予定)か、最新git から使える。
3入力目をマスクにして、1入力目の映像と、2入力目の映像をマスクに合わせて出力する。マスクをどの程度指定するかで1入力目と2入力目の割合を指定できる。マスクの割合は各コンポーネント(YUVA, RGBA)の平均から1,2入力をどの程度合わせるかで指定する。0 ならば1入力目を、255(8bit)ならば2入力目を反映させる。
マスクの指定には別ファイルを使う方法と、フィルタを当てて各コンポーネントを調整する方法とがある。各コンポーネントを調整には lut
が使いやすい。
Windows の ffmpeg で生放送する方法 : LUT(ルックアップテーブル)
別ファイルを使う場合にはモノクロ映像を使うことでその部分にだけフィルタを当てるのが手軽になる。
以下方法が手軽に低負荷で出来るようになったが、今回の方法は完全に2つのフィルタを使い分けるわけではない。
ニコ生で高画質配信する複合フィルタの例
公式ドキュメント:FFmpeg Filters Documentation :: lut, lutrgb, lutyuv
関連記事
YUV、彩度、色相 を見える化する signalstats
オプションにはマスクに使うコンポーネントを指定できるが、1 から f までどれを使っているのかよくわからない。規定値は 0xf で全てのコンポーネントを対象とする。
続きを読むコマンド例
以下は全て YUV 動画を元とし、効果がわかりやすいようにノイズフィルタをかけている。
暗いところだけノイズ
輝度60以下にノイズ、60より大きいのを255にしてマスクしている
ffplay -i input -vf split=3[0][1][2];[0]noise=alls=100:allf=t+u[0a];[2]lutyuv=y="if(val\, if(gt(val\,60)\,255\)\,0)":u=255:v=255[2a];[0a][1][2a]maskedmerge
明るいところだけノイズ
輝度180以上にノイズ、180より小さいのを255にしてマスクしている
ffplay -i input -vf split=3[0][1][2];[0]noise=alls=100:allf=t+u[0a];[2]lutyuv=y="if(val\, if(lt(val\,180)\,255\)\,0)":u=255:v=255[2a];[0a][1][2a]maskedmerge
全体にノイズをかけて、暗いところだけぼかす
上2つのフィルタの応用
ffplay -i input -vf split=3[0][1][2];[0]smartblur[0a];[1]noise=alls=100:allf=t+u[1a];[2]lutyuv=y="if(val\, if(gt(val\,60)\,255\)\,0)":u=255:v=255[2a];[0a][1a][2a]maskedmerge
全体をくっきりさせて、暗いところだけぼかす
配信向きのフィルタ
ffplay -i input -vf split=3[0][1][2];[0]smartblur[0a];[1]unsharp[1a];[2]lutyuv=y="if(val\, if(gt(val\,60)\,255\)\,0)":u=255:v=255[2a];[0a][1a][2a]maskedmerge