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やcurves フィルタでトーンカーブ補正する処理をつなぎ、彩度やコントラストを戻す - 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 秒書き出して比べてください。