この記事でわかること

  • フィルタグラフ(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 に統合してください。


関連記事


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