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

2019年10月29日に平均値が追加された
ffmpeg.git/commitdiff : avfilter/vf_vfrdet: also report average delta

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

基本コマンド

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

表示ログの例。固定フレームなら右に総フレーム数、左に可変フレーム数。0開始のフレーム数なので実際のフレーム数は1を足す。
[Parsed_vfrdet_0 @ 000000000295fe80] VFR:0.000000 (0/34046)

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

VFR:0.800185 (60562/15123) min: -166 max: 133 avg: 33

5分の1フレーム間引いた可変フレームレートの動画サンプルを作る。
ffmpeg -f lavfi -i testsrc2=d=10 -vf select='mod(n,5)' -c:v ffv1 output.mkv

ffmpeg でのフレームレート設定の違い
特定の映像フレームや音声サンプルを出力する select, aselect

timebaseを調べる方法。
ffprobe -v error -i input -select_streams v:0 -show_entries stream=time_base -of csv=print_section=0

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 の使い方

フレーム当たりのタイムスタンプミリ秒。
ffmpeg -i input -an -f mkvtimestamp_v2 mkvtimestamp_v2.txt

タイムスタンプファイルを元にPTSを修正するにはmp4fpsmodを使う。ただしバイナリは配布されていない。
mp4fpsmod -t mkvtimestamp_v2.txt input.mp4 -o output.mp4

nu774/mp4fpsmod: mp4 time code editor

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

  • 山田

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

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

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

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

    • admin

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

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

      • 山田

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

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

山田 へ返信する コメントをキャンセル

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

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