curves フィルタの適用前後の比較。左が元の映像、右は preset=vintage でコントラストが落ち色褪せた質感になった状態

左が元の映像、右が curves=preset=vintage をかけた出力です。プリセットを 1 つ指定するだけで、この色調になります。

素材: Tears of Steel (CC) Blender Foundation | mango.blender.org、CC BY 3.0。映画の1フレームを切り出し、フィルターで加工しています。

基本コマンド

マスターカーブでコントラストを上げる(S字カーブ)

ffmpeg -i input.mp4 -vf "curves=master='0/0 0.25/0.15 0.5/0.5 0.75/0.85 1/1'" -pix_fmt yuv420p output.mp4

master は、赤・緑・青のすべてにかかるカーブです。0/0 のような値は「入力値/出力値」の組で、カーブが通る点(制御点)を表します。この例のように暗い部分を下げ、明るい部分を上げる S字カーブにすると、コントラストが上がります。明るさやコントラストを軽く整えるだけなら、eq フィルタで明度・コントラストを調整するほうが手軽です。curves は RGB で処理するので、-pix_fmt yuv420p を付けないと、多くのプレーヤーや機器で再生できない 4:4:4 の H.264 になります。

赤チャンネルのみ調整する

ffmpeg -i input.mp4 -vf "curves=red='0/0 0.5/0.6 1/1'" -pix_fmt yuv420p output.mp4

red・green・blue を使うと、色ごとに別のカーブを指定できます。この例では、赤の中間の明るさだけを上げています。

組み込みプリセットを使う

ffmpeg -i input.mp4 -vf "curves=preset=vintage" -pix_fmt yuv420p output.mp4

preset には、次の表の名前を指定できます。

組み込みプリセット一覧

プリセット名 説明
none 変更なし(デフォルト)
color_negative ネガ反転
cross_process クロスプロセス風
darker 全体を暗くする
increase_contrast コントラスト強調
lighter 全体を明るくする
linear_contrast 線形コントラスト
medium_contrast 中程度のコントラスト
negative ネガティブ
strong_contrast 強いコントラスト
vintage ビンテージ風
ffmpeg -i input.mp4 -vf "curves=preset=cross_process" -pix_fmt yuv420p output.mp4

制御点の書き方

制御点は「入力値/出力値」の形で書き、スペースで区切って並べます。値は 0.0(いちばん暗い)から 1.0(いちばん明るい)までです。

master='0/0 0.5/0.7 1/1'
  • 0/0 — 黒(入力0 → 出力0)
  • 0.5/0.7 — 中間の明るさを持ち上げる
  • 1/1 — 白(入力1 → 出力1)

FFmpeg は、制御点をなめらかな曲線(スプライン)でつなぎます。制御点を増やすほど、細かく調整できます。

RGB個別カーブを組み合わせる

ffmpeg -i input.mp4 \
  -vf "curves=red='0/0 1/0.9':green='0/0 1/0.95':blue='0/0 0.8/1 1/1'" -pix_fmt yuv420p \
  output.mp4

赤と緑の明るい部分を少し抑え、青の明るい部分を持ち上げています。全体が青っぽい、冷たい色味になります。色相そのものをずらしたいときは、hue フィルタで色相・彩度を調整する方法と組み合わせます。

プリセット+マスターカーブを組み合わせる

ffmpeg -i input.mp4 \
  -vf "curves=preset=vintage:master='0/0 0.5/0.55 1/1'" -pix_fmt yuv420p \
  output.mp4

vintage で全体の色調を決め、master で明るさを微調整します。

静止画への適用

ffmpeg -i input.jpg -vf "curves=preset=increase_contrast" output.jpg

NG例

NG例: 制御点の順序が昇順でない
ffmpeg -i input.mp4 -vf "curves=master='0/0 0.8/0.3 0.5/0.7 1/1'" output.mp4

制御点は、入力値(左の値)が小さい順に並べてください。この例のように順番が逆になっていると、not strictly increasing on the x-axis というエラーで止まります。

注意点

  • curves は RGB で処理します。YUV の映像は、内部で RGB に変換されます。
  • 制御点は 1 つからでも指定できます。ただし、最初の点より暗い部分と最後の点より明るい部分は、その点と同じ値で平らになります(点が 1 つなら、画面全体が 1 つの値になります)。全体をなめらかに変えるには、両端の 0/… と 1/… の点も書きます。
  • preset と一緒に red・green・blue・master を指定すると、指定した曲線がプリセットの同じ曲線と置き換わります。increase_contrast や lighter など、master だけで作られたプリセットに master を足すと、プリセットの効果はなくなります。

実測: 処理時間とサイズ

計測したコマンドは次のとおりです。

ffmpeg -i input.mp4 -vf curves=preset=increase_contrast -c:v libx264 -crf 23 -preset medium -an output.mp4
項目 実測値
処理時間 42.01 秒(実時間の 2.86 倍速)
出力サイズ 97.79 MB
フィルタなしとのサイズ差 +13.4%
参考: フィルタなしの再エンコード 27.97 秒 / 86.26 MB

計測環境: 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、各コマンドを1つずつ順に実行。数値はデータセットで公開しています。

数字の読み方

同じ x264 の設定で、フィルタをかけずに再エンコードすると 27.97 秒でした。計測したコマンドには -pix_fmt がないので、出力は 4:4:4(yuv444p)です。フィルタなしのほうは 4:2:0(yuv420p)でした。4:4:4 は色の情報を間引かないので、x264 が 1 フレームごとにエンコードする値が 4:2:0 の 2 倍になります。約 14 秒の差のかなりの部分は、このエンコードが重くなった分です。残りは、RGB への変換と YUV への戻し、それにカーブの処理にかかった時間です。

120 秒の素材が 42.01 秒で終わりました。再生時間の 2.86 倍の速さです。

ファイルサイズは 13.4% 増えました。increase_contrast はカーブの傾きを急にして、コントラストを上げるからです。CRF 23 は、画質を一定に保ち、サイズは成り行きに任せる設定です。コントラストが上がると、輪郭やノイズの明暗の差が大きくなります。x264 は同じ画質を保つために、その分だけ多くのデータを使います。

同じ 2 分の素材で計ったほかの処理と比べます。curves の 42.01 秒は、720p への縮小(18.43 秒)やフィルタなしの再エンコード(27.97 秒)より遅い結果でした。colorbalance + eq(53.29 秒)や boxblur(59.37 秒)よりは速く終わりました。VP9 への変換は 729.16 秒かかりました。

処理時間をいちばん大きく左右するのは、再エンコードが必要かどうかです。映像を -c copy や -c:v copy(再エンコードせずにそのまま書き写す指定)で済ませる処理は、ストリームコピー 0.41 秒、moov アトムの移動 0.49 秒、音声フェード(音声だけ再エンコード)1.03 秒で、どれも 1 秒前後で終わりました。色の調整は全フレームを再エンコードするので、設定を工夫してもこの速さにはなりません。カーブの具合を確かめるだけなら、先に -ss/-t とストリームコピーで数秒だけ切り出します。その短いクリップに curves をかければ、短い時間で何度も試せます。

計測したのは preset=increase_contrast の場合だけで、制御点を並べた master の指定は計っていません。また -an で音声を外しているので、42.01 秒には音声の処理時間は入っていません。

最初から強い S字にするより、0.25/0.2・0.75/0.8 くらいの控えめなカーブから試すと、不自然になりにくいです。暗い部分を持ち上げすぎるとブロックノイズが目立ち、明るい部分を上げすぎると白飛びしたように見えます。配信用に仕上げるときは、補正した短い区間だけを書き出し、スマートフォンとパソコンの両方の画面で確認してから全体にかけます。

意図しない色かぶり(全体が特定の色に寄ること)が出たら、まず master だけに戻します。次に red・green・blue を1つずつ足して、どの色のカーブが原因かを確かめます。

最終的に H.264 の 8bit で配信するなら、強いカーブをかけたときに、なめらかな空や壁に色の段差(バンディング)が出ていないかも確認します。軽いノイズを残すか、10bit の中間ファイルで処理してから配信用に変換すると、バンディングを抑えやすくなります。

補正の結果を比べるときは、同じフレームを PNG で1枚書き出しておくと判断しやすくなります。

関連フィルタ

  • hue — 色相・彩度・輝度の調整
  • eq — 明度・コントラスト・ガンマの調整
  • colorbalance — シャドウ・ミッド・ハイライトの色調補正
  • lut3d — 3D LUT によるカラーグレーディング