分離したチャンネルを合わせたり入れ替えたり、ピクセルフォーマットを変えたりできる。またアルファチャンネルのない映像に、他のチャンネルをアルファチャンネルに複製することもできる。チャンネルを入れ換えるだけならlut2
フィルタでもでき、アルファチャンネルの追加ならalphamerge
フィルタでもできる。
LUTを手軽に入れ替えられるlut2、tlut2、swapuv
別ファイルの情報から元映像を透過させる alphamerge
オプション
- mapping[int]
入力チャンネル順にYUVA、またはGBRと、それの順番を決める。詳しくは後述 - format[pix_fmt]
出力フォーマット
既定値:yuva444p
公式ドキュメント:FFmpeg Filters Documentation : mergeplanes
mappingについて
指定形式は0xAa[Bb[Cc[Dd]]]で、ABCD、abcd順にYUVA、またはGBRを割り当てる。全てのチャンネルを割り振る必要は無く YチャンネルをAチャンネルにも割り振ってマスクにすることもできる。大文字がどのデータを、小文字がどこに割り当てるか決め、0 が1入力となり、大文字の部分の数字プラス1が入力数になる。解像度とピクセルフォーマットを合わせないとエラーになる。これだとわかりにくいので例を挙げる。
- Aa 00:Y に1入力のデータの Y(G)を割り当てる
- Bb 00:U に1入力のデータの Y(G)を割り当てる
- Cc 00:V に1入力のデータの Y(G)を割り当てる
- Dd 00:A に1入力のデータの Y(G)を割り当てる
- Aa 10:Y に2入力のデータの Y(G)を割り当てる
- Bb 10:U に2入力のデータの Y(G)を割り当てる
- Cc 10:V に2入力のデータの Y(G)を割り当てる
- Dd 10:A に2入力のデータの Y(G)を割り当てる
- Aa 01:Y に1入力のデータの U(B)を割り当てる
- Bb 01:U に1入力のデータの U(B)を割り当てる
- Cc 01:V に1入力のデータの U(B)を割り当てる
- Dd 01:A に1入力のデータの U(B)を割り当てる
- Aa 02:Y に1入力のデータの V(R)を割り当てる
- Bb 02:U に1入力のデータの V(R)を割り当てる
- Cc 02:V に1入力のデータの V(R)を割り当てる
- Dd 02:A に1入力のデータの V(R)を割り当てる
こちらのほうがわかりやすいかも。
- Aa 00:Y に1入力のデータの Y(G)を割り当てる
- Aa 10:Y に2入力のデータの Y(G)を割り当てる
- Aa 01:Y に1入力のデータの U(B)を割り当てる
- Aa 02:Y に1入力のデータの V(R)を割り当てる
- Bb 00:U に1入力のデータの Y(G)を割り当てる
- Bb 10:U に2入力のデータの Y(G)を割り当てる
- Bb 01:U に1入力のデータの U(B)を割り当てる
- Bb 02:U に1入力のデータの V(R)を割り当てる
- Cc 00:V に1入力のデータの Y(G)を割り当てる
- Cc 10:V に2入力のデータの Y(G)を割り当てる
- Cc 01:V に1入力のデータの U(B)を割り当てる
- Cc 02:V に1入力のデータの V(R)を割り当てる
- Dd 00:A に1入力のデータの Y(G)を割り当てる
- Dd 10:A に2入力のデータの Y(G)を割り当てる
- Dd 01:A に1入力のデータの U(B)を割り当てる
- Dd 02:A に1入力のデータの V(R)を割り当てる
基本的に YUVA、または GBR の個別のデータか、YUVA、または GBR の全てのデータともう一つのデータをマスクする形で使われる。
フィルタの例
yuv420pの動画をそのままyuv420pに渡す。
-vf format=yuv420p,mergeplanes=0x000102:yuv420p
yuv420pのYをAにも割り当てる(輝度のマスク)。
最初にフォーマット変換が不要になっている(2021年11月18日)。
-vf format=yuva420p,mergeplanes=0x00010200:yuva420p
-vf mergeplanes=0x00010200:yuva420p
yuv420pの動画をyuv444pに変える。
-vf format=yuv420p,extractplanes=y+u+v[y][u][v];[u]scale=2*iw:2*ih[u2];[v]scale=2*iw:2*ih[v2];[y][u2][v2]mergeplanes=0x001020:yuv444p
yuv420pの動画のUとVを入れ替える。
-vf format=yuv420p,mergeplanes=0x000201:yuv420p
yuva444pの動画のYとAを入れ替える。
-vf format=yuva444p,mergeplanes=0x03010200:yuva444p
2入力のYを1入力のAにしたyuva420p。
-filter_complex [0:v][1:v]mergeplanes=0x00010210:yuva420p
yuv420pの動画のYを縦横半分にして、元映像のUVと併せたyuv444p。
-vf split[0][1];[0]extractplanes=y,scale=iw/2:-1[0a];[0a][1]mergeplanes=0x001112:yuv444p
RGBそれぞれに分けたチャンネルを元に戻す。このフィルタはplanarだけ対応しているのでピクセルフォーマットをgbrpにしている。
-vf format=gbrp,extractplanes=g+b+r[g][b][r];[g][b][r]mergeplanes=0x102000:gbrp
-vf format=gbrp,extractplanes=g+b+r,mergeplanes=0x102000:gbrp
| -filter_complex “format=yuv444p16le,extractplanes=y+u+v[y][u][v]”
とすると各チャンネルが gray16le で分配できるのに、その結果を
| -filter_complex “[0][1][2]mergeplanes=0x001020:yuv444p16le”
で結合するとおかしなことになる…
(yuv422の処理と被っている可能性あり)
ver.N-82117 で確認。
ffmpeg -hide_banner -y -v error -i 画像 -filter_complex “format=yuv444p16le,extractplanes=y+u+v[y][u][v]” -map [y] y.png -map [u] u.png -map [v] v.png
ffmpeg -hide_banner -y -v error -i y.png -i u.png -i v.png -filter_complex “[0][1][2]mergeplanes=0x001020:yuv444p16le” result.png
通りすがり さんこんばんは
yuv444p の高ビット深度で不具合がありそうなのでもう少し調べてバグレポートしてみます。
| もう少し調べてバグレポートしてみます
ああお手数掛けてどうもすみませんです。
# gitのソースみたけどお手上げw
trac でコミットの返信がありました。内容は未確認
http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=1a65d2a3ccc2a07e2da19d47c987e1e5a0bd77c6
http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=bf52730051202f5b4d5f06a399a236268e72e296
| 内容は未確認
N-82759-g1f5630a @ zeranoe にて期待通りの動作になっているのを確認。