動画が暗い、色が薄いと感じたら、FFmpeg のフィルタで明るさや色味を補正できます。明るさ・コントラスト・彩度をまとめて変えるなら eq が手軽です。トーンカーブで細かく調整するなら curves、暗い部分・中間・明るい部分ごとに色味を変えるなら colorbalance を使います。

左が元映像、右が colorbalance=rs=0.3:bs=-0.3,eq=saturation=1.15。rs・bs は暗い部分(シャドウ)だけに効くので、上着やズボンなどの暗い部分が赤みを帯び、明るい部分はほとんど変わりません。
素材: Tears of Steel (CC) Blender Foundation | mango.blender.org、CC BY 3.0。映画の1フレームを切り出し、フィルターで加工しています。
eq フィルタ — 明度・コントラスト・彩度の基本補正
いちばん手軽な色調整フィルタです。変えたい項目だけを、コロン(:)で区切って書きます。書かなかった項目は元のままです。各パラメータの細かい動きはeq フィルタで明度・コントラスト・彩度を調整するを見てください。
ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2:saturation=1.3:gamma=1.0" output.mp4
| パラメータ | 範囲 | デフォルト | 説明 |
|---|---|---|---|
brightness |
-1.0〜1.0 | 0 | 明度(0が変化なし) |
contrast |
-1000〜1000 | 1 | コントラスト(1が変化なし) |
saturation |
0〜3.0 | 1 | 彩度(1が変化なし、0はグレースケール) |
gamma |
0.1〜10 | 1 | ガンマ補正(1が変化なし) |
よく使う補正例
明るさを少し上げて、コントラストを強めます。
ffmpeg -i input.mp4 -vf "eq=brightness=0.05:contrast=1.3" output.mp4
彩度を 0 にすると、白黒(グレースケール)になります。
ffmpeg -i input.mp4 -vf "eq=saturation=0" output.mp4
curves フィルタ — トーンカーブで細かく補正
トーンカーブは、元の明るさ(入力)を別の明るさ(出力)に置き換える曲線です。次の例は S 字のカーブで、暗い部分をより暗く、明るい部分をより明るくして、コントラストを強めます。
ffmpeg -i input.mp4 -vf "curves=all='0/0 0.25/0.15 0.5/0.5 0.75/0.85 1/1'" -pix_fmt yuv420p output.mp4
all='入力/出力 入力/出力 ...' の形で、カーブが通る点(制御点)を並べます。値は 0〜1 で、0 が黒、1 が白です。制御点の決め方や色ごとの調整はcurves フィルタでトーンカーブ色補正するで詳しく説明しています。
curves は RGB で処理するフィルタです。-pix_fmt yuv420p を付けないと、映像が 4:4:4 の H.264(High 4:4:4 Predictive)でエンコードされ、多くのスマホ・テレビ・ブラウザで再生できません。curves・colorbalance・lut3d を使うときは、-pix_fmt yuv420p を付けてください。
チャンネル別の調整
all の代わりに red・green・blue と書くと、その色だけにカーブがかかります。次の例は赤を強めて、暖かい色味にします。
ffmpeg -i input.mp4 -vf "curves=red='0/0 0.5/0.6 1/1'" -pix_fmt yuv420p output.mp4
青を下げて、青っぽさを弱めます。
ffmpeg -i input.mp4 -vf "curves=blue='0/0 0.5/0.4 1/0.9'" -pix_fmt yuv420p output.mp4
プリセットを使う
用意されたカーブ(プリセット)を名前で選ぶこともできます。
ffmpeg -i input.mp4 -vf "curves=preset=vintage" -pix_fmt yuv420p output.mp4
使えるプリセット: none, color_negative, cross_process, darker, increase_contrast, lighter, linear_contrast, medium_contrast, negative, strong_contrast, vintage
colorbalance フィルタ — シャドウ/ミッドトーン/ハイライトの色調整
暗い部分(シャドウ)、中間の明るさ(ミッドトーン)、明るい部分(ハイライト)ごとに、赤・緑・青の強さをずらすフィルタです。値をプラスにするとその色が強まり、マイナスにすると反対の色(赤ならシアン)に寄ります。
次の例は、暗い部分を青っぽく(寒色に)し、明るい部分を少し暖かくします。
ffmpeg -i input.mp4 -vf "colorbalance=bs=0.1:rs=-0.1:rh=0.1" -pix_fmt yuv420p output.mp4
| パラメータ | 説明 |
|---|---|
rs/gs/bs |
シャドウのR/G/B調整(-1〜1) |
rm/gm/bm |
ミッドトーンのR/G/B調整 |
rh/gh/bh |
ハイライトのR/G/B調整 |
フィルタの組み合わせ
フィルタはカンマ(,)でつなぐと、左から順にかかります。次の例は、eq で明るさとコントラストを上げたあと、colorbalance で暗い部分の赤を減らし、青を足しています。
ffmpeg -i input.mp4 -vf "eq=brightness=0.05:contrast=1.1,colorbalance=rs=-0.05:bs=0.05" -pix_fmt yuv420p output.mp4
どのフィルタを選ぶか
| やりたいこと | 推奨フィルタ |
|---|---|
| 明度・コントラスト・彩度を手軽に調整 | eq |
| トーンカーブで細かく制御 | curves |
| シャドウ/ミッドトーン/ハイライトを色別に調整 | colorbalance |
| .cubeファイルのLUTを適用 | lut3d |
実測: 処理時間とサイズ
次のコマンドで、処理時間と出力サイズを測りました。
ffmpeg -i input.mp4 -vf colorbalance=rs=0.15:bs=-0.15,eq=saturation=1.1 -c:v libx264 -crf 23 -preset medium -an output.mp4
| 項目 | 実測値 |
|---|---|
| 処理時間 | 53.29 秒(実時間の 2.25 倍速) |
| 出力サイズ | 87.71 MB |
| フィルタなし再エンコードとの差 | +1.7% |
計測環境: Core i9-14900KF(32スレッド)/ FFmpeg 8.1 (gyan.dev) / 素材は 1920x1080・30fps・120秒・351.4 MB(Big Buck Bunny をループ、CC BY 3.0)/ 2026-09-05。計測は同時に走らせず、順番に実行しました。比べる相手(ベースライン)は、同じ素材をフィルタなしで再エンコードした結果で、27.97 秒・86.26 MB です。データはデータセットで公開しています。
この数字の意味
かかる時間はフィルタによって大きく違いました。フィルタなしが 27.97 秒、eq と hue はほぼ同じ(27.07 秒と 27.06 秒)、curves が 42.01 秒、colorbalance + eq が 53.29 秒、boxblur が 59.37 秒です。curves と colorbalance の計測は -pix_fmt yuv420p なしで行ったので、4:4:4 でエンコードされています。4:4:4 は 4:2:0 よりエンコードに時間がかかるので、その分も含まれています。120 秒の素材を 53.29 秒で処理したので、かかった時間は素材の長さの約 0.44 倍、速度にすると約 2.25 倍速です。
この組み合わせでは、サイズはほとんど変わりませんでした(+1.7%)。ただし、色補正でもサイズは変わります。同じ回の計測(どれも同じ CRF)で、コントラストを強める curves は +13.4%、hue は +3.1%、彩度とコントラストを少し下げた lut3d + eq は -2.4% でした。コントラストや彩度を上げたものは大きく、下げたものは小さくなっています。それでも差は数%から十数%なので、ファイルを小さくしたいときは、ビットレートか解像度を変えてください。同じ回の計測では、720p への縮小で -52.3% になりました。
色補正では -c copy(再エンコードせずにコピーする方法)は使えません。同じ回の計測で、映像を再エンコードしない操作は、ストリーム選択が 0.41 秒、moov アトムの移動が 0.49 秒、映像はコピーのまま音声だけを再エンコードする音声フェードが 1.03 秒で終わりました。色補正は画素の値を変えるので必ず映像の再エンコードになり、1 秒前後で終わる作業が、53.29 秒かかる作業に変わります。カット、結合、コンテナの変更のように色を変えない編集は、別に -c copy で済ませてください。再エンコードは色補正のときの一度だけで済ませると、時間を無駄にしません。
関連記事
よくある質問
eq と curves、どちらを使う?
eq は、画面全体の明るさ・コントラスト・彩度をまとめて調整します。curves は、明るい部分・中間・暗い部分を、それぞれ別の形に調整できます。本格的な色づくり(カラーグレーディング)に近いのは curves です。
ガンマと明るさの違いは?
brightness(明るさ)は、すべての画素に同じ量を足して、全体を一様に持ち上げます。gamma(ガンマ)は曲線で変えます。1 より大きくすると中間の明るさが上がり、1 より小さくすると下がります。一般に、ガンマのほうが自然に見えます。ただし、変わらないのは値が 0 と 255 の画素だけです。多くの動画は黒を 16、白を 235 で記録しているので、黒と白も変わります(gamma=2 では 16 が 64 になります)。
補正後の動画が緑っぽくなった
緑(colorbalance の gs・gm・gh や、curves の green)か彩度を、強く上げすぎている可能性があります。一度すべての値を元に戻し、まず全体の補正をかけてから、最後に色ごとの調整を少しずつ足してください。
3D LUT を当てたい
ffmpeg -i in.mp4 -vf lut3d=look.cube -pix_fmt yuv420p out.mp4 のように、lut3d フィルタで .cube ファイルを当てられます。.cube は、配布されている LUT の標準的な形式です。
HDR 色は保持される?
そのままでは保たれません。eq は、10 ビットの HDR 映像を 8 ビット(yuv420p)に落としてから処理します。curves は 10 ビットのまま処理しますが、eq も curves も、PQ や HLG で符号化された値をそのまま数値として動かします。HDR のまま色を調整するなら、PQ や HLG を扱える編集ソフト(DaVinci Resolve など)を使います。SDR で書き出してよい場合は、先に HDR を SDR に変換 してから、これらのフィルタで調整します。