YUV RGB を比較計算する blend


2入力した映像の YUVA や RGBA を比較して結果を表示する blend の使い方。差分を調べて比較動画を作ったり、マスクした部分に別の映像を重ねたりいろいろな映像効果を作ることができる。

基本コマンド

比較動画として上に二つ並べて左下に差分(Y は 0 差分、UV は1入力)の動画を表示するコマンド例
ffplay -f lavfi "movie=left.mp4,setpts=PTS-STARTPTS,split[a1][a2];movie=right.mp4,setpts=PTS-STARTPTS,split[b1][b2];[a1][b1]blend=c0_mode=difference,pad=2*iw:ih:0:0[blend];[a2][b2]hstack[tmp];[tmp][blend]vstack"
比較動画として上に二つ並べて左下に差分(Y は 0 差分、UV は128)の動画を表示するコマンド例
ffplay -f lavfi "movie=left.mp4,setpts=PTS-STARTPTS,split[a1][a2];movie=right.mp4,setpts=PTS-STARTPTS,split[b1][b2];[a1][b1]blend=c0_mode=difference,lutyuv=val:128:128,pad=2*iw:ih:0:0[blend];[a2][b2]hstack[tmp];[tmp][blend]vstack"

公式ドキュメント:FFmpeg Filters Documentation : blend, tblend

オプション

blend オプションは1つめの入力をトップレイヤーに2つめの入力をボトムレイヤーとして2つの入力から1つの出力に変える。

YUV は {0,128,128}で黒、{128,128,128}で灰、{255,128,128}で白になり、{255,255,255}で明るい紫、{0,0,0}で緑になる。

詳しい処理はソースコードを参照。1入力を A、2入力を B とし、min が小さい方、max が大きい方、abs が絶対値とする。

  • 指定チャンネル以外は1入力を返す。
    • c0_mode[int]:G または Y チャンネル
    • c1_mode[int]:B または U チャンネル
    • c2_mode[int]:R または V チャンネル
    • c3_mode[int]:A チャンネル
    • all_mode[int]:全チャンネル
      • 0, addition:min(255, A + B)
      • 1, addition128:(A + B – 128)
      • 2, and:論理積
      • 3, average:色の平均(足して2で割る)
      • 4, burn:焼き込み(multiply より暗くなる)
      • 5, darken:min(A, B)
      • 6, difference:abs(A – B)
      • 7, difference128:(128 + A – B)
      • 8, divide:(float)A / ((float)B) * 255
      • 9, dodge:覆い焼き(screen より明るくなる)
      • 10, exclusion:除外(difference より弱め)
      • 11, freeze
      • 12, glow
      • 13, hardlight:ハードライト(softlight より強め)
      • 14, hardmix
      • 15, heat
      • 16, lighten:max(A, B)
      • 17, linearlight
      • 18, multiply:乗算(暗くなる)
      • 19,multiply128
      • 20, negation:255 – abs(255 – A – B)
      • 21, normal
      • 22, or:理論和
      • 23, overlay:オーバーレイ(コントラストが上がりくっきりになる)
      • 24, phoenix:min(A, B) – max(A, B) + 255
      • 25, pinlight
      • 26, reflect
      • 27, screen:スクリーン(明るめ)
      • 28, softlight:ソフトライト(overlay より強め)
      • 29, subtract:max(0, A – B)
      • 30, vividlight
      • 31, xor:排他的論理和
    • モードの効果具合を調整できる。1 より小さくするとそれだけモードの反映が少なくなる。詳しい計算方法は 1 – n とした値を指定したときに モード反映 + n*(1入力 – モード反映) が反映される
      • c0_opacity[double]:G または Y チャンネル
        既定値:1
        範囲:0 から 1 まで
      • c1_opacity[double]:B または U チャンネル
        既定値:1
        範囲:0 から 1 まで
      • c2_opacity[double]:R または V チャンネル
        既定値:1
        範囲:0 から 1 まで
      • c3_opacity[double]:A チャンネル
        既定値:1
        範囲:0 から 1 まで
      • all_opacity[double]:全チャンネル
        既定値:1
        範囲:0 から 1 まで
    • expr で適応する時間を指定できる
      • c0_expr[string]:G または Y チャンネル
      • c1_expr[string]:B または U チャンネル
      • c2_expr[string]:R または V チャンネル
      • c3_expr[string]:A チャンネル
      • all_expr[string]:全チャンネル
          指定できる計算書式
        • N:現在のフレームナンバーを返す
        • X, Y:入力した座標
        • W, H:入力したチャンネルの座標
        • SW, SH:入力したチャンネルの縦横の座標比率。YUV4:2:0 の luma だと 1,1。chroma だと 0.5,0.5
        • T:タイムスタンプ秒を返す
        • TOP, A:1入力の現在のチャンネルを返す
        • BOTTOM, B:2入力の現在のチャンネルを返す
    • shortest
      2入力の内で映像の時間が短い場合にそこで処理を止めるか 既定値:0
    • repeatlast
      2入力の内で映像の時間が短い場合に最終フレームの表示を継続するか
      既定値:1

    expr の使用例(1秒から3秒にかけてクロスフェードをかける)
    ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[0:v][1:v]blend=all_expr='A*(if(lte(T,1),1,if(gte(T,3),0,1-T/3)))+B*(if(lte(T,1),0,if(gte(T,3),1,T/3)))'" -t 6 fade.mp4

    expr の使い方:ffmpeg で使える計算書式

コメントを残す

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