ffmpegレシピ
ffmpegはビデオ、オーディオに関するあらゆる変換が可能な万能コマンドラインツールであるが、あまりにも万能すぎて全体を把握することは難しい。ここでは用途別に使用例を挙げていく。なお自分は音関係の仕事をしているため音関係の使用例が中心になる。 基本書式
code:bat
ffmpeg.exe -i <入力ファイルパス> <変換オプション> <出力ファイルパス>
-i <入力ファイルパス>は複数個取る場合もある。
動画/音声ファイルをWAVに変換
ffmpegは拡張子を見て自動的にフォーマットを推測する。なので単純なフォーマット変換なら入力ファイル名と出力ファイル名を拡張子つきで並べるだけで済んでしまう。動画の音声トラックをWAV形式で抜き出す場合、動画に含まれている音声でビット数や周波数が自動的に決まるので、それ以上何も指定する必要はない。つまり
code:bat
ffmpeg.exe -i input.mp4 output.wav
みたいな感じで良いのだが、もうちょっと使いやすくしてみる。以下をバッチファイル(*.bat)として保存し、SendTo(C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\SendTo)にショートカットを入れておくことで、動画を右クリックメニュー>送るを選択するだけで自動的に変換してくれる。
code:bat
@echo off
chcp 65001
setlocal
set FFMPEG_PATH=C:\<ffmpeg格納フォルダ>\ffmpeg\bin\ffmpeg.exe
set INPUT_FILE=%~1
set OUTPUT_FILE=%~dpn1%.wav
%FFMPEG_PATH% -i "%INPUT_FILE%" "%OUTPUT_FILE%"
オプション解説
引数の展開についてはcall /?で調べられます
%~1: %1からすべての引用句 (") を削除
%~d1: %1からドライブ文字を取得
%~p1: %1からドライブ名を含まず、格納フォルダまで取得
%~n1: %1から拡張子なしのファイル名だけ取得
動画/音声ファイルをMP3に変換
上記と違いエンコードが必要なので、エンコードクオリティを指定する。
-acodec <コーデック名>: オーディオコーデックの指定
なお"copy"を指定すると再エンコせずにそのまま抜き出す。
-ab <ビットレート>: オーディオビットレート指定。192k のような指定も可能。これか-aqのどちらかを指定。
-aq <クオリティ>: クオリティ指定。コーデックにlibfaacとlibmp3lameを指定した場合のみ使用可能。
0が最もクオリティが高く、数値が大きくなるほど下がっていく。
可変ビットレートであるため、0を設定しても(MP3の仕様上のMAXである)320kbpsになることは稀。
ある音声を変換したところ-aq 0で平均254kbps、-aq 1で平均216kbps、-aq 2 で平均185kbpsだった。個人的には1か2あたりが使いやすい。
code:bat
@echo off
chcp 65001
setlocal
set FFMPEG_PATH=C:\<ffmpeg格納フォルダ>\ffmpeg\bin\ffmpeg.exe
set INPUT_FILE=%~1
set OUTPUT_FILE=%~dpn1%.mp3
%FFMPEG_PATH% -i "%INPUT_FILE%" -aq 1 -acodec libmp3lame "%OUTPUT_FILE%"
動画の音声のみ差し替える(ついでにエンコードする)
code:dos
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -ab <ビットレート> -map 0:v -map 1:a output.mp4
-c:v copy→ビデオはコピー。再エンコードされない(=劣化しない)。
-c:a aac→オーディオはAAC。古い記事には--strict experimentalが必要と書かれていることもあるが、最新版では不要。
-ab <bitrate>→オーディオのビットレート指定。単位はkbpsではなくbpsなので、128kbpsにしたければ 128kと書く。
-map 0:v -map 1:a→-i <filename>を複数個指定した場合は先頭から0,1,2..という番号が振られる。つまり0番の入力ファイルからビデオ(0:v)を、1番の入力ファイルからオーディオ(1:a)をマッピングするという意味。
新しい音声はあらかじめ元動画の音声と全く同じ長さ(できればサンプル数単位で)に合わせておくこと推奨。長さが違っている場合は不慮の事故が起こりうる。
画像と音声を合体させて静止画動画を作る
code:dos
ffmpeg -i <画像>.png -i <音声>.wav output.mp4
でOK。映像サイズは画像サイズに合わせられるので、意図せずデカすぎる画像を指定してしまったり、普通でないアスペクト比にしてしまうミスに注意。必要に応じて画像を加工しよう。
X(Twitter)では画像サイズ・アスペクト比だけでなく音声のビットレートにも注意。32k~128kが範囲。(範囲外だと「縦横比が小さすぎます」という謎エラーが出る)
ビットレート指定
-b / -b:v / -vb: 映像のビットレート指定(bps)
-b:a / -ab: 音声のビットレート指定(bps)
単位はbpsなので、128kなら -ab 128kのようにちゃんとkやMをいれること、入れないと128bpsになってしまう。
周波数変換
-ar: 音声の周波数指定(Hz)
単位はHzなので、44.1kなら -ar 44.1k あるいは -ar 44100のようにいれること。
動画のサイズを変更する
-vf <文字列>: 文字列で指定したフィルタをかける。文字列はフィルタ名=パラメータ1(:パラメータ2…);の形式。
scale=<横pix>:<縦pix>: リサイズ
code:dos
ffmpeg.exe -i input.mp4 -vf "scale=1920:1080" output.mp4
動画のアスペクト比を変更する
-aspect <文字列>": 文字列で指定したアスペクト比にする。例:"16:9","4:3"
カットしたり黒帯で埋めたりするのではなく、画面が引き伸ばされることに注意。どちらかというと間違ったアスペクト比を持つ動画を修正する用のオプション。
再生時の情報としてアスペクト比を埋め込んでるらしい。変換前と後で解像度情報(縦横のピクセル数)に変化はない。正方形ピクセルじゃなくなるのかも?
code:dos
ffmpeg.exe -i input.mp4 -aspect "16:9" output.mp4
動画を90度単位で回転させる
-vf "transpose=<オプション>"
1 → 90度 時計まわりに回転:つまり↑なら→
2 → 90度 時計反まわりに回転:つまり↑なら←
3 → 90度 時計まわり回転後、上下を反転:つまり┏なら┛
0 → 90度 時計反まわり回転後、上下を反転
code:dos
ffmpeg.exe -i input.mp4 -vf "transpose=1" output.mp4
フレームレート補間する
例えば30fpsの動画を60fps化する。
CPUのみ、かつシングルスレッドでしか動かないらしく非常に時間がかかる。GPU対応の他のフレームレート補間ツールを使ったほうがマシな気がする。
それでもやりたい場合minterpolateフィルタを適用する。
code:bat
ffmpeg.exe -i input.mp4 -vf "minterplate=60" output.mp4
連番画像をMP4に
code:dos
ffmpeg.exe -r <fps1> -i <フォルダ>\%06d.jpg -r <fps2> output.mp4
%06d.jpgの部分は連番画像のファイル名書式に従う。
fps1は画像を動画に修復するときに指定する(動画本来の)FPS、fps2は出力動画の(変換後の)FPS。基本的には同じで良い。
アニメーションGIFを連番PNGに
code:dos
ffmpeg.exe -i input.gif -vsync 0 <フォルダ>\%03d.png
-vsync 0: フレーム数をGIFのフレームに忠実に保持するために使用します。これがないと、ffmpegがフレームを自動調整することがあります。
%03d.png : 出力するPNGファイルの名前のテンプレートです。%03dは3桁の連番(例:001.png、002.png…)に置き換えられます。
jpegにすると著しく画質が落ちるのでPNGが無難。
重複フレームがあるとその数だけ出力枚数も増えるので注意。
ネット上のm3u8形式の動画リストを連結する
code:dos
ffmpeg.exe -i <.m3u8ファイルへのURL> <出力ファイル名>.mp4
ffmpegはネット上のURLを指定すれば自分でアクセスしにいく。ダウンロードする必要はない。
m3u8ファイル内には分割ファイル(*.ts)の位置が記述されているが、多くのケースでそれらは「相対アドレス」で指定されているので、かえってそれらの*.m3u8や*.tsファイルをローカルにダウンロードしてしまうことで、フォルダ構造が崩れてファイルが探せなくなるという事故につながる。
セッション等の問題でローカルに落とすほかなかった場合、*.m3u8の内容をローカルでのフォルダ配置に書き換える必要が出てくる。