クロマキー合成の仕組み
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:v]chromakey=...で、1 番(グリーンバックの動画)の緑を透明にし、[fg]という名前を付けます[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 でサイズが小さくなったわけではありません。実写のグリーンバック映像に同じコマンドを使えば、出力はこれよりずっと大きくなります。サイズは、ほぼ素材の情報量で決まります。
関連フィルタ
よくある質問
chromakey, colorkey, lumakey の違いは?
chromakey は、色差(クロマ)の近さで透明にする色を判定します。グリーンバックやブルーバック向きです。colorkey は、RGB の値の近さで判定します。仕組みは単純ですが、抜け方は粗くなります。lumakey は、明るさ(輝度)で判定します。白い背景を抜くときに役立ちます。
色と類似度の選び方は?
まず動画から 1 フレームを画像として取り出し、画像編集ソフトのスポイト(カラーピッカー)で背景の緑の正確な値を調べます。similarity は 0.10、blend は 0.05 から始め、縁に残る緑が消えるまで similarity を少しずつ上げてください。
人物の周りに緑のヘイロー(霞)が残る
グリーンバックの緑が、肌や髪に映り込んだもの(スピル)です。chromakey のあとに despill フィルタをつなぐか、緑の色相だけ彩度を下げてください。
影もキーアウトできる?
chromakey だけでは抜け残りやすいです。影になった緑は色差(クロマ)が弱く灰色に近づくので、明るい緑のキーカラーとの差が大きくなるためです。similarity を少しずつ上げると影も抜けますが、上げすぎると髪や黒い服など、被写体の暗い部分まで半透明になります。影が出ないように照明を当てるのが確実です。
既に圧縮された素材でも chromakey は効く?
効きますが、境目が汚くなりやすいです。圧縮された動画は、クロマサブサンプリング(4:2:0)で境目の細かい情報が失われているためです。similarity を大きめにして、多少の緑の縁(ヘイロー)は残るものと考えてください。