クロマキー合成の仕組み

chromakey は、映像の中の決まった色(ふつうは緑か青)を透明にするフィルタです。画素ごとの透明度の情報をアルファと呼びます。透明になった部分の後ろに別の映像を置くと、被写体だけを別の背景に重ねられます。

合成したあとで被写体と背景の色味がそろわないときは、curves フィルタによるトーンカーブ色補正で色を近づけると自然に見えます。

基本コマンド

グリーンバックをキーイングしてアルファ付き映像を生成する

緑の部分を透明にして(キーイング)、透明度付きの動画として保存します。H.264 では透明度を保存できないので、ここでは PNG 形式の映像を MOV に入れています。

ffmpeg -i input.mp4 \
  -vf "chromakey=0x00FF00:0.1:0.2" \
  -c:v png output.mov

引数は color:similarity:blend の順に書きます。

  • 0x00FF00:透明にする色(キーカラー)。緑を HEX で指定しています
  • 0.1:類似度(similarity)。0.00001〜1 で、大きいほどキーカラーから離れた色まで透明にします
  • 0.2:ブレンド(blend)。0〜1 で、大きいほど境目が半透明になり、なめらかになります

背景静止画と合成する

背景の画像の上に、グリーンバックの動画を重ねます。-i で渡した順に、背景が 0 番、動画が 1 番になります。

ffmpeg -framerate 30 -i background.jpg -i input.mp4 \
  -filter_complex "[1:v]chromakey=0x00FF00:0.1:0.2[fg]; [0:v][fg]overlay" \
  output.mp4
  1. [1:v]chromakey=... で、1 番(グリーンバックの動画)の緑を透明にし、[fg] という名前を付けます
  2. [0:v][fg]overlay で、0 番(背景)の上に [fg] を重ねます

出力のフレームレートは、背景に合わせて決まります。静止画は -framerate を付けないと 25fps として読み込まれるので、30fps の動画が 25fps になり、6 フレームに 1 枚が捨てられます。-framerate には、動画と同じフレームレートを指定してください。

背景動画と合成する

背景を動画にする場合も、書き方は同じです。0 番に背景の動画を渡します。

ffmpeg -i background.mp4 -i greenscreen.mp4 \
  -filter_complex "[1:v]chromakey=0x00FF00:0.15:0.1[fg]; [0:v][fg]overlay" \
  output.mp4

パラメータ詳細

パラメータ 説明 推奨値
color キーカラー(色名またはHEX)。色名の green は #008000 の暗い緑です 0x00FF00(色名なら lime)
similarity キーカラーの類似度しきい値(0.00001〜1) 0.08〜0.2
blend エッジのブレンド量(0〜1) 0.0〜0.3

similarity の目安

値 効果
0.01〜0.05 厳密(完全に緑の部分のみ除去)
0.1〜0.2 標準(多少の色ムラに対応)
0.3〜 広め(不均一な照明に対応、ただし被写体も除去される可能性)

ブルーバック合成

ffmpeg -framerate 30 -i background.jpg -i bluescreen.mp4 \
  -filter_complex "[1:v]chromakey=0x0000FF:0.15:0.1[fg]; [0:v][fg]overlay" \
  output.mp4

color を 0x0000FF(青)に変えれば、ブルーバックも同じ手順で抜けます。背景をぼかしたいときは、合成の前に背景の映像へboxblur フィルタでボックスブラーをかけると、被写体が目立ちます。

任意の色をキーカラーにする

キーカラーには、純粋な緑や青以外の色も指定できます。動画から 1 フレームを画像として書き出し、画像編集ソフトのスポイトで抜きたい色の RGB 値を調べてから、0x に続けて HEX で書きます。次の例では、少し暗い緑を指定しています。

ffmpeg -framerate 30 -i background.jpg -i custom_screen.mp4 \
  -filter_complex "[1:v]chromakey=0x00B400:0.12:0.15[fg]; [0:v][fg]overlay" \
  output.mp4

colorkey フィルタとの違い

colorkey も色を透明にするフィルタですが、色を比べるときの表し方(色空間)が違います。

フィルタ 色空間 特徴
chromakey YCbCr(YUV) 映像標準に適合、実写に適する
colorkey RGB シンプル、CGやアニメに適する

実写のグリーンバック合成には、chromakey(YUV)が向いています。

アルファチャンネル付きで保存する

透明度(アルファチャンネル)を残したまま保存するには、アルファに対応したコーデックとコンテナを選びます。次の例は MOV と WebM です。

# ProRes 4444 (MOV) でアルファ付き保存
ffmpeg -i greenscreen.mp4 \
  -vf "chromakey=0x00FF00:0.1:0.2" \
  -c:v prores_ks -profile:v 4 output.mov

# WebM (VP9) でアルファ付き保存
ffmpeg -i greenscreen.mp4 \
  -vf "chromakey=0x00FF00:0.1:0.2" \
  -c:v libvpx-vp9 -auto-alt-ref 0 output.webm

注意点

  • chromakey は FFmpeg 本体(libavfilter)に入っているフィルタです。追加のライブラリは要りません。
  • グリーンバックは、ムラのない均一な照明で撮るほどきれいに抜けます。
  • similarity を大きくしすぎると、被写体の緑っぽい部分(服や目など)まで透明になります。
  • blend を大きくすると境目が半透明になりますが、縁に色の残り(フリンジ)が出やすくなります。

実測: 処理時間とサイズ

次のコマンドで、処理時間と出力サイズを測りました。

ffmpeg -i background.jpg -i greenscreen.mp4 -filter_complex "[1:v]chromakey=0x00FF00:0.12:0.08[fg];[0:v][fg]overlay" -c:v libx264 -crf 23 -preset medium -shortest output.mp4
項目 実測値
処理時間 35.7 秒(実時間の 3.36 倍速)
出力サイズ 10.72 MB

計測環境: Intel Core i9-14900KF(32スレッド)、FFmpeg 8.1(gyan.dev)、1080p/30fps・2分(3600 フレーム)のグリーンバック素材、2026-09-05。このコマンドには -framerate がないので、出力は 25fps・3001 フレームです。計測は同時に走らせず、順番に実行しました。同じ計測の全データはデータセットで公開しています。

なぜこの数字になるのか

時間の大半は、エンコードではなくキーイングにかかっています。同じ素材で確かめると、エンコードせずにフィルタだけを通しても(出力を -f null - にする)ほぼ同じ時間がかかり、フィルタなしで再エンコードだけすると 4 分の 1 ほどで終わりました。chromakey は画素ごとにキーカラーとの色の差を計算するので、1080p の映像では重い処理です。また、chromakey も overlay もデコードした画素を書き換えるフィルタなので、-c copy は使えず、全フレームを x264 で再エンコードすることにもなります。

映像を再エンコードしない処理と比べると、差はさらに大きくなります。同じ計測で、-map 0 -c copy は 0.41 秒、-movflags +faststart は 0.49 秒、映像はコピーのまま音声だけを再エンコードしてフェードする処理は 1.03 秒でした。設定を試すときは、先に短く切った動画で確かめると待ち時間を減らせます。

出力の 10.72 MB は、サイズの目安にしないでください。計測に使ったグリーンバック素材はコンピュータで生成した映像で、実写と違ってノイズも粒子感もありません。x264 にとっては、とても圧縮しやすい素材でした。10.72 MB は素材の性質によるもので、chromakey でサイズが小さくなったわけではありません。実写のグリーンバック映像に同じコマンドを使えば、出力はこれよりずっと大きくなります。サイズは、ほぼ素材の情報量で決まります。

関連フィルタ

  • colorkey — RGB色空間によるカラーキー
  • lumakey — 輝度値によるキーイング
  • overlay — 映像の重ね合わせ

よくある質問

chromakey, colorkey, lumakey の違いは?

chromakey は、色差(クロマ)の近さで透明にする色を判定します。グリーンバックやブルーバック向きです。colorkey は、RGB の値の近さで判定します。仕組みは単純ですが、抜け方は粗くなります。lumakey は、明るさ(輝度)で判定します。白い背景を抜くときに役立ちます。

色と類似度の選び方は?

まず動画から 1 フレームを画像として取り出し、画像編集ソフトのスポイト(カラーピッカー)で背景の緑の正確な値を調べます。similarity は 0.10、blend は 0.05 から始め、縁に残る緑が消えるまで similarity を少しずつ上げてください。

人物の周りに緑のヘイロー(霞)が残る

グリーンバックの緑が、肌や髪に映り込んだもの(スピル)です。chromakey のあとに despill フィルタをつなぐか、緑の色相だけ彩度を下げてください。

影もキーアウトできる?

chromakey だけでは抜け残りやすいです。影になった緑は色差(クロマ)が弱く灰色に近づくので、明るい緑のキーカラーとの差が大きくなるためです。similarity を少しずつ上げると影も抜けますが、上げすぎると髪や黒い服など、被写体の暗い部分まで半透明になります。影が出ないように照明を当てるのが確実です。

既に圧縮された素材でも chromakey は効く?

効きますが、境目が汚くなりやすいです。圧縮された動画は、クロマサブサンプリング(4:2:0)で境目の細かい情報が失われているためです。similarity を大きめにして、多少の緑の縁(ヘイロー)は残るものと考えてください。