ffmpegレシピ
ffmpegはビデオ、オーディオに関するあらゆる変換が可能な万能コマンドラインツールであるが、あまりにも万能すぎて全体を把握することは難しい。ここでは用途別に使用例を挙げていく。なお自分は音関係の仕事をしているため音関係の使用例が中心になる。 基本書式
code:bat
ffmpeg.exe -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%"
動画のサイズを変更する
-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が無難。
重複フレームがあるとその数だけ出力枚数も増えるので注意。