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


カラーコレクション適用前後の比較。左が元の映像、右は 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 に変換 してから、これらのフィルタで調整します。