fqmpeg の C6 クラスタは全 12 グループの中で最大の23動詞、動画の「見た目」を変えるものすべてだ。技術的な色補正 (color, color-balance, equalize, lut, chroma, hdr-to-sdr)、グリーンバックを抜いて合成する系 (chromakey, color-key, alpha)、スタイライズされたルック (cinematic, vintage, sepia, grayscale, negative, posterize, vignette, edge)、歪み・ぼかし・グレイン (glitch, pixelate, motion-blur, sharpen, blur, noise) — この5系統に分かれている。
この記事では各動詞について fqmpeg 3.0.2 の src/commands/ を実読し、生成される FFmpeg フィルタ・デフォルト値・出力名規則・--help だけだと見えない実装由来の罠(color の contrast 範囲は -1000 から 1000、alpha の出力は必ず .webm、vintage は4段フィルタ、color-key には -c:a copy がない)まで踏み込む。
この記事で得られるもの
- 23 動詞をタスクで選ぶ早見表(グレーディング / キーイング / ルック / 歪み / HDR)
- 各動詞が生成する FFmpeg コマンドの実出力(
--dry-runで検証済み) - すべての動詞のデフォルト値・許容値・出力ファイル名
- グリーンバック合成、シネマティック調色、HDR→SDR の実用パイプライン3本
23 動詞の全体図
クラスタは 5 つのタスクグループに分かれる。グループから入って動詞を選べばいい。
| グループ | 動詞 | やること |
|---|---|---|
| カラーグレーディング・補正 | color, color-balance, equalize, lut, chroma | 明度/コントラスト/彩度/ガンマ、シャドウ/ミッド/ハイライトのカラーバランス、自動均等化、3D LUT 適用、色相回転 |
| キーイング・アルファ | chromakey, color-key, alpha | グリーン/ブルーバックを背景に合成、または透過チャンネル付きで書き出し |
| スタイライズされたルック | cinematic, vintage, sepia, grayscale, negative, posterize, vignette, edge | レターボックス、レトロフィルム、セピア、白黒、色反転、色階調削減、四隅暗化、エッジ検出 |
| 歪み・シャープネス | glitch, pixelate, motion-blur, sharpen, blur | RGBシフト+グレイン、モザイク、フレーム平均ブラー、アンシャープマスク、ボックスブラー(領域指定可) |
| HDR・グレイン | hdr-to-sdr, noise | HDR (BT.2020 + PQ/HLG) → SDR (BT.709) トーンマッピング、フィルムグレイン追加 |
読み始める前に押さえておきたい3つのポイント:
color --contrastの許容範囲は-1から1ではなく-1000から1000だ。 これは内部で使うeqフィルタの contrast 倍率で、デフォルトは1(変化なし)。実用範囲は0.5〜2.0、5を超えるとアート寄りのコントラスト潰し。-1000まで通るのは FFmpeg 側の制約上の最大値で「ここまで使え」という意味ではない。alphaは常に.webm(VP9 + Opus)を出力する。 透過動画は α チャンネル対応のコーデックが必要で、web 向けは VP9-in-webm が標準的な選択肢になる。Premiere や Resolve で使う.mov+ ProRes 4444 が欲しいなら、--dry-runの出力をコピーしてlibvpx-vp9をprores_ks -profile:v 4444に、拡張子を.movに書き換えて FFmpeg を直接叩く運用になる。vintageは4段フィルタチェーンだ。colorchannelmixer(セピアっぽい変換)+eq(彩度/コントラスト/明度微調整)+vignette+noiseの4本。--dry-runで出力を取得して個別段を入れ替え/削除すれば自分好みに調整できる — 「複数エフェクトを重ねる」やり方の良いお手本になっている。
カラーグレーディング・補正
color — 明度・コントラスト・彩度・ガンマ
グレーディングの基本動詞。FFmpeg の eq フィルタを4パラメータすべて公開する形でラップしている。
- ソース:
src/commands/color.js - フィルタ:
eq=brightness=B:contrast=C:saturation=S:gamma=G
| 引数 / オプション | デフォルト | 範囲 | 補足 |
|---|---|---|---|
<input> | 必須 | — | 入力動画 |
--brightness <n> | 0 | -1.0 〜 1.0 | 加算オフセット。0.05〜0.2 で穏やかな持ち上げ |
--contrast <n> | 1 | -1000 〜 1000 | 倍率。1 で変化なし。実用は 0.5〜2.0 |
--saturation <n> | 1 | 0 〜 3 | 0 = グレースケール、1 = 通常、1.5〜2 = 鮮やか、3 = 飽和 |
--gamma <n> | 1 | 0.1 〜 10 | <1 でミッド暗、>1 でミッド明 |
-o, --output <path> | <入力名>-color.<拡張子> | — | 出力ファイル名上書き |
$ npx fqmpeg color input.mp4 --brightness 0.05 --contrast 1.1 --saturation 1.2 --gamma 1.0 --dry-run
ffmpeg -i input.mp4 -vf eq=brightness=0.05:contrast=1.1:saturation=1.2:gamma=1 -c:a copy input-color.mp4
チャンネル別の調整(ハイライトだけ暖色寄り、シャドウだけ寒色寄り、など)が欲しいときは次の color-balance を使う。color はフレーム全体を一様に処理する。
color-balance — シャドウ/ミッド/ハイライト × RGB
3つの輝度帯ごとに R/G/B を独立に調整する。9 パラメータ(3 チャンネル × 3 帯域)で、いわゆる「リフト/ガンマ/ゲイン」の fqmpeg 版だ。
- ソース:
src/commands/color-balance.js - フィルタ:
colorbalance=rs=:gs=:bs=:rm=:gm=:bm=:rh=:gh=:bh= - 命名規則:
rs/gs/bs= シャドウ R/G/B、rm/gm/bm= ミッドトーン、rh/gh/bh= ハイライト
| 引数 / オプション | デフォルト | 範囲 | 補足 |
|---|---|---|---|
<input> | 必須 | — | 入力動画 |
--rs / --gs / --bs <n> | 0 | -1.0 〜 1.0 | シャドウのチャンネル別調整 |
--rm / --gm / --bm <n> | 0 | -1.0 〜 1.0 | ミッドトーンのチャンネル別調整 |
--rh / --gh / --bh <n> | 0 | -1.0 〜 1.0 | ハイライトのチャンネル別調整 |
-o, --output <path> | <入力名>-balanced.<拡張子> | — | 出力ファイル名上書き |
$ npx fqmpeg color-balance input.mp4 --rs -0.1 --bs 0.15 --rh 0.1 --bh -0.1 --dry-run
ffmpeg -i input.mp4 -vf colorbalance=rs=-0.1:gs=0:bs=0.15:rm=0:gm=0:bm=0:rh=0.1:gh=0:bh=-0.1 -c:a copy input-balanced.mp4
上の例はハリウッド定番の「ティール&オレンジ」のお手本: シャドウを冷たく(R を下げて B を上げる)、ハイライトを暖かく(R を上げて B を下げる)。値は小さめに(±0.1〜±0.2)が原則で、これ以上強いと露骨な色被りになる。
equalize — ヒストグラム自動均等化
オプションなし。FFmpeg の histeq フィルタを当てて輝度ヒストグラムを全域に引き伸ばす — 暗部を持ち上げて、白飛び側を抑えてくれる。
- ソース:
src/commands/equalize.js - フィルタ:
histeq
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
-o, --output <path> | <入力名>-equalized.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg equalize input.mp4 --dry-run
ffmpeg -i input.mp4 -vf histeq -c:a copy input-equalized.mp4
histeq はフレーム単位で動くので、露出が急に変わるショットではちらつきが出ることがある。安定したい場合は手動で color --gamma 1.2 --contrast 1.15 のほうがいい。equalize は「フラットな資料映像」「コントラストの低い水中映像」のように時間方向のチラつきが問題にならないソース向けだ。
lut — 3D LUT (.cube, .3dl) を当てる
「本気の」カラーグレーディング動詞。LUT ファイルを読み込んで FFmpeg の lut3d フィルタで適用する。DaVinci Resolve や FilmConvert、Premiere の Lumetri が書き出す .cube 形式に対応する。
- ソース:
src/commands/lut.js - フィルタ:
lut3d=<path> - 位置引数が2つ — 入力ファイルとLUT ファイル
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
<lutfile> | 必須 | LUT パス(.cube または .3dl) |
-o, --output <path> | <入力名>-graded.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg lut input.mp4 film.cube --dry-run
ffmpeg -i input.mp4 -vf lut3d=film.cube -c:a copy input-graded.mp4
無料で当てられる .cube 配布元: FreshLUTs、RocketStock の無料35パック、FilmConvert のサンプル。lut3d で当てた結果が眠い/白っぽいときは、ソースが log エンコードされているのに LUT が Rec.709 入力を前提にしているケースが多い。先に「log → Rec.709」変換用 LUT を当ててから、ルック用 LUT を当てる。
chroma — 色相回転・色温度
名前から「クロマサブサンプリング調整」と思いそうだがそうではない。FFmpeg の hue フィルタのラッパーで、色相と彩度をいじる動詞だ。
- ソース:
src/commands/chroma.js - フィルタ:
hue=h=H:s=S
| 引数 / オプション | デフォルト | 範囲 | 補足 |
|---|---|---|---|
<input> | 必須 | — | 入力動画 |
--hue <degrees> | 0 | -180 〜 180 | 色相を度数で回転 |
--saturation <n> | 1 | 0 〜 3 | 彩度倍率(0 でグレースケール) |
-o, --output <path> | <入力名>-chroma.<拡張子> | — | 出力ファイル名上書き |
$ npx fqmpeg chroma input.mp4 --hue 20 --saturation 1.3 --dry-run
ffmpeg -i input.mp4 -vf hue=h=20:s=1.3 -c:a copy input-chroma.mp4
--hue 20 は画面全体をほんのり暖色寄りにする(緑が黄緑寄り、青がシアン寄りに)。3200K → 5600K のような厳密な色温度シフトがやりたいなら、color-balance --rh 0.05 --bh -0.05 のほうが正しい結果になる。hue は色相環全体を回すので、ホワイトバランス補正とは別の絵になる。
キーイング・アルファ
chromakey — グリーン/ブルーバックを背景に合成
入力2つ(前景 + 背景)。前景からキー色を抜いて、背景に重ねる。キー色のデフォルトは純粋なグリーン(0x00FF00)。
- ソース:
src/commands/chromakey.js - フィルタ:
[0:v]colorkey=COLOR:SIM:BLEND[fg];[1:v][fg]overlay[out] - 音声: 前景の音声をコピー(
-c:a copy)、背景の音声は無視
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | グリーン/ブルーバックの前景動画 |
<background> | 必須 | 背景画像または背景動画 |
--color <hex> | 0x00FF00 | キー色(hex、ブルーバックなら 0x0000FF) |
--similarity <n> | 0.3(範囲 0.01〜1.0) | マッチ許容度。低いほど厳密、高いほど積極的に抜く |
--blend <n> | 0.1(範囲 0.0〜1.0) | エッジを馴染ませる |
-o, --output <path> | <入力名>-keyed.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg chromakey actor.mp4 background.mp4 --color 0x00FF00 --similarity 0.3 --blend 0.1 --dry-run
ffmpeg -i actor.mp4 -i background.mp4 -filter_complex [0:v]colorkey=0x00FF00:0.3:0.1[fg];[1:v][fg]overlay[out] -map [out] -map 0:a? -c:a copy actor-keyed.mp4
被写体のエッジに緑被りが残るときは --blend を 0.2〜0.3 に上げる。被写体の肌色まで抜けてしまうとき(特にブルーバックでありがち)は --similarity を 0.2 まで下げ、汎用の 0x00FF00 ではなくソースから正確な hex を拾うほうがいい。実装メモ: chromakey という動詞名だが内部で使っているのは FFmpeg の colorkey フィルタだ(FFmpeg には別物として chromakey フィルタも存在するが、fqmpeg はこの動詞でも次の color-key 動詞でも一貫して colorkey を使う)。
color-key — 任意色を抜いて背景に合成
挙動は chromakey とほぼ同じ — 同じ colorkey フィルタを通して同じ2入力 overlay 構造になる。違いは想定用途で、chromakey は「グリーン/ブルーバック」、color-key は「任意色(緑バックなしでロゴ背景や壁を抜きたい)」がドキュメントの建付け。
- ソース:
src/commands/color-key.js - フィルタ:
[0]colorkey=COLOR:SIM:BLEND[fg];[1][fg]overlay[out] - 音声:
-map 0:a?で前景の音声をマップするが**-c:a copyが無い** — 出力コンテナのデフォルトコーデックで再エンコードされる
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 前景動画 |
<background> | 必須 | 背景画像または背景動画 |
--color <hex> | 0x00FF00 | 抜く色 |
--similarity <n> | 0.3 | マッチ許容度 |
--blend <n> | 0.1 | エッジを馴染ませる |
-o, --output <path> | <入力名>-colorkey.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg color-key actor.mp4 background.mp4 --color 0x1A8FE5 --similarity 0.25 --blend 0.05 --dry-run
ffmpeg -i actor.mp4 -i background.mp4 -filter_complex [0]colorkey=0x1A8FE5:0.25:0.05[fg];[1][fg]overlay[out] -map [out] -map 0:a? actor-colorkey.mp4
-c:a copy が無いのはソース実装通りで、元音声のコーデックを保ちたいなら --dry-run の出力に -c:a copy を足してから FFmpeg を直叩きする運用になる。気にせず流すと .mp4 出力なら AAC に再エンコードされる — 実用上は問題ないが世代が1つ進む。
alpha — 透過チャンネル付きで書き出し(WebM/VP9 + Opus)
入力は1つ。同じ colorkey フィルタを使うが、合成先が背景ではなく透過 — α チャンネル付きの WebM を出力する。動画エディタに読み込むための「透過素材」を作る用途で使う。
- ソース:
src/commands/alpha.js - フィルタ:
colorkey=COLOR:SIM:BLEND,format=yuva420p - コーデック:
libvpx-vp9動画 +libopus音声 - コンテナ:
.webm(デフォルト拡張子)
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | グリーン/ブルーバックの入力動画 |
--color <hex> | 0x00FF00 | 透過にする色 |
--similarity <n> | 0.3 | マッチ許容度 |
--blend <n> | 0.1 | エッジを馴染ませる |
-o, --output <path> | <入力名>-alpha.webm | .webm または .mov 推奨 |
$ npx fqmpeg alpha actor.mp4 --color 0x00FF00 --similarity 0.3 --blend 0.1 --dry-run
ffmpeg -i actor.mp4 -vf colorkey=0x00FF00:0.3:0.1,format=yuva420p -c:v libvpx-vp9 -auto-alt-ref 0 -c:a libopus actor-alpha.webm
Premiere・Resolve・Final Cut のような non-web の編集パイプラインに渡すなら、.mov + ProRes 4444 が定石。--dry-run の出力をコピーして libvpx-vp9 を prores_ks -profile:v 4444 -pix_fmt yuva444p10le に、拡張子を .mov に書き換えて FFmpeg を直接叩く。-auto-alt-ref 0 が付いているのは、VP9 の alt-ref フレーム機能が α チャンネルエンコードを壊すからだ。
スタイライズされたルック
cinematic — レターボックス(2.35:1 ワイドスクリーン)
ソースをワイドアスペクトに crop してから、16:9 に戻すときに上下を黒(または任意色)で pad する。スマホ素材を「映画っぽく」見せる手早い方法だ。
- ソース:
src/commands/cinematic.js - フィルタ:
crop=iw:iw/<ratio>,pad=iw:iw/(16/9):(ow-iw)/2:(oh-ih)/2:color=<color>
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
--ratio <n> | 2.35 | 目標アスペクト幅(2.35、2.39、2.40 など) |
--color <name> | black | バーの色(FFmpeg のカラー名または hex) |
-o, --output <path> | <入力名>-cinematic.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg cinematic input.mp4 --ratio 2.35 --color black --dry-run
ffmpeg -i input.mp4 -vf crop=iw:iw/2.35,pad=iw:iw/(16/9):(ow-iw)/2:(oh-ih)/2:color=black -c:a copy input-cinematic.mp4
2.35:1 は古典的な Scope 比(CinemaScope / アナモルフィック)。現代のデジタルシネマは 2.39 か 2.40 を使う。バーは見た目だけのクロップなので、画面の上下端は実際に切り捨てられる — 被写体が上3分の1にいるカットならクロップする前に構図を考え直したほうがいい。
vintage — レトロフィルム調(4段フィルタ合成)
4つのフィルタを1チェーンで合成: セピアっぽい色変換 + 彩度/コントラスト微調整 + ヴィネット + グレイン。「即席8mm」動詞だ。
- ソース:
src/commands/vintage.js - フィルタチェーン:
colorchannelmixer=.35:.75:.20:0:.30:.65:.17:0:.25:.50:.13:0,eq=saturation=0.7:contrast=1.1:brightness=0.02,vignette=angle=PI/4,noise=alls=15:allf=t+a
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
-o, --output <path> | <入力名>-vintage.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg vintage input.mp4 --dry-run
ffmpeg -i input.mp4 -vf colorchannelmixer=.35:.75:.20:0:.30:.65:.17:0:.25:.50:.13:0,eq=saturation=0.7:contrast=1.1:brightness=0.02,vignette=angle=PI/4,noise=alls=15:allf=t+a -c:a copy input-vintage.mp4
調整ノブはない — vintage は固定の意見だ。グレインを強めたければ --dry-run 出力の noise=alls=15 を 30 に書き換える。80s VHS のような冷たいレトロが欲しければ、色変換部分を chroma --hue -10 --saturation 0.6 で置き換えるのがいい。
sepia — セピアトーン
定番のセピア用カラーマトリクス — Wikipedia や W3C の例で使われているのと同じ式だ。
- ソース:
src/commands/sepia.js - フィルタ:
colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131:0
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
-o, --output <path> | <入力名>-sepia.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg sepia input.mp4 --dry-run
ffmpeg -i input.mp4 -vf colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131:0 -c:a copy input-sepia.mp4
「古写真っぽい」コントラスト高めのセピアが欲しければ繋ぐ: sepia input.mp4 -o tmp.mp4 && color tmp.mp4 --contrast 1.3 --brightness -0.05。マトリクス自体は固定。
grayscale — 白黒
hue=s=0 で彩度を完全に殺す。chroma --saturation 0 よりほんの少し軽い(色相パラメータの乗算がない分)。
- ソース:
src/commands/grayscale.js - フィルタ:
hue=s=0
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
-o, --output <path> | <入力名>-grayscale.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg grayscale input.mp4 --dry-run
ffmpeg -i input.mp4 -vf hue=s=0 -c:a copy input-grayscale.mp4
「肌色を明るく、空を暗く」というフィルム調 B&W が欲しいなら、grayscale ではなく color --saturation 0 + color-balance --rh 0.1 のほうがいい。grayscale は一様な脱色で、ポラロイドの白黒に近い均質な質感になる。
negative — 色反転
FFmpeg の negate フィルタ。全ピクセルを反転する — 即席のフィルムネガ風、または「暗いシーンで最も明るい場所を探す」用途の点検ツールとしても使える。
- ソース:
src/commands/negative.js - フィルタ:
negate
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
-o, --output <path> | <入力名>-negative.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg negative input.mp4 --dry-run
ffmpeg -i input.mp4 -vf negate -c:a copy input-negative.mp4
negative を2回かけると元に戻る(negate は自己逆元)。α チャンネルがあるとアルファも反転されてしまうので、透過を保ちたいなら --dry-run を編集して negate=alpha=0 にしておく。
posterize — 色階調を削減
各チャンネルを N 段階の離散値に潰す。--levels 4(デフォルト)でチャンネルごとに4段階のグラデ — 合計 64 色(4³)。低いほどカートゥーン調、高いほど微妙なバンディング。
- ソース:
src/commands/posterize.js - フィルタ:
format=rgb24,lutrgb=r='val-mod(val,256/N)':g='val-mod(val,256/N)':b='val-mod(val,256/N)'
| 引数 / オプション | デフォルト | 範囲 | 補足 |
|---|---|---|---|
<input> | 必須 | — | 入力動画 |
--levels <n> | 4 | 2〜256 | 1チャンネルあたりの段階数 |
-o, --output <path> | <入力名>-posterized.<拡張子> | — | 出力ファイル名上書き |
$ npx fqmpeg posterize input.mp4 --levels 6 --dry-run
ffmpeg -i input.mp4 -vf format=rgb24,lutrgb=r='val-mod(val,256/6)':g='val-mod(val,256/6)':b='val-mod(val,256/6)' -c:a copy input-posterized.mp4
--levels 2 で 2³ = 8 色(黒・白・原色6個)の極端なルック。--levels 32 だと目視では分かりにくいが、空のようなグラデーションシーンでバンディングが見える。先頭の format=rgb24 は YUV から RGB に変換してチャンネル別の演算を可能にするためのもの。
edge — エッジ検出(sobel / prewitt / roberts)
古典3手法。デフォルトの sobel が最もよく使われる — ゲームチュートリアル等で見る「黒地に白エッジ」のルックがそれだ。
- ソース:
src/commands/edge.js - フィルタ(sobel):
edgedetect=mode=colormix:high=0 - フィルタ(prewitt):
prewitt - フィルタ(roberts):
roberts
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
--mode <mode> | sobel | sobel / prewitt / roberts |
-o, --output <path> | <入力名>-edge.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg edge input.mp4 --mode sobel --dry-run
ffmpeg -i input.mp4 -vf edgedetect=mode=colormix:high=0 -c:a copy input-edge.mp4
$ npx fqmpeg edge input.mp4 --mode prewitt --dry-run
ffmpeg -i input.mp4 -vf prewitt -c:a copy input-edge.mp4
sobel は FFmpeg の edgedetect=mode=colormix を使っており、エッジに色を残してくれる(スタイル的に最も使いやすい)。prewitt と roberts は直接的なエッジフィルタで、白エッジ on 黒地のシンプルな絵になる。アニメ調の「ペン線ルック」を狙うなら sobel の colormix が無難。
vignette — 四隅暗化
FFmpeg の vignette フィルタを --angle(口径角、ラジアン)1パラメータだけ公開する。
- ソース:
src/commands/vignette.js - フィルタ:
vignette=angle=<radians>
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
--angle <radians> | PI/5 | 小さいほど強い。PI/5 で中程度、PI/4 でやや強め |
-o, --output <path> | <入力名>-vignette.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg vignette input.mp4 --angle PI/5 --dry-run
ffmpeg -i input.mp4 -vf vignette=angle=PI/5 -c:a copy input-vignette.mp4
直感に反するが、--angle を大きくする=口径が広くなる=ヴィネットは弱くなる。デフォルトの PI/5 (≈0.628 rad) は FFmpeg のデフォルト値そのまま。PI/4 は内部で vintage が使っている値で、より強めだ。式は記号のまま評価されるので 0.6283 のように数値で渡さず PI/5 の形のままにすること。
歪み・シャープネス
glitch — RGB シフト + ノイズ + コントラスト
「データモッシュ風」の動詞 — rgbashift(赤を右、青を左にずらす)+ noise + 軽いコントラスト持ち上げの3段。intensity が3つすべてに効く。
- ソース:
src/commands/glitch.js - フィルタチェーン:
rgbashift=rh=N:bh=-N:rv=N/2:bv=-N/2,noise=alls=M:allf=t,eq=contrast=1.2(N = intensity/5、M = min(intensity, 50))
| 引数 / オプション | デフォルト | 範囲 | 補足 |
|---|---|---|---|
<input> | 必須 | — | 入力動画 |
--intensity <n> | 30 | 1〜100 | RGB シフトとノイズ量を同時にドライブ |
-o, --output <path> | <入力名>-glitch.<拡張子> | — | 出力ファイル名上書き |
$ npx fqmpeg glitch input.mp4 --intensity 30 --dry-run
ffmpeg -i input.mp4 -vf rgbashift=rh=6:bh=-6:rv=3:bv=-3,noise=alls=30:allf=t,eq=contrast=1.2 -c:a copy input-glitch.mp4
--intensity 30(デフォルト)はトランジションやタイトルカードに使える「見えるけど派手すぎない」レベル。--intensity 80 以上で本格的なデータモッシュ・カオス。ただしノイズ量は 50 で頭打ちになる — 50 を超えて intensity を上げてもグレインはそれ以上増えず、RGB シフトだけが大きくなる。
pixelate — モザイク / ピクセルアートブロック
最近傍サンプリングで縮小してから、同じく最近傍で拡大して戻す — ピクセルアートの定石。
- ソース:
src/commands/pixelate.js - フィルタ:
scale=iw/S:ih/S:flags=neighbor,scale=iw*S:ih*S:flags=neighbor
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
--size <n> | 16 | ブロックサイズ。大きいほど粗い |
-o, --output <path> | <入力名>-pixelated.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg pixelate input.mp4 --size 16 --dry-run
ffmpeg -i input.mp4 -vf scale=iw/16:ih/16:flags=neighbor,scale=iw*16:ih*16:flags=neighbor -c:a copy input-pixelated.mp4
綺麗なブロックにしたいなら、サイズはソース寸法の約数を選ぶ — 1280×720 に対して --size 16 だと 80×45 ブロックぴったり。1920×1080 だと 120×67.5 になり、FFmpeg が丸めるので端のブロックがわずかに不揃いになる。顔や車のナンバープレートを部分的に隠したいだけなら blur --region X:Y:W:H のほうが向いている — pixelate は常にフレーム全体に適用される。
motion-blur — フレーム平均モーションブラー
FFmpeg の tmix フィルタで連続フレームを平均化して1フレームに合成する。モーショントレイル風の流れた絵になる。
- ソース:
src/commands/motion-blur.js - フィルタ:
tmix=frames=N
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
--frames <n> | 5 | 混ぜるフレーム数。多いほどブラーが強くなる |
-o, --output <path> | <入力名>-motion-blur.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg motion-blur input.mp4 --frames 5 --dry-run
ffmpeg -i input.mp4 -vf tmix=frames=5 -c:a copy input-motion-blur.mp4
tmix は出力フレームレートを入力と同じに保つ — スライディングウィンドウで平均するだけで、フレーム間引きはしない。これにより「シャッタースピード由来のリアルなモーションブラー」を再現できる。残像を長く残したい演出には --frames 15〜20 に。60fps ソースに対する 180° シャッター相当のリアル系モーションブラーなら --frames 3 が目安。
sharpen — アンシャープマスク(light / medium / strong)
FFmpeg の unsharp フィルタを3段階のプリセットで公開。light/medium/strong がそれぞれ unsharp=3:3:1、5:5:1.5、7:7:2 にマップされる。
- ソース:
src/commands/sharpen.js - フィルタ:
unsharp=<luma_size>:<luma_size>:<amount>
| 引数 / オプション | デフォルト | 選択肢 | 補足 |
|---|---|---|---|
<input> | 必須 | — | 入力動画 |
--strength <level> | medium | light/medium/strong | unsharp パラメータが切り替わる |
-o, --output <path> | <入力名>-sharpened.<拡張子> | — | 出力ファイル名上書き |
$ npx fqmpeg sharpen input.mp4 --strength medium --dry-run
ffmpeg -i input.mp4 -vf unsharp=5:5:1.5 -c:a copy input-sharpened.mp4
medium(デフォルト)はスマホ撮影の眠い絵を持ち上げる無難な選択。strong だと高コントラストのエッジ(文字、空と屋根の境界など)にハロが出ることがある。中間値が欲しいなら --dry-run の 5:5:1.5 を自分の <x>:<y>:<amount> に書き換える(例: 7:7:1.0 で広めだが穏やかなシャープ)。
blur — ボックスブラー(全体または領域指定)
boxblur フィルタを名前付きプリセット(light=5、medium=15、strong=30)または任意の整数で指定する。--region X:Y:W:H を付けるとそのストリームを split → 指定領域だけを crop して boxblur → 元に戻して overlay する — 顔やナンバープレートを画面の他の部分に触らずぼかす用途に最適。
- ソース:
src/commands/blur.js - フィルタ(全体):
boxblur=N - フィルタ(領域):
[0:v]split[base][blur];[blur]crop=W:H:X:Y,boxblur=N[blurred];[base][blurred]overlay=X:Y
| 引数 / オプション | デフォルト | 補足 |
|---|---|---|
<input> | 必須 | 入力動画 |
--strength <level> | medium | light(5) / medium(15) / strong(30) または任意の整数 |
--region <x:y:w:h> | — | 領域だけにブラーを適用 |
-o, --output <path> | <入力名>-blurred.<拡張子> | 出力ファイル名上書き |
$ npx fqmpeg blur input.mp4 --strength medium --dry-run
ffmpeg -i input.mp4 -vf boxblur=15 -c:a copy input-blurred.mp4
$ npx fqmpeg blur input.mp4 --strength 8 --region 100:50:300:200 --dry-run
ffmpeg -i input.mp4 -filter_complex [0:v]split[base][blur];[blur]crop=300:200:100:50,boxblur=8[blurred];[base][blurred]overlay=100:50 -c:a copy input-blurred.mp4
boxblur は速い代わりに鋭いエッジで「角張ったブラー」が出る。見栄え重視なら --dry-run を書き換えて boxblur=N を gblur=sigma=N(Gaussian、重いが滑らか)に置き換える。動く被写体の顔を追従させたいケースでは --region は静的な矩形しか受け取らない — モーショントラッキングは上流のポーズ検出パイプラインが必要だ。
HDR・グレイン
hdr-to-sdr — HDR (BT.2020 + PQ/HLG) → SDR (BT.709) にトーンマップ
Netflix や YouTube から HDR コンテンツを落としてきて、HDR 非対応のディスプレイで再生したら色が眠く見える — その変換をやるのがこれ。zscale + tonemap の処理チェーンに、3種のトーンマップアルゴリズムから選ぶ。
- ソース:
src/commands/hdr-to-sdr.js - フィルタチェーン:
zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=<algo>:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p
| 引数 / オプション | デフォルト | 選択肢 | 補足 |
|---|---|---|---|
<input> | 必須 | — | HDR 入力 |
--tonemap <algo> | hable | hable / reinhard / mobius | トーンマップカーブ |
-o, --output <path> | <入力名>-sdr.<拡張子> | — | 出力ファイル名上書き |
$ npx fqmpeg hdr-to-sdr input.mp4 --tonemap hable --dry-run
ffmpeg -i input.mp4 -vf zscale=t=linear:npl=100,format=gbrpf32le,zscale=p=bt709,tonemap=hable:desat=0,zscale=t=bt709:m=bt709:r=tv,format=yuv420p -c:a copy input-sdr.mp4
PQ/HLG → リニア → トーンマップ → BT.709 SDR の順で再エンコードする。hable(Uncharted 2 由来のカーブ)がデフォルト — 自然なミッドトーンと穏やかなハイライトロールオフ。reinhard はもっと積極的に圧縮する(平坦な絵に)。mobius はハイライトのディテールを残す代わりにミッドトーンが少し落ちる。理論とアルゴリズム別の使い分けは FFmpeg で HDR を SDR にトーンマッピングする で詳しく書いている。
zscale は FFmpeg のビルドに --enable-libzimg が必要だ。入ってないと Unrecognized option 'zscale' で落ちる。Homebrew・apt・主要な静的ビルドにはたいてい含まれている。
noise — フィルムグレイン追加
FFmpeg の noise フィルタを2分布で公開。gaussian(デフォルト)はオーガニックなフィルムグレインらしい見た目、uniform はデジタル感のある均一なスプリンクル。
- ソース:
src/commands/noise.js - フィルタ:
noise=alls=N:allf=t+a(gaussian)またはnoise=alls=N:allf=t+u(uniform)
| 引数 / オプション | デフォルト | 選択肢 / 範囲 | 補足 |
|---|---|---|---|
<input> | 必須 | — | 入力動画 |
--strength <n> | 20 | 1〜100 | グレインの強度 |
--type <type> | gaussian | gaussian / uniform | 分布 |
-o, --output <path> | <入力名>-noisy.<拡張子> | — | 出力ファイル名上書き |
$ npx fqmpeg noise input.mp4 --strength 20 --type gaussian --dry-run
ffmpeg -i input.mp4 -vf noise=alls=20:allf=t+a -c:a copy input-noisy.mp4
--strength 20 は控えめなフィルムグレイン相当(絵を邪魔しない)。--strength 60 は 8mm 手持ちカメラ風。80 を超えると絵を支配する強さで、加工された古映像風に使える。フィルタ内の +t フラグは「時間方向のノイズ」(フレーム毎に違う)— これが無いと静的なディザリングになる。fqmpeg は常に +t を付ける。
実用ユースケース
複数の動詞を組み合わせて、実務で使える流れを3本。
ユースケース 1: スマホ素材を素早く「シネマティック」に
スマホで撮ったクリップ(露出は適正、彩度ふつう、ただし YouTube で見ると眠い)を、ハイライト暖色寄り・シャドウ寒色寄り・少しコントラスト・2.35:1 のレターボックスバー付きで仕上げる。
# Step 1: ティール&オレンジ風のシャドウ/ハイライト振り分け
npx fqmpeg color-balance clip.mp4 --rs -0.1 --bs 0.15 --rh 0.1 --bh -0.1
# → clip-balanced.mp4
# Step 2: コントラスト持ち上げ + 彩度を少しだけ上げる
npx fqmpeg color clip-balanced.mp4 --contrast 1.15 --saturation 1.1
# → clip-balanced-color.mp4
# Step 3: 2.35:1 レターボックス
npx fqmpeg cinematic clip-balanced-color.mp4 --ratio 2.35
# → clip-balanced-color-cinematic.mp4
もし手元に本物のグレーディング LUT (.cube) があるなら(有料パックや Resolve からのエクスポート)、Step 1–2 を npx fqmpeg lut clip.mp4 mylook.cube に置き換える。LUT を使うとプロジェクト全体で一貫した色を当てられる — color-balance + color の組み合わせは「LUT が手元にないとき」のワークフローだ。
ユースケース 2: グリーンスクリーン素材 → 最終合成
被写体をグリーンバックの前で撮影し、背景の画像か動画がある状態。きれいにキー抜き、緑被りなし、編集用にアルファチャンネル付きマスターを作る。
# Step 1: 最終背景に合成してプレビュー
npx fqmpeg chromakey actor.mp4 backdrop.jpg --color 0x00FF00 --similarity 0.3 --blend 0.15
# → actor-keyed.mp4
# Step 2(任意): 編集ソフト用のアルファチャンネルマスターを書き出し
npx fqmpeg alpha actor.mp4 --color 0x00FF00 --similarity 0.3 --blend 0.15
# → actor-alpha.webm
# Step 3(任意): 緑被りが残るときは緑の彩度を少し落とす
npx fqmpeg chroma actor-keyed.mp4 --hue -5 --saturation 0.9
# → actor-keyed-chroma.mp4
被写体のエッジや肩に緑が回り込んでいるなら --blend を 0.2〜0.3 に上げる(または若干のハロを許容する)。肌色が緑被りしているような場合は、キー抜き後に color-balance --gm -0.1(ミッドトーンの緑を下げる)を当てるほうが整う。
ユースケース 3: HDR ダウンロード → SDR Web アップロード
Netflix 系の高解像度ストリームはたいてい HDR (BT.2020 + PQ または HLG) で来る。YouTube への再アップや SNS シェアには SDR (BT.709) が必要だ。順序を間違えると「30分かけてレンダリングしたのに灰色」になりやすい。
# Step 1: トーンマップ HDR → SDR(最初にやる。HDR を SDR としてそのまま再エンコードしない)
npx fqmpeg hdr-to-sdr hdr-clip.mp4 --tonemap hable
# → hdr-clip-sdr.mp4
# Step 2: トーンマップで落ちた彩度を任意で回復
npx fqmpeg color hdr-clip-sdr.mp4 --saturation 1.15 --contrast 1.05
# → hdr-clip-sdr-color.mp4
# Step 3: 圧縮してアップロード用にする
npx fqmpeg compress hdr-clip-sdr-color.mp4 --crf 21
# → hdr-clip-sdr-color-compressed.mp4
tonemap=hable が無難なデフォルト。屋外 HDR 映像でハイライトが白飛びして見えるなら --tonemap mobius に切り替える(ミッドトーンが少し落ちる代わりにハイライトのディテールが残る)。color --saturation 1.15 のステップは、トーンマップが本質的に彩度を落とすので、SDR としての自然な彩度を戻す最終仕上げだ — 最初に当てるものではない。理論については FFmpeg で HDR を SDR にトーンマッピングする を参照。
よくある質問
Q1: color --contrast の許容範囲が -1000 から 1000 まである理由は? そんな値使わないけど
FFmpeg 側の eq フィルタの contrast パラメータの範囲がそうなっていて、fqmpeg はそれをそのまま検証している。実用上は 0.5(低コントラスト・グレー寄り)から 2.0(高コントラスト・パキッと)に収まる。5 を超えると極端なポスタリゼーション。広い範囲が開いているのは、スタイル系(ホラーやヴェイパーウェイヴ風)の使い方を縛らないため。
Q2: chromakey と color-key — どっちを使えばいい?
内部で使うフィルタは同じ colorkey で、出てくる絵はほぼ変わらない。違いは音声の扱いで、chromakey は -c:a copy で元の音声コーデックを保つが、color-key は無い(出力コンテナのデフォルトコーデックに再エンコードされる)。グリーン/ブルーバックの本式キー抜きで音声をクリーンに保ちたいなら chromakey。それ以外の任意色を抜く場合は両者ほぼ等価で、音声を気にしないなら color-key でも問題ない。
Q3: alpha は .webm を出力する — Premiere 用に .mov + ProRes 4444 が欲しい
alpha のコーデック選択(libvpx-vp9 + libopus)は web 向けにハードコードされていて、オプションでは変えられない。--dry-run の出力をコピーして、libvpx-vp9 を prores_ks -profile:v 4444 -pix_fmt yuva444p10le に、拡張子を .mov に書き換えて FFmpeg を直接叩く。フィルタチェーン(colorkey,format=yuva420p)は両方とも同じ — 違うのはエンコーダだけだ。
Q4: HDR ファイルがトーンマップされない — hdr-to-sdr で Unrecognized option 'zscale' が出る
ビルドに zimg ライブラリが含まれていない。--enable-libzimg 付きのビルドを入れ直す: macOS なら brew reinstall ffmpeg で大抵入る(Homebrew のボトルに zimg が含まれている)。Ubuntu/Debian の公式 apt パッケージにも通常 zimg は入っているが、古いビルドだと外れていることがある。BtbN の FFmpeg-Builds の静的ビルドにも zimg が入っている。
Q5: LUT パックなしで「ハリウッド調」を作るには?
王道は color-balance のティール&オレンジ振り分け(シャドウ寒色、ハイライト暖色)+ 少しのコントラスト持ち上げ:
npx fqmpeg color-balance clip.mp4 --rs -0.1 --bs 0.15 --rh 0.1 --bh -0.1
npx fqmpeg color clip-balanced.mp4 --contrast 1.15 --saturation 1.05
汎用「シネマティック」LUT パックで得られるルックの 70% 程度はこれで再現できる。特定の映画にそっくりにしたいなら本物の LUT が必要 — FreshLUTs や RocketStock の無料パックを試してみる。
Q6: 全部レンダリングせずに「ビフォー・アフター」をプレビューしたい
先に短い検証用クリップを trim で切り出して、それにエフェクトを当てる:
npx fqmpeg trim input.mp4 --start 10 --duration 5 -o test.mp4
npx fqmpeg color test.mp4 --contrast 1.2 -o test-graded.mp4
trim で5秒のサンプルを作っておけば、高 CRF でも数秒で出来上がる。10分待たずにグレード値のイテレーションができる。
Q7: pixelate --size 16 を 1920×1080 ソースに当てるとブロックが揃わない
16 が 1080 を割り切れない(1080 ÷ 16 = 67.5)から。中間段の scale=iw/16:ih/16 で FFmpeg が丸める結果、戻すときに丸め誤差が画面全体に散る。きれいなブロックが欲しいなら両方の寸法の約数を選ぶ — 1920×1080 なら 8、10、20。16 は 1280×720 ならぴったり合う。
Q8: motion-blur と blur の違いは?
motion-blur は時間方向(複数フレームを平均して1枚にする — シャッター中の動きを再現する)。blur は空間方向(各フレームを独立にぼかす — 画面全体を眠くしたり、領域を隠したりする)。見た目はかなり違う: motion-blur は動いている部分だけがブレるが、blur は静止部分も含めて全体がぼける。
Q9: lut に 2D LUT(1チャンネル別カーブ)を渡せる?
不可。lut は lut3d=<file> にハードコードされている。1D LUT(.1dl ファイルやチャンネル別カーブ)が必要なら FFmpeg を直叩きして lut1d フィルタを使う。現代のグレーディングワークフローは 3D LUT のほうが標準で、色相依存のシフトを 1D LUT では扱えない以上、3D LUT がデフォルトになっている。
まとめ
C6 の 23 動詞は、ジオメトリの後・最終圧縮の前にやる「ルック」と「エフェクト」を一通りカバーしている:
color,color-balance,equalize,lut,chromaがグレーディング系(color --contrastの範囲は-1000〜1000だが実用は0.5〜2.0、lutは.cube/.3dl対応)chromakey,color-key,alphaがキーイング・合成系(3つとも内部は同じcolorkeyフィルタ。alphaは web 向けに.webm/VP9+Opus でハードコード)cinematic,vintage,sepia,grayscale,negative,posterize,vignette,edgeがスタイライズ系(vintageは4段フィルタチェーン — 自分でエフェクトを重ねるときのお手本)glitch,pixelate,motion-blur,sharpen,blurが歪み・シャープネス系(blur --regionがプライバシー用モザイクの定番)hdr-to-sdr,noiseが HDR 変換とグレイン(hdr-to-sdrは zimg 必須、noiseのデフォルトは gaussian)
どの動詞も --dry-run で内部の FFmpeg コマンドを出してくれる。デフォルトで足りないとき(.webm 以外のアルファ出力、log ソースに当てる .cube LUT、独自の unsharp 値)は、出力をコピーして書き換えて FFmpeg を直接叩けばいい。fqmpeg 全体の俯瞰は fqmpeg 完全ガイド を参照。