可変フレームか固定フレームかを調べることが出来る vfrdet(Variable frame rate detect)フィルタ。コンソールには可変フレーム数と固定フレーム数、 PTS間隔の最小値と最大値が表示される。

公式ドキュメント:FFmpeg Filters Documentation : vfrdet

基本コマンド

ffmpeg -i input -an -vf vfrdet -f null -

表示ログの例

固定フレームなら右に総フレーム数、左に可変フレーム数。0開始のフレーム数なので実際のフレーム数は1を足す。

[Parsed_vfrdet_0 @ 000000000295fe80] VFR:0.000000 (0/34046)

可変フレームなら右が固定フレーム数、左が可変フレーム数。min, max はPTS間隔の最小値最大値。max: 35 は前後のPTS間隔の最大値が 35*timebase の意味になる。可変フレーム数はおそらくPTS間隔がその動画の一般的な間隔とは違う前後フレームを可変フレーム数として計算している。

[Parsed_vfrdet_0 @ 00000000004e7f80] VFR:0.641629 (89787/50149) min: 0 max: 35)

timebaseを調べる方法。
ffprobe -v error -i input -show_entries stream=time_base

PTS間隔を調べるには ffprobe で調べる方法と、mkvtimestamp_v2 で調べる方法があるが、2つの方法が一致するとも限らない。

ffprobe
ffprobe -v error -i input -select_streams v:0 -show_entries packet=pts_time -of default=noprint_wrappers=1:nokey=1 > pts_time.txt

ffprobe の使い方

mkvtimestamp_v2
ffmpeg -i input -an -f mkvtimestamp_v2 mkvtimestamp_v2.txt

3 thoughts on “可変フレームを検出する vfrdet

  • 山田

    ffmpegもしくはffprobeを使用して、「MediaInfo.exe」が表示するような「フレームレート、最大、最小」を求めようと悩んでいます。

    「最小」が求められないのですが、「vfrdet」で取得できる「pts 間隔の最大値最小値」を使用すれば可能なのでしょうか?
    (pts_timeをすべて取得して、差分を出せば求められますが、動画が数時間になると、求めるのに数十秒待たされます)

    pts_timeで求められる数値は1以下なので「pts 間隔」がこんなに大きくなることを理解できておりません。

    初心者で理解不足のせいだと思いますが、お手数おかけいたしますがご教示いただけないでしょうか?

    • admin

      調べ直して記事を書き直したので参考にしてください。
      間隔にtimebaseを掛け合わせるとフレーム間隔の秒時間になります。

      minから1秒間のフレーム数の最小値がおそらくフレームレートの最小値になると思います。

      • 山田

        ご回答ありがとうございます!

        試したところ、ご指摘の通りの値となりました。
        参考になる情報をいつもありがとうございます!

コメントを残す

メールアドレスが公開されることはありません。

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