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 のように指定します。