各映像チャンネルを結合する mergeplanes


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

各映像チャンネルを結合する mergeplanes」への4件のフィードバック

  1. | -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

    1. 通りすがり さんこんばんは

      yuv444p の高ビット深度で不具合がありそうなのでもう少し調べてバグレポートしてみます。

      1. | もう少し調べてバグレポートしてみます

        ああお手数掛けてどうもすみませんです。
        # gitのソースみたけどお手上げw

コメントを残す

メールアドレスが公開されることはありません。