FFmpegのコマンドは「全体の設定 → 入力 → 出力」の順に書きます。オプションは、書く位置によってどのファイルに効くかが変わります。

基本構文の全体像

公式ドキュメント に載っている書式は次のとおりです。

ffmpeg [グローバルオプション] {[入力オプション] -i 入力URL} ... {[出力オプション] 出力URL} ...

実際のコマンドに当てはめると、次のようになります。

ffmpeg -y -i input.mp4 -c:v libx264 -c:a aac output.mkv
部分 説明
ffmpeg コマンド本体
-y グローバルオプション(出力ファイルを確認なしに上書き)
-i input.mp4 入力ファイル指定
-c:v libx264 出力オプション(映像コーデックを libx264 に指定)
-c:a aac 出力オプション(音声コーデックを AAC に指定)
output.mkv 出力ファイル(拡張子からコンテナが自動判定される)

グローバルオプション

グローバルオプションは、コマンド全体に効くオプションです。入力・出力の指定より前に書きます。

オプション 説明
-y 出力ファイルが存在する場合に確認なしで上書き
-n 出力ファイルが存在する場合は、上書きせずにすぐ終了
-loglevel quiet ログ出力を最小にする
-hide_banner バージョン等のバナーを非表示にする

入力の指定(-i)

入力ファイルは -i で指定します(公式)。

ffmpeg -i input.mp4 output.avi

複数の入力を指定する場合は -i を複数回使います。

ffmpeg -i input.mp4 -i audio.wav output.mkv

入力オプション(入力ファイルに効くオプション)は、必ずその -i の直前に書きます。-i より後に書くと、出力オプションとして扱われます。

出力の指定

出力ファイルはコマンドの最後に書きます(オプションとして解釈できない引数は、出力先として扱われます)。

ffmpeg -i input.mkv output.mp4

出力フォーマットの自動判定

出力ファイルの形式(コンテナ:映像や音声をまとめる入れ物)は、通常は拡張子から判定されます(公式ドキュメント)。

The format is normally auto detected for input files and guessed from the file extension for output files.

拡張子 自動選択されるコンテナ
.mp4 MP4(MPEG-4 Part 14)
.mkv Matroska
.avi AVI
.mov QuickTime
.webm WebM
.mp3 MP3
.wav WAV

拡張子で判定できないときは、-f で形式を指定します。

ffmpeg -i input.mp4 -f matroska output

オプションの順序規則(最重要)

順序について、公式ドキュメント には次のように書かれています。

As a general rule, options are applied to the next specified file. Therefore, order is important, and you can have the same option on the command line multiple times.

つまり、オプションは直後に続くファイルに適用されます。そのため、書く順番が大切です。

入力オプションと出力オプションの違い

たとえば -ss(開始位置の指定)は、-i の前に書くか後に書くかで意味が変わります。

# -ss を入力側に指定(高速。再エンコードするなら位置も正確で、-c copy のときだけキーフレーム単位になる)
ffmpeg -ss 10 -i input.mp4 output.mp4

# -ss を出力側に指定(出力の開始位置を指定。正確だが、開始位置まではデコードして捨てる)
ffmpeg -i input.mp4 -ss 10 output.mp4

入力と出力を混在させない

# 非推奨: 入力と出力が混在している
ffmpeg -i input.mp4 output1.mp4 -i input2.mp4

# 推奨: 先に全入力、後に全出力
ffmpeg -i input.mp4 -i input2.mp4 output.mp4

混在させてもエラーにはなりません。ただ、後ろに書いた input2.mp4 の映像や音声が output1.mp4 に使われることもあり、読み違えやすくなります。

コーデック指定(-c, -c:v, -c:a)

-c で、ストリーム(ファイル内の映像や音声のデータ)ごとにエンコーダー・デコーダーを指定します。

オプション 対象 例
-c:v 映像コーデック -c:v libx264, -c:v libvpx-vp9, -c:v copy
-c:a 音声コーデック -c:a aac, -c:a libmp3lame, -c:a copy
-c 全ストリーム -c copy

よく使うのが copy です。

ffmpeg -i input.mkv -c copy output.mp4

-c copy は、再エンコードせずにストリームをそのままコピーします。デコードもエンコードもしないので処理が速く、品質も落ちません(公式)。

ストリーム選択(-map)

何も指定しないと、FFmpegは次の基準でストリームを自動で選びます(公式)。

  • 映像: 最も高解像度のストリーム(1つのファイルの中では、既定(default)に設定された映像が優先されます)
  • 音声: 最もチャンネル数の多いストリーム。ただし、1つのファイルの中では、既定(default)に設定された音声が優先されます

自分で選ぶときは -map を使います。

# 1つ目の入力の映像ストリーム0番と音声ストリーム0番を出力
ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:0 output.mp4

よくある構文ミス

ミス 1: グローバルオプションを後ろに書く

グローバルオプションは、どこに書いてもコマンド全体に効くので、後ろに書いても動きます。ただ、公式ドキュメントは先頭に書くよう勧めています。

# 動くが非推奨: -y を後ろに書いてしまった
ffmpeg -i input.mp4 output.avi -y

# 推奨: グローバルオプションは先頭へ
ffmpeg -y -i input.mp4 output.avi

ミス 2: 出力オプションを入力の前に書く

NG(-c:v libx264 が入力オプションとして扱われ、エラーになる):

ffmpeg -c:v libx264 -i input.mp4 output.mp4

OK(コーデック指定は -i より後ろ):

ffmpeg -i input.mp4 -c:v libx264 output.mp4

ミス 3: 出力ファイルを指定し忘れる

NG(出力がないためエラー):

ffmpeg -i input.mp4 -c:v libx264

OK:

ffmpeg -i input.mp4 -c:v libx264 output.mp4

実践:構文確認コマンド

上から、AVIへの変換、H.264とAACでの変換(上書きあり)、再エンコードなしでのMKV化です。

ffmpeg -i input.mp4 output.avi
ffmpeg -y -i input.mp4 -c:v libx264 -c:a aac output.mkv
ffmpeg -i input.mp4 -c copy output.mkv

コーデックの詳細や具体的な変換レシピは「FFmpegで動画をMP4(H.264/AAC)に変換する」を参照してください。

よくある質問

なぜ -i を入力ファイルの前に書くの?

-i は「次に書くのは入力ファイル」という目印です。入力にはすべて -i を付けるので、入力が複数あっても出力と区別できます。

オプションの順番は決まっていますか?

基本は、グローバルオプション → 入力オプション → -i 入力 → 出力オプション → 出力ファイル の順です。入力オプションと出力オプションは、順番を変えると別の意味に解釈されることがあります。グローバルオプションだけは、どこに書いてもコマンド全体に効きます。

-c:v と -vcodec の違いは?

同じ働きをします。-vcodec は古い書き方で、互換性のために残っています。新しく書くなら -c:v を使ってください。

出力ファイルが先にあると上書きされる?

何も付けないと、上書きするか確認されます。-y なら確認なしで上書きし、-n なら同名のファイルがあると上書きせずに終了します。スクリプトでは -y を付けるのが定番です。

ストリームの番号はどう確認するの?

ffprobe input.mp4 か ffmpeg -i input.mp4 を実行すると、Stream #0:0、#0:1 のように番号が表示されます。この番号を -map 0:0 のように指定します。