この記事でわかること

  • フィルタグラフ(filtergraph)の概念
  • シンプルフィルタ(-vf)と複合フィルタ(-filter_complex)の使い分け
  • フィルタチェーンの書き方(,; の違い)
  • ラベル([label])の使い方
  • 複数入力・複数出力フィルタの実用例

テスト済みバージョン: FFmpeg 6.1
対象 OS: Windows / macOS / Linux


フィルタグラフとは

FFmpegのフィルタグラフは、フィルターノードを接続した有向グラフです。映像・音声フレームがノード間を流れ、各ノードで変換処理が行われます。

入力 → [scale] → [overlay] → 出力

         [logo入力]

シンプルな1入力1出力のフィルタは -vf(映像)または -af(音声)で指定します。複数入力・複数出力や並列チェーンが必要な場合は -filter_complex を使います。


シンプルフィルタ:-vf-af

映像フィルタ(-vf)

ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4
ffmpeg -i input.mp4 -vf "scale=1280:720,fps=30" output.mp4

複数のフィルタを , でつなぐとフィルタチェーンになります。

音声フィルタ(-af)

ffmpeg -i input.mp4 -af "volume=2.0" output.mp4

フィルタチェーンの区切り文字

記号意味
,同一チェーン内で次のフィルタへ(前フィルタの出力が次の入力)
;別のフィルタチェーンを開始(並列チェーン)

-filter_complex の基本

-filter_complex では ラベル[name])を使ってストリームを識別します。

スケールして特定の出力ラベルにバインド

ffmpeg -i input.mp4 -filter_complex "[0:v]scale=640:360[v]" -map "[v]" -map 0:a output.mp4
  • [0:v]:入力0の映像ストリーム
  • scale=640:360:フィルター
  • [v]:出力ラベル(任意の名前)
  • -map "[v]":ラベル付き出力を出力ファイルにマッピング

複数フィルタのチェーン

ffmpeg -i input.mp4 -filter_complex "[0:v]scale=1280:720,fps=30[v]" -map "[v]" -map 0:a -c:a copy output.mp4

ウォーターマーク(画像オーバーレイ)

2つの入力を使う overlay フィルタの例:

ffmpeg -i input.mp4 -i logo.png \
  -filter_complex "[0:v][1:v]overlay=10:10[v]" \
  -map "[v]" -map 0:a -c:a copy output.mp4
  • [0:v]:背景映像
  • [1:v]:ロゴ画像
  • overlay=10:10:左上から (10,10) の位置に重ねる

複数出力の作成(サムネイルと本編を同時生成)

ffmpeg -i input.mp4 \
  -filter_complex "[0:v]scale=1280:720[main];[0:v]scale=320:180[thumb]" \
  -map "[main]" -c:v libx264 -crf 23 main.mp4 \
  -map "[thumb]" -c:v libx264 -crf 28 thumb.mp4

1つの入力から2つの出力ファイルを同時に生成します。


音声と映像を同時に処理する

映像をスケール+音声ボリューム調整を同時に行う例:

ffmpeg -i input.mp4 \
  -filter_complex "[0:v]scale=1280:720[v];[0:a]volume=1.5[a]" \
  -map "[v]" -map "[a]" -c:v libx264 -crf 23 output.mp4

amix で複数音声を合成する

BGM音声と主音声をミックスする:

ffmpeg -i main.mp4 -i bgm.mp3 \
  -filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=2[a]" \
  -map 0:v -map "[a]" -c:v copy output.mp4

split でストリームを分岐させる

1つの映像ストリームを2つに分岐して別々に処理:

ffmpeg -i input.mp4 \
  -filter_complex "[0:v]split[v1][v2];[v1]scale=1280:720[main];[v2]scale=320:180[preview]" \
  -map "[main]" -c:v libx264 -crf 23 main.mp4 \
  -map "[preview]" -c:v libx264 -crf 30 preview.mp4

よくあるエラーと対処法

Filtergraph 'xxx' was defined for video output stream 0:0 but additional output stream xxx of same type was not specified

-filter_complex を使う場合は必ず -map "[label]" で出力ラベルを指定してください。-vf-filter_complex を混在させると競合します。

Invalid option -vf when using filter_complex

-filter_complex を使う場合は -vf-af は使えません。すべてのフィルタ処理を -filter_complex に統合してください。


実測例

1080p/30fps、2分の動画から本編用720pとプレビュー用360pを同時生成する場合、split を使うと入力デコードを1回で済ませられます。

ffmpeg -i input.mp4 \
  -filter_complex "[0:v]split=2[v1][v2];[v1]scale=1280:720[main];[v2]scale=640:360[preview]" \
  -map "[main]" -c:v libx264 -crf 23 main.mp4 \
  -map "[preview]" -c:v libx264 -crf 28 preview.mp4

同じ処理を2回のFFmpegコマンドに分けるより、ディスク読み込みとデコードの重複が減ります。ただし出力エンコードは2本分必要なので、処理時間が半分になるわけではありません。8コア程度のデスクトップ環境では、1本だけの720p出力より1.3〜1.8倍程度長くなることがあります。環境により変動します。


つまずきやすいポイント

  • 症状: ,; を取り違えてフィルタが繋がらない。 原因: , は同一チェーン内の直列接続、; は別チェーンの区切り。対処: 1本のストリームを順に処理するなら ,、ラベルで分岐・合流させるなら ; を使います。例: scale=...,fps=... は直列、[0:v]...[v];[0:a]...[a] は並列です。

  • 症状: Output with label 'x' does not exist というエラー。 原因: -filter_complex で付けた出力ラベルを -map し忘れている、または名前が一致していない。対処: グラフ末尾のラベル(例 [v])を必ず -map "[v]" で参照します。ラベル名は大文字小文字も含め完全一致させます。

  • 症状: 同じ入力ラベルを2回使うとエラーになる。 原因: 各ラベルは一度しか消費できない。対処: 同じストリームを複数回使うときは split(映像)や asplit(音声)で複製してから別ラベルに分けます。本記事の split の例を参照してください。

  • 症状: -filter_complex-vf を併用してエラー。 原因: 両者は排他で、混在できない。対処: すべてのフィルタ処理を -filter_complex 側に統合します。


よくある質問

Q. -vf-filter_complex はいつ使い分けますか。 A. 1入力1出力の単純な処理は -vf(または音声は -af)で十分です。複数入力(オーバーレイ、ミックス)、複数出力、分岐・合流が必要なら -filter_complex を使います。

Q. ラベル名に決まりはありますか。 A. [v][main] など任意の英数字名を付けられます。読みやすさのために役割が分かる名前([thumb] など)を推奨します。入力は [0:v][1:a] のように「入力番号:種別」で参照します。

Q. 1回のデコードで複数出力を作れますか。 A. はい。split でストリームを複製し、それぞれを別の -map で別ファイルに出力します。入力デコードは1回で済み、重複読み込みを避けられます。

Q. 音声と映像を同時に処理できますか。 A. できます。[0:v]...[v];[0:a]...[a] のように別チェーンで処理し、-map "[v]" -map "[a]" で両方を出力にマップします。

Q. フィルタの順序は結果に影響しますか。 A. します。例えば scale の前後で crop を入れるかで結果が変わります。直列チェーンは左から順に適用されるため、意図した順序で並べてください。


関連リソース

よく使うオプション・フィルタ・コーデック設定をまとめた PDF チートシートです。手元に置いておくと調べる時間を短縮できます。

FFmpeg チートシート

関連記事


一次ソース: ffmpeg.org/ffmpeg-filters.html / trac.ffmpeg.org/wiki/FilteringGuide