ffmpegの引数の順番
例示用コマンド
動画ファイルと音声ファイルからそれぞれ一部の映像と音声を取り出して合成かつリサイズする例
code:sh
ffmpeg -ss 3:00 -to 4:30 -i movie.mov -ss 1:00 -to 2:30 -i audio.wav -c:v libx264 -preset veryfast -crf 22 -vf "scale=-1:360" -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
順番
-ss 3:00 -to 4:30 は -i movie.mov に対する入力 (デコード) オプション
-i の手前が入力オプション
movie.mov から、3:00~4:30の範囲を取り出している
-ss 1:00 -to 2:30 は -i audio.wav に対する入力 (デコード) オプション
ここも -i の手前なので入力オプション
-i movie.mov の後なので、ここで映像に関する出力 (エンコード) オプションも指定できそうだと思っていたが違った
audio.wav から、1:00~2:30の範囲を取り出している
c:v libx264 -preset veryfast -crf 22 -vf "scale=-1:360" -c:a aac -map 0:v:0 -map 1:a:0 は output.mp4 に対する出力 (エンコード) オプション
出力映像コーデック、プリセット、画質、音声コーデック、出力への入力のマッピングを指定している
この例ではしていないが、出力を複数指定することも可能っぽい
入力・出力のどの位置になんのオプションを置くかによる挙動の違い
入力・出力のどっちに置いても似た挙動をするもの、別物の (または別物に近い) 挙動をするもの、片方でしか使えないものがある
-ss (開始時間指定)
入力オプションで指定すると、-i で指定したファイルを指定した時間分スキップして読み込み始める
出力オプションのみで指定すると、-i で指定したファイルを最初から読み込んだうえで、指定した時間以降のデータを出力に利用する
入力・出力オプション両方で指定すると、入力側の -ss の分ジャンプしてから、さらに出力側の -ss の分ジャンプすることになる
ほとんどの場合、入力側でのみ指定すると一番速くエンコできる
出力側の -ss 指定だと、スキップした分も出力されないだけでエンコード処理はされてしまうっぽい
ごく一部の場合において、入力オプションの -ss のみ指定すると出力にズレなどの問題が起こることがある
その場合、入力側の -ss を10秒ほど減らして、代わりに出力側で -ss 10 するなどをする
エンコなし (-c:v copy)でカットする場合とか? (未確認)
-t (長さ指定), -to (終了時間指定)
出力オプションで指定してても、出力し終わったら -i で指定したファイルの読み込みを勝手に終えてくれるので、そんなに変わらない
-ss を入力側で、 -to を出力側で指定する場合は開始時間の基準が違うのに注意
-c:v, -c:a (コーデック指定)
入力オプションにあるとデコーダーの指定になる
デコーダーは ffmpeg -decoders で探す
出力オプションにあるとエンコーダーの指定になる
エンコーダーは ffmpeg -encoders で探す
libx264 はエンコーダーのリストにしかないので、-iの手前で指定したらエラーになる
-preset, -crf
libx264の挙動を弄るオプションなので、-c:v libx264 と同様出力側にないとエラーになる
-map (出力への各入力のマッピング), -vf (映像フィルタ)
出力オプションでしか指定できない