3D LUT とは

3D LUT(3-Dimensional Look-Up Table)は、ある色(R・G・B の組み合わせ)を別の色に置き換えるための対応表です。「フィルムルック」のような色づくりを LUT ファイルにしておけば、そのファイルを読み込むだけで同じ色の変換をかけられます。FFmpeg では lut3d フィルタで LUT ファイルを読み込みます。

LUT を使わずに自分で色味を作りたいときは、hue フィルタで色相・彩度を調整するところから始めると、各パラメータの効き方がつかめます。

基本コマンド

.cube LUT を適用する

ffmpeg -i input.mp4 -vf "lut3d=file=my_lut.cube" -pix_fmt yuv420p output.mp4

file= のあとに LUT ファイルのパスを書きます。lut3d は RGB で処理するので、-pix_fmt yuv420p を付けないと、多くのプレーヤーや機器で再生できない 4:4:4 の H.264 になります。

パスにスペースが含まれる場合

ffmpeg -i input.mp4 -vf "lut3d=file='my lut file.cube'" -pix_fmt yuv420p output.mp4

ファイル名やフォルダ名にスペースが入っているときは、パスをシングルクォート(’)で囲みます。

対応フォーマット

拡張子 フォーマット名
.cube Adobe/DaVinci Resolve CUBE(最も一般的)
.3dl Autodesk 3DL
.dat DaVinci dat
.m3d Pandora m3d
.csp cineSpace csp

いちばん広く使われているのは .cube です。選べるなら .cube を使ってください。

LUT の適用強度を弱める考え方

lut3d には、効き具合(強さ)を指定するオプションがありません。LUT が強すぎるときは、次のどちらかで調整します。

手軽なのは前者です。次の例では、LUT のあとに eq でコントラストと彩度を少し下げています。

ffmpeg -i input.mp4 \
  -vf "lut3d=file=my_lut.cube,eq=contrast=0.9:saturation=0.8" -pix_fmt yuv420p \
  output.mp4

具体的な .cube ファイルの構造(参考)

# シンプルな 2x2x2 CUBE ファイル例(テスト用)
LUT_3D_SIZE 2
0.0 0.0 0.0
1.0 0.0 0.0
0.0 1.0 0.0
1.0 1.0 0.0
0.0 0.0 1.0
1.0 0.0 1.0
0.0 1.0 1.0
1.0 1.0 1.0

# で始まる行はコメントです。LUT_3D_SIZE 2 は表の細かさで、R・G・B をそれぞれ 2 段階に分けるという意味です。その下の各行が、入力の色ごとの出力の色(R G B の順)です。この例は入力と同じ色を返すので、当てても見た目は変わりません。

実際に配布されている高品質な LUT は、33×33×33(35,937 行)や 65×65×65 などの細かさです。

テスト用の最小 .cube ファイルを作成して適用する

上のサンプルと同じ LUT を test.cube として保存し、そのまま動画に当てます。

cat > test.cube << 'EOF'
LUT_3D_SIZE 2
0.0 0.0 0.0
1.0 0.0 0.0
0.0 1.0 0.0
1.0 1.0 0.0
0.0 0.0 1.0
1.0 0.0 1.0
0.0 1.0 1.0
1.0 1.0 1.0
EOF

ffmpeg -i input.mp4 -vf "lut3d=file=test.cube" -pix_fmt yuv420p output.mp4

この LUT は色を変えないので、エラーが出ずに出力ファイルができれば、LUT ファイルは正しく読み込めています。

cat > test.cube << 'EOF' から EOF までは、Mac や Linux のターミナルで使える書き方です。Windows のコマンドプロンプトや PowerShell では、メモ帳などで同じ内容の test.cube を作ってから、最後の ffmpeg の行だけを実行してください。

haldclut フィルタを使った LUT 適用(別の方法)

haldclut は、LUT を画像(PNG や TIFF)として受け取るフィルタです。画像は Hald CLUT という決まった形式のものを使います。1つ目の入力に動画、2つ目の入力に LUT 画像を渡します。

ffmpeg -i input.mp4 -i lut_image.png \
  -filter_complex "[0][1]haldclut" -pix_fmt yuv420p \
  output.mp4

カラーグレーディングのワークフロー

1. ログ映像からの変換(S-Log3 → Rec.709)

ffmpeg -i slog3_footage.mp4 \
  -vf "lut3d=file=SLog3_To_Rec709.cube" -pix_fmt yuv420p \
  output.mp4

ソニーの S-Log3 などのログ撮影の映像は、そのままだとコントラストが低く、白っぽく見えます。ふつうの見た目(Rec.709)に戻すには、そのログ形式専用の変換 LUT が必要です。

ログ撮影の素材は、先にメーカー指定の変換 LUT を当て、そのあとで色づくり用の LUT を重ねると仕上がりが安定します。

2. フィルムルックの適用

ffmpeg -i input.mp4 \
  -vf "lut3d=file=film_look.cube" -pix_fmt yuv420p \
  output.mp4

無料の LUT は、IWLTBAP など多くのサイトで配布されています。

lut3d と curves・eq の組み合わせ

LUT のあとに eq などをつなげば、さらに細かく調整できます。次の例では、コントラストと彩度を少し上げています。

ffmpeg -i input.mp4 \
  -vf "lut3d=file=my_lut.cube,eq=contrast=1.05:saturation=1.1" -pix_fmt yuv420p \
  output.mp4

LUT を当てる前と後を見比べるときは、人の肌、白い壁、空のグラデーションを先に確認してください。強い LUT は一見きれいでも、肌の色がずれたり、グラデーションに縞(バンディング)が出たりしやすいです。気になるときは eq=saturation=0.9 のように、後ろにつないだフィルタで少し戻します。

注意点

  • LUT ファイルのパスは絶対パスで書くのがおすすめです。相対パスで書くと、FFmpeg を実行したフォルダが基準になります。Windows では、ドライブ名のコロンを \: にし、フォルダの区切りを / にして、lut3d=file='C\:/LUT/my_lut.cube' のように書きます。file=C:/LUT/my_lut.cube のままだと、No option name near というエラーで止まります。
  • lut3d は FFmpeg 本体(libavfilter)に入っているフィルタです。追加のライブラリは要りません。
  • LUT ファイルの書き方が正しくないと(コメント行の書き方など)、エラーで止まります。

実測: 処理時間とサイズ

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

ffmpeg -i input.mp4 -vf lut3d=file=look.cube,eq=saturation=0.95:contrast=0.98 -c:v libx264 -crf 23 -preset medium -an output.mp4
項目 実測値
処理時間 53.26 秒(実時間の 2.25 倍速)
出力サイズ 84.21 MB
ベースライン(フィルタなし再エンコード)とのサイズ差 -2.4%

計測環境: 1920×1080 / 30fps / 120 秒 / 351.4 MB の H.264 素材(Big Buck Bunny をループ、CC BY 3.0)、Core i9-14900KF(32 スレッド)、FFmpeg 8.1(gyan.dev)、2026-09-05。計測は同時に走らせず、順番に実行しました。数値はデータセットで公開しています。コマンドに -an を付けて音声を外しているので、上の時間は映像のエンコードだけのものです。look.cube は、入力と同じ色を返す(色を変えない)33×33×33 の LUT です。

なぜこの数字になるのか

比べる相手(ベースライン)として、同じ素材をフィルタなしで再エンコードしました。

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -an output.mp4

こちらは 27.97 秒でした。lut3d と eq を足すと 53.26 秒です。フィルタなしのときの時間が、ほぼもう一回分増えた計算です。

同じ回に測ったほかのフィルタでは、colorbalance + eq の色補正が 53.29 秒で、lut3d の 53.26 秒とほぼ同じでした。curves は 42.01 秒、boxblur は 59.37 秒、720p への縮小は 18.43 秒です。すべての画素に手を入れること自体が重いわけではありません。同じ回の eq(27.07 秒)と hue(27.06 秒)もすべての画素を書き換えますが、フィルタなしの 27.97 秒と変わりませんでした。lut3d・colorbalance・curves は RGB で処理するので、各フレームを YUV から RGB に変換し、また YUV に戻します。さらに、計測したコマンドには -pix_fmt がないので、x264 は 4:4:4(yuv444p)でエンコードしました。4:4:4 は、1 フレームあたりの値がフィルタなしの 4:2:0 の 2 倍あります。増えた時間のかなりの部分はこのエンコードが重くなった分で、残りが RGB との変換とフィルタの処理です。

大きな差がつくのは、-c copy(再エンコードせずにコピーする)と比べたときです。同じ回の計測では、映像を再エンコードしない処理はどれも 1 秒前後で終わりました。ストリームマッピングが 0.41 秒、moov atom の移動が 0.49 秒、映像はコピーのまま音声だけを再エンコードしてフェードする処理が 1.03 秒です。映像を再エンコードする処理は、フィルタなしで 27.97 秒、VP9 変換では 729.16 秒かかりました。LUT は画素の値そのものを書き換えるので、-c copy は使えず、必ず再エンコードになります。色味を決める段階では 10 秒だけ書き出して確認し、決まってから全編を 1 回だけ書き出すのが、いちばん早く済みます。

サイズは 84.21 MB で、ベースラインより 2.4% 小さくなりました。look.cube は色を変えない LUT なので、この差は LUT の色づけによるものではなく、ほぼ後ろの eq=saturation=0.95:contrast=0.98 で彩度とコントラストを少し下げたためです。色を変える LUT ではサイズも変わるので、気になるときは実際に使う LUT で 10 秒書き出して比べてください。

関連フィルタ

  • haldclut — 画像フォーマットの LUT を適用
  • curves — トーンカーブによる色補正
  • hue — 色相・彩度・輝度の調整
  • eq — 明度・コントラスト・ガンマの調整