任意のフレームレートに変換するfps
フィルタの使い方。整数ではない小数点以下のタイムスタンプ処理の丸め方も指定できる。
基本コマンド
フレームレートをntscの30000/1001に変換する。
ffmpeg -i input -vf fps=30000/1001 output
ffplay -i input -vf fps=30000/1001
1秒毎に連番画像のjpgで出力する。
ffmpeg -i input -vf fps=1 img-%03d.jpg
入力fpsがfilmだったらntsc_filmに、異なったら入力fpsのままで出力する。
ffmpeg -i input -vf fps="if(eq(source_fps\,film)\,ntsc_film\,source_fps)" output
40fps以上は半分に、未満は入力fpsのままで出力する。
ffmpeg -i input -vf "fps=if(gte(source_fps\,40)\,source_fps/2\,source_fps)" output
公式ドキュメント:FFmpeg Filters Documentation : fps
オプション
詳しい挙動をうまく説明できないので以下も参照。
Jim DeLaHunt, world-ready » FFmpeg’s fps filter, documented
- fps[string]
フレームレートの指定。整数、小数、分数、略語の指定ができる。評価式が使える - source_fps:元映像と同じ
- ntsc:30000/1001
- pal:25.0:既定値
- film:24.0
- ntsc_film:24000/1001
- start_time[double]
開始時間のタイムスタンプ推定。正の値を指定するとその時間まで開始フレームをコピーするが-vsyncの設定で変わる
既定値:DBL_MAX
範囲:-DBL_MAXからDBL_MAX - round[int]
整数ではない小数点以下のタイムスタンプ処理の丸め方 - 0, zero:0に向かう
- 1, inf:0から離れる
- 2, down:負の無限に向かう
- 3, up:正の無限に向かう
- 5, near:整数に近い方に向かう。既定値
- eof_action[int]
最終フレームの処理方法 - 0, round:丸める
- 1, pass:そのまま
挙動を調べる
10fps、10秒の動画を作る。
ffmpeg -f lavfi -i testsrc2=r=10:d=10 -f lavfi -i sine=440:0:44100:10 tmp.mp4
5秒まで最初のフレームをコピーして5秒から通常になる。音声は何も処理をしていない。
ffmpeg -i tmp.mp4 -vf fps=start_time=5 5.mp4
最初の5秒のフレームコピーがなくなって5秒から10秒までの動画になる。ffmpeg 5.1では-vsyncが廃止予定に変わっているので代わりに-fps_modeを使う。
ffmpeg -i tmp.mp4 -vf fps=start_time=5 -vsync vfr 5.mp4
ffmpeg -i tmp.mp4 -vf fps=start_time=5 -fps_mode vfr 5.mp4
roundの挙動を調べる。その結果0と2、1と3が同じ結果になる。
ffmpeg -i tmp.mp4 -vf fps=24:round=0 0.mp4 ffmpeg -i tmp.mp4 -vf fps=24:round=1 1.mp4 ffmpeg -i tmp.mp4 -vf fps=24:round=2 2.mp4 ffmpeg -i tmp.mp4 -vf fps=24:round=3 3.mp4 ffmpeg -i tmp.mp4 -vf fps=24:round=5 5.mp4
オリジナルのフレームレートの整数倍ではroundで挙動が変わらない。
ffmpeg -i tmp.mp4 -vf fps=20:round=0 0.mp4 ffmpeg -i tmp.mp4 -vf fps=20:round=1 1.mp4 ffmpeg -i tmp.mp4 -vf fps=20:round=2 2.mp4 ffmpeg -i tmp.mp4 -vf fps=20:round=3 3.mp4 ffmpeg -i tmp.mp4 -vf fps=20:round=5 5.mp4
0と2が0.9秒から、1と3が0秒から、5が0.4秒から1秒毎に画像出力する。
ffmpeg -i tmp.mp4 -vf fps=1:round=0 0-%03d.jpg ffmpeg -i tmp.mp4 -vf fps=1:round=1 1-%03d.jpg ffmpeg -i tmp.mp4 -vf fps=1:round=2 2-%03d.jpg ffmpeg -i tmp.mp4 -vf fps=1:round=3 3-%03d.jpg ffmpeg -i tmp.mp4 -vf fps=1:round=5 5-%03d.jpg