分離したチャンネルを合わせたり入れ替えたり複製したり、フォーマットを変えたりできる。またアルファチャンネルのない映像に、他のチャンネルをアルファチャンネルに複製することもできる。チャンネルを入れ換えるだけなら lut2 でもでき、アルファチャンネルの追加なら alphamerge でもできる。
目次
オプション
- mapping
入力チャンネル順に YUVA、または RGBA と、それの順番を決める。詳しくは後述 - format
出力フォーマット。既定値:yuva444p
公式ドキュメント:FFmpeg Filters Documentation : mergeplanes
mapping について
指定形式は 0xAa[Bb[Cc[Dd]]] で、ABCD, abcd 順に YUVA、または RGBA を割り当てる。全てのチャンネルを割り振る必要は無く Yチャンネルを Aチャンネルにも割り振ってマスクにすることもできる。大文字がどのデータを、小文字がどこに割り当てるか決め、0 が1入力となり、大文字の部分の数字プラス1が入力数になる。解像度とフォーマットを合わせないとエラーになる。これだとわかりにくいので例を挙げる。
- Aa 00:Y に1入力のデータの Y(R)を割り当てる
- Bb 00:U に1入力のデータの Y(R)を割り当てる
- Cc 00:V に1入力のデータの Y(R)を割り当てる
- Dd 00:A に1入力のデータの Y(R)を割り当てる
- Aa 10:Y に2入力のデータの Y(R)を割り当てる
- Bb 10:U に2入力のデータの Y(R)を割り当てる
- Cc 10:V に2入力のデータの Y(R)を割り当てる
- Dd 10:A に2入力のデータの Y(R)を割り当てる
- Aa 01:Y に1入力のデータの U(G)を割り当てる
- Bb 01:U に1入力のデータの U(G)を割り当てる
- Cc 01:V に1入力のデータの U(G)を割り当てる
- Dd 01:A に1入力のデータの U(G)を割り当てる
- Aa 02:Y に1入力のデータの V(B)を割り当てる
- Bb 02:U に1入力のデータの V(B)を割り当てる
- Cc 02:V に1入力のデータの V(B)を割り当てる
- Dd 02:A に1入力のデータの V(B)を割り当てる
こちらのほうがわかりやすいかも。
- Aa 00:Y に1入力のデータの Y(R)を割り当てる
- Aa 10:Y に2入力のデータの Y(R)を割り当てる
- Aa 01:Y に1入力のデータの U(G)を割り当てる
- Aa 02:Y に1入力のデータの V(B)を割り当てる
- Bb 00:U に1入力のデータの Y(R)を割り当てる
- Bb 10:U に2入力のデータの Y(R)を割り当てる
- Bb 01:U に1入力のデータの U(G)を割り当てる
- Bb 02:U に1入力のデータの V(B)を割り当てる
- Cc 00:V に1入力のデータの Y(R)を割り当てる
- Cc 10:V に2入力のデータの Y(R)を割り当てる
- Cc 01:V に1入力のデータの U(G)を割り当てる
- Cc 02:V に1入力のデータの V(B)を割り当てる
- Dd 00:A に1入力のデータの Y(R)を割り当てる
- Dd 10:A に2入力のデータの Y(R)を割り当てる
- Dd 01:A に1入力のデータの U(G)を割り当てる
- Dd 02:A に1入力のデータの V(B)を割り当てる
基本的に YUVA、または RGBA の個別のデータか、YUVA、または RGBA の全てのデータともう一つのデータをマスクする形で使われる。
フィルタの例
yuv420p の動画をそのまま yuv420p に渡す
-vf format=yuv420p,mergeplanes=0x000102:yuv420p
yuv420p の Y を A にも割り当てる(輝度のマスク)
-vf format=yuva420p,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
| -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 にて期待通りの動作になっているのを確認。