分離したチャンネルを合わせたり入れ替えたり、ピクセルフォーマットを変えたりできる。またアルファチャンネルのない映像に、他のチャンネルをアルファチャンネルに複製することもできる。チャンネルを入れ換えるだけなら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

video – Merging RGB Channels in FFMPEG – Super User

5 thoughts on “各映像チャンネルを結合する mergeplanes

コメントを残す

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

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