任意のフレームレートに変換するfpsフィルタの使い方。整数ではない小数点以下のタイムスタンプ処理の丸め方も指定できる。

ffmpeg でのフレームレート設定の違い

基本コマンド

フレームレートを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

【ffmpeg】動画から特定フレームを画像で出力する方法

入力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

ffmpeg で使える評価式

  • 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

ffmpeg でのフレームレート設定の違い

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)