タグ別アーカイブ: alpha_channel

アルファチャンネルをグレースケールで出力する alphaextract

映像にアルファチャンネルがあるときに alphaextract を使えばグレースケールで取り出すことができる。同時にフォーマットもグレースケール YUV に変換される。同じ効果のフィルタに extractplanes=a があり、これもグレースケールで出力する。透過部分の値は小さく、透過しない部分の値は大きくなる。

各映像チャンネルを分離する extractplanes

基本コマンド

0000bf(青)の透過した部分を黒で、透過しない部分を白の alphaextract.png で出力する。設定するオプションはない。
ffmpeg -f lavfi -i smptebars=d=1 -vf colorkey=0x0000bf:.01:.1,alphaextract -vframes 1 alphaextract.png

公式ドキュメント:FFmpeg Filters Documentation : alphaextract

別ファイルの情報から元映像を透過させる alphamerge

alphamerge は2番目の入力のグレースケール(グレースケールでなければ変換される)の白黒具合に応じて1番目の入力に透過情報を加える。透過具合については黒が透過し、白に近いほど透過しなくなり、出力は YUVA または ARGB, RGBA になる。アルファチャンネルを含む映像になるのでそれに対応したコーデックで出力しないとアルファチャンネルが消えてしまうのに注意。YUVA なら ffv1。RGBA なら utvideo または ffv1 で出力する。同じ機能のフィルタに mergeplanes があるがこちらの方が負荷が少し軽く、アルファチャンネルを追加する maskedmerge と負荷は変わらない。

各映像チャンネルを結合する mergeplanes
マスクして2入力を合わせる maskedmerge

基本コマンド

YUVA 出力の場合は ffv1
ffmpeg -i yuv -i gray -filter_complex alphamerge -vcodec ffv1 output.mkv
RGBA 出力の場合は utvideo または ffv1
ffmpeg -i rgb -i gray -filter_complex alphamerge -vcodec utvideo output.mkv
mergeplanes を使う例
ffmpeg -i yuv -i gray -filter_complex mergeplanes=0x00010210:yuva420p -vcodec ffv1 output.mkv

公式ドキュメント:FFmpeg Filters Documentation : alphamerge

plane を入れ替え、コピーする shuffleplanes

plane(YUV や RGB の個別チャンネル)を入れ替えたり、コピーしたりできる shuffleplanes フィルタの使い方。

オプション

plane の順番は一般的には YUVA, RGBA の順番になっているが、このフィルタは RGB/A には対応していない。YUV420P の場合 Y と UV では解像度が違うので Y と UV を入れ替えるには YUV444P に変換する必要がある。

  • map0
    第1 plane の入出力を指定する。省略すると入力と同じ映像を返す
  • map1
    第2 plane の入出力を指定する。省略すると入力と同じ映像を返す
  • map2
    第3 plane の入出力を指定する。省略すると入力と同じ映像を返す
  • map3
    第4 plane の入出力を指定する。省略すると入力と同じ映像を返す

続きを読む plane を入れ替え、コピーする shuffleplanes

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
続きを読む YUV RGB を比較計算する blend

マスクして2入力を合わせる maskedmerge

3入力目をマスクにして、1入力目の映像と2入力目の映像をマスクに合わせて出力する。マスクをどの程度指定するかで1入力目と2入力目の割合を指定できる。バージョンは3.0 以降から使える。アルファチャンネルを追加する alphamerge と負荷は変わらない。

別ファイルの情報から元映像を透過させる alphamerge

マスクの各チャンネル(YUVA, RGBA など)の値から1,2入力に対応したチャンネルがブレンド、またはスルーされる。0 ならば1入力目を、255(8bit)ならば2入力目を反映させる。既定値は1, 2入力がブレンドされる。アルファチャンネルは 0 が完全透過になる。出力フォーマットは1入力と同じになる。マスクをフルレンジに対応させるには1入力がフルレンジ(yuvj420p, gray など)に対応しておかなければならない。途中フルレンジで出力がリミテッドレンジならば最後に format=yuv420p をつけてレンジを直す。

マスクの指定には別ファイルを使う方法と、フィルタを当てて各コンポーネントを調整する方法とがある。各コンポーネントを調整には lut が使いやすい。別ファイルを使う場合にはモノクロ映像を使うことでその部分にだけフィルタを当てるのが手軽になる。

Windows の ffmpeg で生放送する方法 : LUT(ルックアップテーブル)

基本コマンド

ffmpeg -f lavfi -i color,format=rgba,split=3[0][1][2];[0]lutrgb=255:255:255:255[0a];[1]lutrgb=0:0:0:0[1a];[2]lutrgb=255:200:150:100[2a];[0a][1a][2a]maskedmerge=0x0 output

公式ドキュメント:FFmpeg Filters Documentation : maskedmerge
続きを読む マスクして2入力を合わせる maskedmerge

ffmpeg でクロマキー合成 その2

chromakey は出力フォーマットが YUVA になるので動画にクロマキー処理をした動画をオーバーレイするのに使う。バージョンは3.0 以降から使える。

RGBA で処理する colorkey はこちら:ffmpeg でクロマキー合成

基本コマンド

colorkey と基本的には同じ。
ffmpeg -i input1 -i input2 -filter_complex [1:0]chromakey=red:.03:.1[1a];[0:0][a1]overlay output
ffmpeg -i input1 -i input2 -filter_complex [1:0]chromakey=0xff0000:.03:.1[1a];[0:0][a1]overlay output

公式ドキュメント:FFmpeg Filters Documentation : chromakey
続きを読む ffmpeg でクロマキー合成 その2

各映像チャンネルを分離する extractplanes

チャンネルを分離して YUV で個別に出力できる。対応チャンネルは YUV, RGB, アルファ である。出力フォーマットは bgra。

公式ドキュメント:FFmpeg Filters Documentation : extractplanes

YUV をそれぞれ出力する例
ffmpeg -i input -filter_complex "extractplanes=y+u+v[y][u][v]" -map [y] -vcodec ffv1 y.mkv -map [u] -vcodec ffv1 u.mkv -map [v] -vcodec ffv1 v.mkv

Y だけ出力する例
ffmpeg -i input -filter_complex "extractplanes=y" -vcodec ffv1 y.mkv

Y だけ出力するのなら lutyuv でもできる
ffmpeg -i input -filter_complex "lutyuv=val:128:128" y.mp4

以下のようなエラーが出た場合は、extractplanes フィルタの前に format フィルタで yuv420p などと指定して改めてフォーマットを宣言する

The following filters could not choose their formats: Parsed_extractplanes_2
Consider inserting the (a)format filter near their input or output.
Error opening filters!

分離したチャンネルを合わせるには
各映像チャンネルを結合する mergeplanes
2入力の LUT を手軽に入れ替えられる lut2

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

分離したチャンネルを合わせたり入れ替えたり複製したり、フォーマットを変えたりできる。またアルファチャンネルのない映像に、他のチャンネルをアルファチャンネルに複製することもできる。チャンネルを入れ換えるだけなら lut2 でもでき、アルファチャンネルの追加なら alphamerge でもできる。
続きを読む 各映像チャンネルを結合する mergeplanes

明るいところ、暗いところにフィルタを当てる

明暗の度合いでもマスクできるのでこれを応用して一つの映像に複数のフィルタを使い分ける方法。特定色なら colorkey フィルタを使ってマスクすることもできる。一般的には映像をシャープにするほど容量は大きく、ぼかすほど容量は小さくなるので、シャープとぼかしを使い分けて高画質配信を目指す。

colorkey の使い方:ffmpeg でクロマキー合成

なぜぼかしも併用するかと言えばビットレートの節約になるのも正しいが、ニコ生のようなビットレート制限が厳しいところでは、低解像度で暗くて見えにくい部分にビットレートをたくさん割り当てる必要はないからである。
続きを読む 明るいところ、暗いところにフィルタを当てる