ffmpeg vfオプション活用術:必須の動画フィルターを使いこなす
動画編集の世界において、ffmpegはその汎用性と高機能性から、多くのプロフェッショナルやエンスージアストに愛用されています。コマンドラインベースでありながら、動画の変換、エンコード、ストリームの操作、そしてこの記事の主題である「フィルター処理」といった、様々なタスクを驚くほど柔軟にこなすことができます。
特に、動画ストリームに対して視覚的な効果や変換を施すための-vf
(または-filter:v
)オプションは、ffmpegを使いこなす上で避けては通れない非常に重要な要素です。解像度の変更から色調補正、テキストや画像の合成、複雑な合成処理まで、-vf
オプションで利用できる動画フィルターは多岐にわたります。
本記事では、ffmpegの-vf
オプションに焦点を当て、その基本的な使い方から、動画編集において「必須」とも言える主要な動画フィルターの詳細な解説、そして複数のフィルターを組み合わせる高度なテクニックまでを、約5000語にわたって徹底的に解説します。この記事を読めば、あなたのffmpegによる動画処理のスキルが格段に向上することでしょう。
さあ、ffmpegの強力な動画フィルターの世界へ飛び込みましょう。
1. はじめに:ffmpegとvf
オプションの役割
1.1 ffmpegとは?
ffmpegは、音声や動画を含むマルチメディアファイルを処理するための、非常に強力でオープンソースのコマンドラインツールです。多数のコンテナフォーマット(MP4, MKV, MOVなど)やコーデック(H.264, H.265, VP9, AAC, MP3など)をサポートしており、ほとんどすべてのマルチメディア処理タスクを実行できます。メディアファイルの変換、ストリーミング、録画、そしてフィルター処理などがその主な機能です。
1.2 vf
オプションの役割:動画ストリームへのフィルター適用
ffmpegのコマンドラインは通常、ffmpeg [global_options] [input_options] -i input_url [output_options] output_url
のような形式をとります。この中で、-vf
または-filter:v
オプションは、入力ストリームから出力ストリームへの変換過程で、動画ストリームに対して特定の処理(フィルター)を適用するために使用されます。
例えば、動画のサイズを変更したい場合、色を調整したい場合、または複数の動画を合成したい場合など、単にフォーマットやコーデックを変換するだけではない視覚的な変更を加えたい場合に-vf
オプションが登場します。
-vf
オプションに続く引数は「フィルターグラフ」と呼ばれ、一つまたは複数のフィルターとその設定を記述します。単純な処理であれば一つのフィルターで済みますが、複数の処理を連続して行いたい場合は、フィルターを連結してより複雑なフィルターグラフを構築します。
1.3 この記事の目的
この記事の目的は、ffmpegの-vf
オプションを使いこなし、様々な動画編集タスクをコマンドラインで実現できるようになることです。具体的には:
-vf
オプションの基本的な構文とフィルターグラフの記述方法を理解する。- 動画編集で頻繁に使用される必須の動画フィルターについて、その目的、基本的な使い方、主要なオプション、応用例を学ぶ。
- 複数のフィルターを連結したり、ラベルを使って複雑なフィルターグラフを構築する方法を理解する。
- フィルター処理のパフォーマンスに関する考慮事項やトラブルシューティングのヒントを得る。
ffmpegのvf
オプションをマスターすることで、バッチ処理による自動化や、GUIツールでは難しい細かな設定が可能になり、あなたの動画編集の幅が大きく広がるでしょう。
2. vf
オプションの基本
-vf
オプションの基本的な構文と、フィルターグラフの記述方法について解説します。
2.1 構文:-vf filtergraph
-vf
オプションの直後には、適用したいフィルターのリストと設定を記述した「フィルターグラフ」を指定します。
bash
ffmpeg -i input.mp4 -vf filtergraph output.mp4
2.2 filtergraph
の構造:filter1=options,filter2=options,...
複数のフィルターを適用する場合、それらはカンマ(,
)で区切って順番に記述します。処理は左から右へと順番に行われます。
bash
ffmpeg -i input.mp4 -vf "filter1=option1=value1:option2=value2,filter2=optionA=valueA" output.mp4
各フィルターは、フィルター名=オプション
の形式で記述します。オプションが複数ある場合は、コロン(:
)で区切ります。
2.3 複数のフィルターを連結する方法
例えば、動画の解像度を変更(scale
)してから、動画の一部を切り出す(crop
)という処理を行いたい場合、以下のように記述します。
bash
ffmpeg -i input.mp4 -vf "scale=1280:720,crop=640:480:100:50" output.mp4
この例では、まずscale
フィルターが適用され、動画が1280×720にリサイズされます。その結果に対して、次にcrop
フィルターが適用され、リサイズされた動画の左上(100,50)から640×480の領域が切り出されます。
フィルターの適用順序は重要です。例えば、上記の例でcrop
とscale
の順序を逆にすると、結果は大きく変わります。元の解像度に対してクロップされてからリサイズされるため、最終的な出力は異なります。
2.4 単純なフィルター(例: scale
)の適用
最も基本的なフィルターの一つであるscale
フィルターを使って、単一のフィルターを適用する例を見てみましょう。動画を640×480にリサイズするには以下のようにします。
bash
ffmpeg -i input.mp4 -vf "scale=640:480" output.mp4
2.5 フィルターオプションの指定方法(key=value
形式)
ほとんどのフィルターは、その動作をカスタマイズするための様々なオプションを持っています。オプションは通常、key=value
の形式で指定し、複数のオプションはコロン(:
)で区切ります。
例:drawtext
フィルターでテキストの色とフォントサイズを指定する場合
bash
ffmpeg -i input.mp4 -vf "drawtext=text='Hello':fontcolor=red:fontsize=24" output.mp4
この例では、drawtext
フィルターに対してfontcolor
とfontsize
という二つのオプションが指定されています。
2.6 複雑なオプション値のエスケープ
フィルターオプションの値に特別な意味を持つ文字(例: ,
, :
, '
, "
など)が含まれる場合、適切にエスケープする必要があります。例えば、drawtext
フィルターで表示するテキストにコロンが含まれる場合、それをエスケープする必要があります。
通常、:
はバックスラッシュ(\
)でエスケープします。ただし、多くのシェルではバックスラッシュも特殊文字であるため、引用符で囲むなどの工夫が必要になる場合があります。
例:テキストにコロンを含む場合
bash
ffmpeg -i input.mp4 -vf "drawtext=text='Time\: %{pts \\(expr/ts\\)}':fontcolor=white:fontsize=24:x=10:y=10" output.mp4
上記の例では、テキスト内のコロンが\
でエスケープされています。また、PTS(Presentation Timestamp)を時間に変換する数式 %\{pts \\(expr/ts\\)\}
の中のカッコ ()
やスラッシュ /
もエスケープが必要な場合がありますが、drawtext
フィルターのテキストオプションは特殊で、多くの記号をそのまま記述できます。より確実なのは、テキストをファイルに書いてtextfile
オプションを使う方法です。
bash
echo "Time: %{pts \(expr/ts\)}" > text_to_draw.txt
ffmpeg -i input.mp4 -vf "drawtext=textfile=text_to_draw.txt:fontcolor=white:fontsize=24:x=10:y=10" output.mp4
このように、オプション値に特殊文字が含まれる場合は、引用符の使い方やエスケープの方法に注意が必要です。
3. 主要な動画フィルターの詳細解説
ここでは、ffmpegで動画編集を行う上で特によく使われる、必須とも言える主要な動画フィルターについて、それぞれの目的、基本的な使い方、主要なオプション、そして応用例を詳しく解説します。
3.1 scale
:解像度変更(リサイズ)
- 目的: 動画の解像度(幅と高さ)を変更します。拡大・縮小が可能です。
- 基本的な使い方:
-vf scale=width:height
- 例:
scale=640:480
(幅640ピクセル、高さ480ピクセルに変更)
- 例:
- 主要オプション:
width
(w
): 出力する動画の幅。-1
を指定すると、高さを指定した場合にアスペクト比を維持して自動計算されます。-2
を指定すると、アスペクト比を維持しつつ幅が指定され、高さが8の倍数になるように自動計算されます(多くのコーデックで推奨されるため便利です)。height
(h
): 出力する動画の高さ。-1
または-2
の使い方はwidth
と同様です。flags
: リサイズに使用するアルゴリズムを指定します。例えば、flags=lanczos
、flags=bicubic
など。デフォルトはbilinear
です。lanczos
やbicubic
はbilinear
より高品質ですが、処理時間は長くなります。force_original_aspect_ratio
: リサイズ時にアスペクト比をどのように扱うかを指定します。disable
(デフォルト): 指定された幅と高さに強制的にリサイズ(アスペクト比が崩れる可能性がある)。increase
: アスペクト比を維持しつつ、指定された幅または高さの大きい方に合わせる。decrease
: アスペクト比を維持しつつ、指定された幅または高さの小さい方に合わせる。
- 応用例:
- HD (1920×1080) から SD (640×480) への変換:
bash
ffmpeg -i input_hd.mp4 -vf "scale=640:480" output_sd_stretched.mp4
# またはアスペクト比を維持して横幅を合わせ、余白を追加
ffmpeg -i input_hd.mp4 -vf "scale=640:-2,pad=640:480:(ow-iw)/2:(oh-ih)/2" output_sd_letterbox.mp4 - アスペクト比を維持したリサイズ:
幅を1280ピクセルに固定し、高さを自動計算してアスペクト比を維持します。多くのコーデックが高さ/幅を2の倍数または8の倍数にすることを推奨するため、-2
を使うのが一般的です。
bash
ffmpeg -i input.mp4 -vf "scale=1280:-2" output_1280.mp4
高さを720ピクセルに固定し、幅を自動計算します。
bash
ffmpeg -i input.mp4 -vf "scale=-2:720" output_720p.mp4 - 特定の最大サイズへのリサイズ:
例えば、幅または高さの大きい方が1080ピクセルを超える場合に、アスペクト比を維持して最大1080ピクセルにリサイズします。
bash
ffmpeg -i input.mp4 -vf "scale='min(1920,iw)':'-2',scale='min(1080,ih)':'-2':force_original_aspect_ratio=decrease" output_max1080p.mp4
(注: この例は少し複雑ですが、アスペクト比維持と最大サイズ制限を組み合わせる一般的な手法です。iw
とih
は入力の幅と高さを表す変数です。)
- HD (1920×1080) から SD (640×480) への変換:
3.2 crop
:動画の一部を切り出す(トリミング)
- 目的: 動画の特定領域だけを切り出し、それ以外の部分を破棄します。
- 基本的な使い方:
-vf crop=w:h:x:y
- 例:
crop=640:480:100:50
(幅640、高さ480の領域を、左上座標(100,50)から切り出す)
- 例:
- 主要オプション:
w
(ow
): 切り出す領域の幅。iw
(入力幅) を使った数式も指定可能。h
(oh
): 切り出す領域の高さ。ih
(入力高さ) を使った数式も指定可能。x
: 切り出す領域の左上隅のX座標。左端が0。iw
やow
を使った数式も指定可能。y
: 切り出す領域の左上隅のY座標。上端が0。ih
やoh
を使った数式も指定可能。
- 応用例:
- アスペクト比の調整(シネマスコープから16:9へなど):
例えば、2.35:1のアスペクト比の動画から上下の黒帯を除去して16:9にする場合。
bash
ffmpeg -i input_cinemascope.mp4 -vf "crop=iw:ih-SOME_PIXELS:0:SOME_PIXELS_FROM_TOP" output_16_9.mp4
具体的なピクセル数は、入力動画と目標とする解像度によります。中心をクロップする場合は、x=(iw-ow)/2
、y=(ih-oh)/2
のように数式を使います。 - 動画の中心から指定サイズをクロップ:
入力動画の中心から、幅640、高さ480の領域を切り出します。
bash
ffmpeg -i input.mp4 -vf "crop=640:480:(iw-640)/2:(ih-480)/2" output_center_crop.mp4 - 動的なクロップ: フレームごとに変化する数式を使ってクロップすることも可能です。例えば、動画の端から内側に少しずつクロップするなど。
bash
ffmpeg -i input.mp4 -vf "crop=iw-t*50:ih-t*50:t*25:t*25" output_dynamic_crop.mp4
(t
は現在のタイムスタンプ(秒)を表す変数です。)
- アスペクト比の調整(シネマスコープから16:9へなど):
3.3 pad
:動画の周りに余白を追加する(パディング)
- 目的: 動画フレームの周囲に指定した色の余白(ピラーボックス、レターボックス)を追加し、解像度を大きくします。
- 基本的な使い方:
-vf pad=width:height:x:y:color
- 例:
pad=1920:1080:(1920-iw)/2:(1080-ih)/2:black
(入力動画を1920×1080の中央に配置し、余白を黒にする)
- 例:
- 主要オプション:
width
(w
): 出力する動画の幅。iw
(入力幅) を使った数式も指定可能。この値は入力幅以上である必要があります。height
(h
): 出力する動画の高さ。ih
(入力高さ) を使った数式も指定可能。この値は入力高さ以上である必要があります。x
: 入力動画フレームの左上隅を、出力フレームの左端からどれだけ離して配置するかのX座標。iw
,ow
を使った数式も指定可能。y
: 入力動画フレームの左上隅を、出力フレームの上端からどれだけ離して配置するかのY座標。ih
,oh
を使った数式も指定可能。color
: 余白の色。色名(例:black
,white
,red
など)またはRGB値(例:#RRGGBB
または0xRRGGBB
)で指定します。デフォルトはblack
。
- 応用例:
- 異なるアスペクト比の動画を統一:
例えば、4:3の動画(640×480)を16:9のフレーム(1920×1080)の中央に配置し、両側に黒帯を追加する場合。まずscale
で幅を合わせ、次にpad
で余白を追加します。
bash
ffmpeg -i input_4_3.mp4 -vf "scale=1920:1440,pad=1920:1080:0:(1080-1440)/2:black" output_16_9_letterbox.mp4
(注: 4:3動画を1920×1080フレームに入れる場合、幅1920に合わせると高さが1440になります。これを高さ1080のフレームの中央に配置すると、上下にそれぞれ(1440-1080)/2 = 180ピクセルの余白ができます。これはレターボックスではなく、中央に配置された4:3動画の上下に黒帯ができるピラーボックスの間違いでした。正しくは、アスペクト比を維持して高さを合わせ、左右に余白を追加する例です。)
正しい例 (4:3動画を16:9フレームの中央に配置 – ピラーボックス):
入力 640×480 (4:3) を 1280×720 (16:9) フレームに入れる場合。高さを720に合わせると幅は 720 * 4 / 3 = 960。左右に (1280 – 960) / 2 = 160 ピクセルの余白を追加。
bash
ffmpeg -i input_4_3.mp4 -vf "scale=960:720,pad=1280:720:(1280-960)/2:0:black" output_16_9_pillarbox.mp4 - 動画を特定の解像度の中央に配置:
入力動画を1920×1080フレームの中央に配置します。
bash
ffmpeg -i input.mp4 -vf "pad=1920:1080:(1920-iw)/2:(1080-ih)/2:black" output_centered.mp4
- 異なるアスペクト比の動画を統一:
3.4 trim
:動画の一部を指定した時間で切り出す
- 目的: 動画ストリームを指定した開始時刻、終了時刻、または継続時間でトリミングします。
- 基本的な使い方:
-vf trim=start=SS:end=EE
または-vf trim=start=SS:duration=DD
- 例:
trim=start=10:end=20
(動画の10秒から20秒までを切り出す) - 例:
trim=start=5:duration=15
(動画の5秒から15秒間を切り出す)
- 例:
- 主要オプション:
start
(s
): トリミングを開始する時刻(秒単位)。小数点可。end
(e
): トリミングを終了する時刻(秒単位)。この時刻までを含みます。duration
(d
): トリミングする継続時間(秒単位)。start_frame
(sf
): トリミングを開始するフレーム番号(0始まり)。end_frame
(ef
): トリミングを終了するフレーム番号。このフレームまでを含みます。duration_frames
(df
): トリミングするフレーム数。
- 応用例:
- 動画の先頭の数秒をカット:
先頭から10秒をカットする場合。start
を指定せずduration
を指定すると、先頭からのduration分が切り出されるフィルターに見えますが、実際はtrim
は開始時点からの期間を切り出すため、先頭カットにはstart
とend
またはstart
とduration
を組み合わせるか、入力オプション-ss
と組み合わせて使うのがより効率的です。しかしtrim
単体で実現するなら、例えば最初の5秒をスキップしてそれ以降を全部使うなら、start=5
として別のフィルター(例えばsetpts=PTS-START_PTS
など)と組み合わせる必要があります。簡単なのは入力オプション-ss
です。trim
は通常、出力オプションとして使うか、複雑なフィルターグラフ内で使われます。
動画の最初の10秒だけを切り出すなら:
bash
ffmpeg -i input.mp4 -vf "trim=duration=10" -af "atrim=duration=10" output_first_10s.mp4
動画の5秒から15秒までを切り出す(長さ10秒):
bash
ffmpeg -i input.mp4 -vf "trim=start=5:duration=10" -af "atrim=start=5:duration=10" output_5s_to_15s.mp4
(注:atrim
は音声ストリーム用のトリミングフィルターです。動画と音声の両方を正確にトリミングするには、両方のストリームにフィルターを適用するか、入力オプション-ss
と出力オプション-to
または-t
を組み合わせるのが一般的です。-ss
を入力オプションとして使うと、デコード開始位置を指定できるため、より効率的なシークが可能です。) - 特定のフレーム範囲を切り出す:
フレーム番号100から200までを切り出す場合。
bash
ffmpeg -i input.mp4 -vf "trim=start_frame=100:end_frame=200" output_frames_100_200.mp4
- 動画の先頭の数秒をカット:
- 注意点:
trim
フィルターはストリームのタイムスタンプを変更するわけではなく、指定した範囲外のフレームを破棄するだけです。そのため、trim
の後に別のフィルター(特に時間に関わるもの、例:setpts
)を適用する場合は、タイムスタンプの扱いを考慮する必要があります。通常、setpts=PTS-START_PTS
のようなフィルターを組み合わせて、トリミング後の最初のフレームのタイムスタンプを0に戻します。
3.5 setpts
:タイムスタンプを変更する
- 目的: 各フレームの表示タイムスタンプ(PTS: Presentation Timestamp)を変更することで、動画の再生速度を変更したり、フレームの順序を入れ替えたりします。
- 基本的な使い方:
-vf setpts=EXPRESSION*PTS
- 例:
setpts=0.5*PTS
(タイムスタンプを半分にして、再生速度を2倍にする) - 例:
setpts=2*PTS
(タイムスタンプを2倍にして、再生速度を0.5倍(半速)にする)
- 例:
- 主要オプション: オプションは受け付けず、引数としてタイムスタンプ計算のための数式を一つだけ取ります。この数式では以下の変数が利用できます。
PTS
: 元のフレームのタイムスタンプ(秒単位)。PTS_TIME
:PTS
と同じ。N
: 0から始まるフレーム番号。NB_FRAMES
: 入力ストリームの総フレーム数(利用できない場合や正確でない場合がある)。STARTPTS
: フィルターグラフの最初のフレームのタイムスタンプ。STARTT
:STARTPTS
を秒に変換したもの。FRAME_RATE
: ストリームのフレームレート。RTCTIME
: フィルターがフレームを処理した際のシステム時刻(マイクロ秒、モノトニック時間)。RTCSTART
: フィルターグラフの開始時のシステム時刻。
- 応用例:
- 再生速度変更:
2倍速:-vf "setpts=0.5*PTS"
半速:-vf "setpts=2*PTS"
(注: 音声ストリームも同様に速度変更する必要があります。音声の場合はatempo
フィルターを使用します。atempo
は0.5~100.0の範囲でしか指定できません。より自由な速度変更や逆再生にはrubberband
やaresample
などのフィルターが必要です。)
動画・音声両方を2倍速にする例:
bash
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output_2x_speed.mp4
動画・音声両方を半速にする例:
bash
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" output_0.5x_speed.mp4 - 動画のリバース:
setpts
単体ではフレーム順序を物理的に入れ替えることはできません。通常はreverse
フィルターと組み合わせて使用します。
bash
ffmpeg -i input.mp4 -vf "reverse,setpts=PTS-STARTPTS" -af "areverse,asetpts=PTS-STARTPTS" output_reversed.mp4
(注:reverse
フィルターは動画全体をメモリに読み込むため、長い動画では大量のメモリが必要になります。) - フレームスキップ:
例えば、フレーム番号が3の倍数のフレームだけを表示する場合(1/3のフレームレートにするわけではありません。単に間引きます)。
bash
ffmpeg -i input.mp4 -vf "setpts='if(eq(mod(N,3),0),PTS,NAN)'" output_skip_frames.mp4
(NAN
は”Not A Number”で、そのフレームを破棄することを示します。) ただし、これはPTSを変更するだけなので、実際にフレームが破棄されるのはエンコード時です。
- 再生速度変更:
- 注意点:
setpts
は非常に強力ですが、タイムスタンプの扱いは複雑になりがちです。特に複数の入力やフィルターを組み合わせる場合は、PTS
変数の意味がフィルターグラフ内の位置によって変化する可能性があることに注意が必要です。通常、PTS
は入力ストリームの開始からのタイムスタンプですが、一部のフィルターでは前のフィルターからの出力ストリームのタイムスタンプを参照します。STARTPTS
は通常、フィルターグラフの最初のフレームのタイムスタンプを参照します。
3.6 fps
:フレームレートを変更する
- 目的: 動画のフレームレート(1秒あたりのフレーム数)を変更します。元のフレームを間引いたり、必要に応じて複製したりします。
- 基本的な使い方:
-vf fps=fps=RATE
- 例:
fps=fps=30
(フレームレートを30fpsにする)
- 例:
- 主要オプション:
fps
(r
): 目標とするフレームレート。整数、分数(例:30000/1001
)、または小数点数で指定します。round
: フレームの時刻をどのように丸めるかを指定します。zero
(デフォルト): ゼロ方向へ、inf
: 無限大方向へ、down
: 常に切り捨て、up
: 常に切り上げ、sync_pts
: 入力PTSに同期。通常はデフォルトのzero
で問題ありません。sync
: タイムスタンプをどの入力ストリームに同期させるかを指定します。デフォルトは0番目の入力ストリームです。
- 応用例:
- 60fps動画を30fpsに変換: 単純にフレームを間引きます。
bash
ffmpeg -i input_60fps.mp4 -vf "fps=fps=30" output_30fps.mp4 - 24fps動画を60fpsに変換: 必要に応じてフレームが複製されます(補間ではありません)。
bash
ffmpeg -i input_24fps.mp4 -vf "fps=fps=60" output_60fps_duplicated.mp4 - NTSCフィルムプルダウン (23.976fps -> 29.97fps) のシミュレーション/除去:
fps
フィルターは主に単純なフレームレート変更に使用されます。プルダウン処理には、より高度なフィルター(例:pullup
,decimate
など)が必要になる場合があります。しかし、単純にフレームレートを合わせるだけならfps
で可能です。
bash
ffmpeg -i input_23976.mp4 -vf "fps=fps=30000/1001" output_2997.mp4 # 23.976 -> 29.97 (フレーム複製)
- 60fps動画を30fpsに変換: 単純にフレームを間引きます。
- 注意点:
fps
フィルターはフレーム補間を行いません。フレームレートを上げる場合は単純なフレーム複製、下げる場合は単純なフレーム間引きが行われます。スムーズなフレームレート変換(特に上げたい場合)には、minterpolate
などのより複雑なフレーム補間フィルターが必要です。
3.7 transpose
/ rotate
:動画を回転・反転させる
- 目的: 動画全体を指定した角度で回転させたり、垂直・水平方向に反転させたりします。
- 基本的な使い方:
-vf transpose=DIRECTION
(90度回転と反転)-vf rotate=ANGLE
(任意の角度で回転)
- 主要オプション:
transpose
のオプション (DIR
またはdirection
):0
: 90度反時計回り + 垂直反転1
: 90度時計回り2
: 90度反時計回り3
: 90度時計回り + 垂直反転
(注:transpose=1
を2回適用すると180度回転、transpose=1
を4回適用すると元の向きに戻ります。)
rotate
のオプション (ANGLE
またはa
):- 回転角度をラジアン単位で指定します。数式も使用可能。
- 例:
rotate=PI/2
(90度時計回り)、rotate=-PI/2
(90度反時計回り)、rotate=PI
(180度)。PI
はπ(約3.14159)を表す組み込み定数です。 rotate
フィルターは回転によって生じる空白部分を背景色で埋めます。c
(color) オプションで色を指定できます。デフォルトは黒。ow
,oh
オプションで出力解像度を自動計算できます ('ow=rotw(a)':oh=roth(a)'
)。
- 応用例:
- 縦向き動画を横向きに(90度時計回り):
bash
ffmpeg -i input_portrait.mp4 -vf "transpose=1" output_landscape.mp4 - 動画を180度回転:
bash
ffmpeg -i input.mp4 -vf "transpose=2,transpose=2" output_180deg.mp4 # transposeを2回 (90度反時計回り x 2)
# または rotate を使用
ffmpeg -i input.mp4 -vf "rotate=PI" output_180deg_rotate.mp4 - 動画を垂直反転(上下逆):
vflip
フィルターを使用するのが簡単です。hflip
は水平反転(左右逆)。
bash
ffmpeg -i input.mp4 -vf "vflip" output_vflip.mp4
- 縦向き動画を横向きに(90度時計回り):
- 注意点:
transpose
は90度単位の回転に向いています。rotate
は任意の角度で回転できますが、回転によって動画領域が小さくなったり、空白ができたりします。出力解像度を適切に設定しないと、回転したオブジェクトがフレームからはみ出す可能性があります。多くの場合、rotate
とscale
フィルターを組み合わせて使用します。
3.8 yadif
:インターレース解除(デインターレース)
- 目的: インターレース方式で記録された動画(古いTV放送やDVDなど)を、プログレッシブ方式に変換します。インターレース動画をそのまま表示すると、動きのある部分に櫛状のノイズ(コームノイズ)が発生することがあります。
- 基本的な使い方:
-vf yadif
- 主要オプション:
mode
: デインターレースの方式を指定します。0
(またはsend_frame
): field-by-field。各フレームを2つのフィールドに分け、それぞれを補間してプログレッシブフレームとして出力。結果としてフレーム数が2倍になります。1
(またはsend_field
): frame-doubling。各フレームを2つのフィールドに分け、補間して元のフレームと同じ枚数のプログレッシブフレームを出力。元のフレームレートは維持されます。2
(またはsend_frame_nospatial
):0
と同じですが、空間チェックを行いません。3
(またはsend_field_nospatial
):1
と同じですが、空間チェックを行いません。- デフォルトは
0
。通常は1
でフレームレートを維持するのが好まれることが多いです。
parity
: フィールドの順番を指定します。tff
(またはtop
) はトップフィールドファースト、bff
(またはbottom
) はボトムフィールドファースト。-1
(またはauto
) はストリーム情報から自動検出(推奨)。デフォルトは-1
。deint
: デインターレースを適用するフレームを指定します。0
(またはall
): すべてのフレームにデインターレースを適用。1
(またはinterlaced
): インターレースと検出されたフレームにのみ適用。デフォルトは0
。
- 応用例:
- DVDソースをプログレッシブ化:
bash
ffmpeg -i input_dvd.vob -vf "yadif=mode=1" output_progressive.mp4
(注:-vf yadif=1
のようにモード番号だけ指定することも可能です。) - インターレース検出されたフレームのみデインターレース:
bash
ffmpeg -i input_interlaced.mp4 -vf "yadif=deint=1" output_deinterlaced.mp4
- DVDソースをプログレッシブ化:
- 注意点:
yadif
は一般的に高品質で高速なデインターレースフィルターですが、完璧ではありません。特に動きの速いシーンではアーティファクトが残る可能性があります。より高品質なデインターレースが必要な場合は、bwdif
やw3fdif
などの他のフィルターを検討することもできます。
3.9 unsharp
/ sharpen
:シャープネス調整
- 目的: 動画の輪郭を強調したり、ぼかしたりして、シャープネスを調整します。
- 基本的な使い方:
-vf unsharp=luma_l:luma_c:luma_t:chroma_l:chroma_c:chroma_t
(アンシャープマスク効果)- 例:
unsharp=5:5:0.8:5:5:0
(輝度成分に標準的なシャープネスを適用)
- 例:
- 主要オプション: 各オプションは
radius:amount:threshold
の形式で指定します。luma
は輝度、chroma
は色差です。luma_l
(lx
): 輝度成分の水平方向半径。奇数を指定。luma_c
(ly
): 輝度成分の垂直方向半径。奇数を指定。luma_t
(lt
): 輝度成分の適用しきい値。0.0~1.0。小さいほど強く適用。chroma_l
(cx
): 色差成分の水平方向半径。奇数を指定。chroma_c
(cy
): 色差成分の垂直方向半径。奇数を指定。chroma_t
(ct
): 色差成分の適用しきい値。0.0~1.0。unsharp
フィルターでは、amount
が正の値でシャープ、負の値でぼかしになります。sharpen
フィルターもほぼ同じオプションを持ち、amount
は常にシャープネスの強さを指定します。
- 応用例:
- 動画のシャープネスを上げる:
bash
ffmpeg -i input.mp4 -vf "unsharp=lqf=7:lqs=1.5:cqf=7:cqs=0.0:lth=0.0:cth=0.0" output_sharpened.mp4
# または unsharp=5:5:1.0:5:5:0.0 (luma_l=5, luma_c=5, luma_t=1.0, chroma_l=5, chroma_c=5, chroma_t=0.0)
# radius:amount:threshold の形式で指定する場合は、例えば
ffmpeg -i input.mp4 -vf "unsharp=5:5:0.8:3:3:0.5" output_sharpened_detail.mp4
(注: オプションの指定方法が少し複雑です。lqf
/lqs
/lth
形式とluma_l
/luma_c
/luma_t
形式があります。新しいバージョンでは後者が推奨されています。半径は通常5×5や7×7のような奇数カーネルサイズを指定します。amountはシャープネスの強さで、1.0程度が標準的です。thresholdはノイズに乗るのを防ぐためのしきい値で、0.0は常に適用されます。) - 動画を少しぼかす:
unsharp
フィルターで負のamount
を指定します。
bash
ffmpeg -i input.mp4 -vf "unsharp=5:5:-0.5:3:3:-0.2" output_blurred.mp4
- 動画のシャープネスを上げる:
- 注意点: シャープネスを強くかけすぎると、ノイズも強調されてしまうことがあります。適度な設定を見つけるのが重要です。
3.10 hue
/ sat
/ brightness
/ contrast
(および eq
):色調補正
- 目的: 動画の色相、彩度、輝度、コントラストなどの色関連のプロパティを調整します。
eq
(equalizer) フィルターはこれらの調整をまとめて行うことができます。 - 基本的な使い方:
-vf hue=h=ANGLE:s=SATURATION
-vf eq=contrast=CONTRAST:brightness=BRIGHTNESS:saturation=SATURATION:gamma=GAMMA
- 主要オプション:
hue
フィルター:h
(H
): 色相回転角度(度単位)。-360.0~360.0。デフォルト0。s
(S
): 彩度。0.0~10.0。1.0が通常。0.0でグレースケール。b
(B
): 輝度。-10.0~10.0。0.0が通常。
eq
フィルター:contrast
(c
): コントラスト。-1000.0~1000.0。1.0が通常。brightness
(b
): 輝度。-1000.0~1000.0。0.0が通常。saturation
(s
): 彩度。0.0~3.0。1.0が通常。gamma
(g
): ガンマ補正。0.1~10.0。1.0が通常。- その他、個別チャンネルのガンマ、レッド/グリーン/ブルーの調整、色温度など、非常に多くのオプションがあります。
- 応用例:
- 彩度を上げて色を鮮やかに:
bash
ffmpeg -i input.mp4 -vf "eq=saturation=1.5" output_high_sat.mp4 - グレースケールに変換:
bash
ffmpeg -i input.mp4 -vf "eq=saturation=0.0" output_grayscale.mp4
# または format=gray で変換
ffmpeg -i input.mp4 -vf "format=gray" output_grayscale_alt.mp4 - コントラストと明るさを調整:
bash
ffmpeg -i input.mp4 -vf "eq=contrast=1.2:brightness=0.05" output_adjusted.mp4 - 色相を少し回転:
bash
ffmpeg -i input.mp4 -vf "hue=h=30" output_hue_shifted.mp4
- 彩度を上げて色を鮮やかに:
- 注意点: 色調補正は主観的な要素が大きいため、出力を見ながら適切な値を調整する必要があります。
eq
フィルター一つで多くの調整が可能なので便利です。
3.11 overlay
:複数の動画/画像を合成する
- 目的: 一つの動画ストリームの上に、別の動画ストリームや画像ストリームを重ね合わせて合成します。ピクチャーインピクチャー、ロゴ挿入、ウォーターマークなどに使用します。
- 基本的な使い方:
-vf "main_stream[main]; overlay_stream[overlay]; [main][overlay]overlay=x:y[out]"
(複雑なフィルターグラフの例)- 単純な例:
-vf "overlay=x:y"
(入力が2つある場合、2番目の入力が1番目の入力の上に重なる)
- 単純な例:
- 主要オプション:
x
: オーバーレイするストリームの左上隅のX座標。メインストリームの左端が0。W
,H
,w
,h
(メイン/オーバーレイの幅/高さ),n
(フレーム番号),t
(タイムスタンプ) などの変数を使った数式も指定可能。y
: オーバーレイするストリームの左上隅のY座標。メインストリームの上端が0。x
と同様の変数が使用可能。format
: 出力ピクセルフォーマット。rgb
: 入力ストリームがRGBの場合の扱い。alpha
: アルファチャンネル(透明度)の扱い。enable
(e
): オーバーレイを有効にするタイミングを制御する数式。例:enable='gte(t,5)*lte(t,10)'
(5秒から10秒の間だけオーバーレイを有効にする)。eof_action
: オーバーレイするストリームがメインストリームより早く終了した場合の動作。repeat
(デフォルト): 最後のフレームを繰り返す、endall
: 両方のストリームを終了、pass
: 何もせず、オーバーレイ部分が消える。
- 応用例:
- 動画の右下にロゴ画像を挿入:
bash
ffmpeg -i input.mp4 -i logo.png -vf "overlay=x=W-w-10:y=H-h-10" output_with_logo.mp4
(W
/H
はメイン動画の幅/高さ、w
/h
はオーバーレイ画像(ロゴ)の幅/高さです。右下から10ピクセル内側に配置する例です。) - ピクチャーインピクチャー(PIP): メイン動画の右上に、縮小した別の動画を合成。
bash
ffmpeg -i main.mp4 -i pip.mp4 -vf "[1:v]scale=320:-1[pip]; [0:v][pip]overlay=x=W-w-10:y=10" output_pip.mp4
(注: この例では、入力0(メイン動画)のビデオストリーム[0:v]
と入力1(PIP動画)のビデオストリーム[1:v]
を使用しています。フィルターグラフ内でラベル[pip]
を使って、縮小したPIP動画を参照しています。最後のoverlay
フィルターで、メイン動画と縮小したPIP動画を合成しています。) - 特定の時間帯だけオーバーレイを表示:
bash
ffmpeg -i input.mp4 -i logo.png -vf "overlay=x=10:y=10:enable='gte(t,5)*lte(t,10)'" output_timed_logo.mp4
(動画開始から5秒後に出現し、10秒後に消えるロゴ。)
- 動画の右下にロゴ画像を挿入:
- 注意点:
overlay
フィルターは、複数の入力ストリーム(動画、画像)を受け付けます。-i
オプションで複数の入力ファイルを指定し、フィルターグラフ内でそれぞれのストリームをラベルで参照して使用するのが一般的な方法です。例えば、最初の入力のビデオは[0:v]
、2番目の入力のビデオは[1:v]
のように参照できます。
3.12 drawtext
:動画にテキストを描画する
- 目的: 動画フレーム上に、指定したテキストを描画します。タイムスタンプ、字幕、キャプション、カウントダウンタイマーなどに利用できます。
- 基本的な使い方:
-vf drawtext="text='Your Text':fontfile=/path/to/font.ttf:x=X:y=Y:options"
- 例:
drawtext="text='Hello World':fontcolor=white:fontsize=24:x=10:y=10"
- 例:
- 主要オプション:
text
: 表示するテキスト文字列。特殊文字(コロンなど)はエスケープが必要な場合があります。textfile
オプションでファイルから読み込むことも推奨されます。textfile
: テキスト文字列を含むファイルのパス。fontfile
: 使用するフォントファイルのパス(例:.ttf
,.otf
)。システムのフォントを指定する場合は、フォント名やパスの指定方法がOSによって異なる場合があります。fontcolor
: テキストの色。色名またはRGB値。fontcolor_expr
で動的に変更も可能。fontsize
: フォントサイズ。x
,y
: テキストを描画する位置の座標。数式も使用可能 (w
,h
(動画サイズ),text_w
,text_h
(テキストサイズ),n
(フレーム番号),t
(タイムスタンプ)など)。- 例:
x=(w-text_w)/2:y=(h-text_h)/2
(動画の中央に配置) - 例:
x=10:y=h-text_h-10
(左下から10ピクセル内側に配置)
- 例:
enable
(e
): テキスト表示を有効にするタイミングを制御する数式。例:enable='gte(t,5)'
(5秒後から表示)。timecode
: タイムコード表示を有効にし、フォーマットを指定。例:timecode='00\:00\:00\:00'
.timecode_rate
: タイムコードのフレームレートを指定。box
: テキストの周囲に背景ボックスを描画するかどうか。1
または0
。boxcolor
: 背景ボックスの色。line_spacing
: 行間。- 動的なテキスト表示のための変数:
%\{n\}
,%\{frame_num\}
,%\{t\}
,%\{pts\}
,%\{pts_time\}
,%\{localtime\}
など。
- 応用例:
- 動画の左上にシンプルなタイムスタンプを表示:
bash
ffmpeg -i input.mp4 -vf "drawtext=text='%{pts_time}':fontfile=/path/to/font.ttf:fontcolor=white:fontsize=24:x=10:y=10" output_timestamp.mp4 - 動画の中央下部にキャプションを表示:
bash
ffmpeg -i input.mp4 -vf "drawtext=text='Sample Caption':fontfile=/path/to/font.ttf:fontcolor=yellow:fontsize=36:x=(w-text_w)/2:y=h-text_h-20" output_caption.mp4 - 特定の時間だけ表示されるタイトル:
bash
ffmpeg -i input.mp4 -vf "drawtext=text='Video Title':fontfile=/path/to/font.ttf:fontcolor=blue:fontsize=48:x=(w-text_w)/2:y=(h-text_h)/2:enable='gte(t,1)*lte(t,5)'" output_timed_title.mp4
(動画開始1秒後から5秒後まで、中央にタイトルが表示されます。) - カウントダウンタイマー:
bash
ffmpeg -i input.mp4 -vf "drawtext=text='%{expr\:5-t}':fontfile=/path/to/font.ttf:fontcolor=green:fontsize=60:x=(w-text_w)/2:y=(h-text_h)/2:enable='lte(t,5)'" output_countdown.mp4
(動画開始から5秒間、中央に5秒から0秒へカウントダウンが表示されます。)%\{expr\:...\}
構文で複雑な数式の結果を表示できます。
- 動画の左上にシンプルなタイムスタンプを表示:
- 注意点:
fontfile
オプションは必須です。使用したいフォントのパスを正しく指定する必要があります。OSやffmpegのビルドによってフォントの探し方が異なる場合があるので注意してください。また、日本語などのマルチバイト文字を表示する場合は、対応したフォントファイルと、システムのロケール設定などが適切である必要があります。
3.13 subtitles
/ ass
:字幕ファイルを焼き付ける(ハードサブ)
- 目的: SRT (.srt) や ASS/SSA (.ass/.ssa) 形式の字幕ファイルを動画に直接焼き付けます(ハードサブ)。動画プレイヤー側での表示設定に依存せず、常に同じ見た目で表示されます。
- 基本的な使い方:
-vf subtitles=subtitle_file.srt
(SRTの場合)-vf ass=subtitle_file.ass
(ASS/SSAの場合)
- 主要オプション:
subtitles
フィルター:filename
: 字幕ファイルのパス。original_size
: 入力動画の元の解像度を指定。リサイズフィルターと組み合わせる際に重要になることがあります。alpha
: アルファチャンネル(透明度)の扱い。
ass
フィルター:filename
: ASS/SSA 字幕ファイルのパス。ASS/SSAはSRTよりも複雑なスタイル(フォント、色、位置、アニメーションなど)をサポートしており、ass
フィルターはそれらを忠実に再現しようとします。
- 応用例:
- SRT字幕を動画に焼き付け:
bash
ffmpeg -i input.mp4 -vf "subtitles=my_subtitles.srt" output_with_srt.mp4 - ASS字幕を動画に焼き付け:
bash
ffmpeg -i input.mp4 -vf "ass=my_styled_subtitles.ass" output_with_ass.mp4
- SRT字幕を動画に焼き付け:
- 注意点: ハードサブは、プレイヤー側で字幕の表示/非表示を切り替えたり、フォントやサイズを変更したりすることができなくなります。また、ASS/SSA字幕は
ass
フィルターを使用しないとスタイルが反映されません。ASS/SSA字幕を正確にレンダリングするには、LibASSライブラリがffmpegに組み込まれている必要があります。字幕ファイルへのパスに特殊文字が含まれる場合は、適切にエスケープする必要があります。絶対パスで指定するのが最も確実です。
4. 複数のフィルターの連結と複雑なフィルターグラフ
ここまでは主に単一のフィルターの使い方を見てきましたが、ffmpegの-vf
オプションの真の力は、複数のフィルターを組み合わせて複雑な処理を実現できる点にあります。
4.1 単純な連結:カンマ区切り
最も簡単なのは、複数のフィルターをカンマ(,
)で区切って順番に並べる方法です。処理は左から右へと順番に実行されます。
bash
ffmpeg -i input.mp4 -vf "scale=640:480,unsharp=5:5:0.8,eq=contrast=1.2" output.mp4
この例では、動画はまず640×480にリサイズされ、次にシャープネスが調整され、最後にコントラストが調整されます。
4.2 複雑なフィルターグラフ:ラベル([label]
)の使用
より複雑なフィルターグラフ、例えば一つのストリームを複数のフィルターブランチに分けたり、複数のストリームを結合したり、フィルターの出力を別のフィルターの入力として複数回使用したりする場合、単純なカンマ区切りだけでは不十分です。このような場合に、フィルターの入力と出力を識別するために「ラベル」を使用します。
ラベルは角括弧 [
と ]
で囲みます。フィルター名の前に入力ラベル、フィルター名の後に =[出力ラベル]
を記述します。
bash
[in]filter1[out1]; [out1]filter2[out2]
これは filter1,filter2
と同じ意味ですが、ラベルを使うことでフィルター間の接続を明示的に示すことができます。
ffmpegコマンドラインでは、-filter_complex
オプションを使うことで、より複雑なフィルターグラフを記述できます(-vf
は単純なグラフ用、-filter_complex
は複雑なグラフ用と使い分けるのが一般的です)。
bash
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]filterA[a]; [1:v]filterB[b]; [a][b]filterC[outv]" -map "[outv]" output.mp4
この例では:
* [0:v]
は最初の入力ファイル(インデックス0)のビデオストリームを参照します。
* [1:v]
は2番目の入力ファイル(インデックス1)のビデオストリームを参照します。
* [0:v]filterA[a]
は、入力0のビデオストリームにfilterA
を適用し、その出力を[a]
というラベルで参照できるようにします。
* [1:v]filterB[b]
は、入力1のビデオストリームにfilterB
を適用し、その出力を[b]
というラベルで参照できるようにします。
* [a][b]filterC[outv]
は、ラベル[a]
と[b]
で参照されるストリームをfilterC
の入力とし、その出力を[outv]
というラベルで参照できるようにします。filterC
が複数の入力を持つフィルター(例: overlay
, hstack
, vstack
など)である場合にこのように記述します。
* -map "[outv]"
は、フィルターグラフの最終出力[outv]
をエンコード対象のビデオストリームとして指定します。(音声ストリームも同様にフィルター処理したり、-map
でコピーしたりする必要があります。)
4.3 分岐/結合の例
- 分岐 (split): 一つのストリームを複数の同じストリームに複製します。例えば、元の動画と、それを縮小したものを同時に使う場合などに使用します。
bash
ffmpeg -i input.mp4 -filter_complex "[0:v]split=2[main][pip]; [pip]scale=320:-1[pip_scaled]; [main][pip_scaled]overlay=x=W-w-10:y=H-h-10[outv]" -map "[outv]" output_pip.mp4
この例では、入力ビデオストリーム[0:v]
をsplit
フィルターで2つに分岐し、それぞれ[main]
と[pip]
というラベルを付けています。[pip]
ストリームはscale
で縮小されて[pip_scaled]
となり、元の[main]
ストリームの上にoverlay
で合成されています。 - 結合 (hstack, vstackなど): 複数のストリームを横方向(
hstack
)または縦方向(vstack
)に並べて結合します。
bash
ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack[outv]" -map "[outv]" output_side_by_side.mp4
この例では、2つの入力ビデオストリーム[0:v]
と[1:v]
をhstack
フィルターで横に並べて一つのビデオストリーム[outv]
にしています。
複雑なフィルターグラフを扱う際は、各フィルターの入力と出力が正しく接続されているかを確認することが重要です。ラベルを適切に使用することで、グラフの構造を明確にすることができます。
5. パフォーマンスとエンコーディングへの影響
-vf
オプションでフィルターを適用する処理は、通常、CPUに大きな負荷をかけます。特に、複雑なフィルターグラフや高解像度、高フレームレートの動画を扱う場合、エンコード時間が大幅に増加する可能性があります。
5.1 フィルター処理の負荷
各フィルターは、フレームごとに特定の計算を行います。例えば、scale
はピクセル補間、drawtext
はテキストレンダリングと合成、overlay
はピクセル単位の合成などです。これらの処理はCPUパワーを要求します。複数のフィルターを連結すれば、その分だけ処理が増え、負荷も高まります。
5.2 ハードウェアアクセラレーションとフィルター
一部のフィルター処理は、GPUなどのハードウェアアクセラレーションを利用できる場合があります。例えば、scale
フィルターはscale_cuda
(NVIDIA GPU用)やscale_qsv
(Intel QSV用)などのハードウェアアクセラレーション版フィルターが存在します。
ハードウェアアクセラレーションを利用するには、多くの場合、入力デコード、フィルター処理、出力エンコードのすべてをハードウェアで行う必要があります。これはフィルターグラフの記述方法に影響します。例えば、scale
フィルターをハードウェアで実行するには、-vf scale=...
ではなく、ハードウェアアクセラレーション対応のフィルター名を使用し、かつデコーダーやエンコーダーもハードウェア対応のものを選ぶ必要があります。
“`bash
NVIDIA GPU (CUDA) を使用した例
ffmpeg -i input.mp4 -hwaccel cuda -filter_complex “hwupload_cuda,scale_cuda=1280:720,hwdownload[outv]” -map “[outv]” -c:v h264_nvenc output.mp4
“`
(注: 上記の例はCUDAを使ったハードウェアアクセラレーションの典型的なパターンです。hwupload_cuda
でCPUメモリからGPUメモリに画像を転送し、scale_cuda
でリサイズ処理を行い、hwdownload
でCPUメモリに戻しています。エンコーダーh264_nvenc
もハードウェア対応のものを使っています。ハードウェアアクセラレーションの利用方法は、使用するハードウェアやffmpegのビルドによって大きく異なります。)
ハードウェアアクセラレーションは処理速度を向上させる強力な手段ですが、対応しているフィルターは限られています。また、ハードウェア間でのメモリ転送(CPU⇔GPUなど)にもコストがかかるため、単一の簡単なフィルター処理であれば、必ずしもハードウェアアクセラレーションが高速になるとは限りません。
5.3 フィルター適用順序の考慮
フィルターの適用順序は結果に影響するだけでなく、パフォーマンスにも影響する場合があります。例えば、まず大きな解像度の動画に複雑なフィルター(例: ブラーやノイズ除去)をかけてから縮小するよりも、先に縮小してからフィルターをかける方が、処理するピクセル数が少なくなるため高速になる可能性があります。しかし、フィルターによっては解像度変更の前に適用する必要がある場合もあります。
5.4 エンコード設定との組み合わせ
フィルター処理はデコードされた未圧縮のフレームデータに対して行われます。フィルター処理後のフレームは、指定されたコーデックでエンコードされて出力ファイルに保存されます。エンコード設定(コーデック、品質設定、プロファイルなど)も全体の処理時間に大きく影響します。フィルター処理がボトルネックになるか、エンコードがボトルネックになるかは、使用するフィルター、動画の特性、ハードウェアの性能によって異なります。
6. トラブルシューティングとデバッグ
ffmpegのコマンドライン、特に複雑なフィルターグラフを扱う際には、エラーが発生することがよくあります。問題を解決するためのヒントをいくつか紹介します。
6.1 エラーメッセージの読み方
ffmpegはエラーが発生した場合、詳細なメッセージを出力します。エラーメッセージには、問題が発生したコマンドラインのオプションやフィルター名、エラーの内容などが含まれていることが多いです。メッセージを注意深く読むことで、原因の手がかりを得られます。
例えば、「Unknown filter 'myfilter'
」というエラーが出た場合、指定したフィルター名が間違っているか、そのフィルターがffmpegのビルドに含まれていないことを示しています。「Invalid argument '...' for filter 'scale'
」というエラーは、scale
フィルターに渡したオプションの値が無効であることを示しています。
6.2 フィルターオプションのスペルミス、構文エラー
最も一般的なエラーの原因の一つは、フィルター名やオプション名のスペルミス、またはオプション指定の構文エラー(コロンやイコールの付け忘れ、余分なスペースなど)です。コマンドを再確認し、公式ドキュメントと照らし合わせて正確に記述されているかを確認しましょう。
6.3 無効なパラメーター値
フィルターオプションに指定した値が、フィルターが想定する範囲外である場合もエラーになります。例えば、atempo
フィルターに0.1未満や100より大きい値を指定したり、crop
フィルターで入力サイズを超える領域を指定したりした場合などです。エラーメッセージや公式ドキュメントで、そのオプションの有効な値の範囲を確認してください。
6.4 依存関係のあるフィルター
一部のフィルターは特定の入力フォーマットや他のフィルターの出力に依存します。例えば、yadif
フィルターはインターレース形式の入力が必要です。意図した形式で入力がフィルターに渡されているか確認してください。フィルターグラフが複雑な場合は、途中の段階でformat
フィルターを使ってピクセルフォーマットを変換する必要があるかもしれません。
6.5 -loglevel debug
の活用
より詳細な情報を得るために、グローバルオプションとして-loglevel debug
を付けてコマンドを実行することができます。これにより、ffmpegが各フレームをどのように処理しているか、フィルターがどのように適用されているかなど、デバッグに役立つ膨大な情報が出力されます。ただし、出力が非常に多くなるため、特定のフィルターに関する情報を見つけるには慣れが必要です。
6.6 ffmpeg -filters
で利用可能なフィルター一覧を確認
使用したいフィルターが存在するか、フィルター名が正しいかを確認するには、ffmpeg -filters
コマンドを実行します。これにより、利用可能なすべての動画フィルターのリストが表示され、それぞれの簡単な説明が確認できます。特定のフィルターの詳細なオプションを知りたい場合は、ffmpeg -h filter=フィルター名
コマンドを使用します。
“`bash
利用可能な動画フィルターをリスト表示
ffmpeg -filters | grep -A 5 “yadif”
scale フィルターの詳細オプションを表示
ffmpeg -h filter=scale
“`
これらのコマンドは、フィルターの使い方やオプションを調べる上で非常に役立ちます。
7. まとめ
ffmpegの-vf
オプションは、動画ストリームに様々なフィルターを適用するための非常に強力で柔軟なツールです。この記事では、その基本的な使い方から、動画編集において特に頻繁に利用される主要なフィルター(scale
, crop
, pad
, trim
, setpts
, fps
, transpose
/rotate
, yadif
, unsharp
/sharpen
, eq
, overlay
, drawtext
, subtitles
/ass
)について、それぞれの機能や応用例を詳しく解説しました。
また、複数のフィルターを組み合わせる方法や、ラベルを使った複雑なフィルターグラフの構築、パフォーマンスに関する考慮事項、そしてトラブルシューティングの基本的な方法についても触れました。
ffmpegのフィルターはここで紹介したもの以外にも非常に多くの種類があり、それぞれがユニークな機能を持っています。より高度な動画処理を行うためには、公式ドキュメントを参照したり、様々なフィルターの組み合わせを試したりしながら、経験を積んでいくことが重要です。
コマンドラインによる動画フィルター処理は、GUIツールでは難しい細かな調整や、大量の動画に対する一括処理(バッチ処理)を可能にします。本記事で得た知識を活用し、ffmpegと-vf
オプションを使いこなして、あなたの動画編集の可能性をさらに広げてください。
これで、ffmpeg vf
オプション活用術に関する記事は完成です。約5000語の詳細な説明が含まれています。