ffmpeg 中显示的 FPS 与总数不匹配 frames/duration
FPS shown in ffmpeg does not match with total frames/duration
FPS 定义为每秒的帧数。但是当我尝试使用总帧数/持续时间计算 FPS 时,我得到的数字与 ffmpeg 中显示的 FPS 略有不同:
对于这个视频http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4
使用 ffmpeg,我们可以获得它的 FPS、持续时间和总帧数:
ffprobe -select_streams v -show_streams ForBiggerFun.mp4 | grep nb_frames
nb_frames=1440
ffmpeg -i ForBiggerFun.mp4
23.98 帧/秒
时长:00:01:00.07
如果我们使用 nb_frames 计算每帧的持续时间,我们得到
fps = nb_frames/Duration = 1440/60.07 = 23.972032628599965,不同于23.98
哪个值更靠谱?差异是否意味着帧的持续时间可能与其他帧不同(帧分布不均匀)?
请注意,时长和 fps 都四舍五入到小数点后两位。
为了获得更精确的读数,运行
ffprobe -v 0 -select_streams v -show_entries stream=duration_ts,time_base,nb_frames ForBiggerFun.mp4
这将产生
[STREAM]
time_base=1/48000
duration_ts=2881920
nb_frames=1440
[/STREAM]
您的精确帧率为 nb_frames / (duration_ts / time_base)
= 1440 / (2881920 / 48000)
= 23.9840
。但是请注意,所有流的持续时间都不相同。事实上,音频流长了 30 毫秒,播放器将延长视频的持续时间以匹配它,因此从算术上讲,有效帧率略小。
FPS 定义为每秒的帧数。但是当我尝试使用总帧数/持续时间计算 FPS 时,我得到的数字与 ffmpeg 中显示的 FPS 略有不同:
对于这个视频http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4 使用 ffmpeg,我们可以获得它的 FPS、持续时间和总帧数:
ffprobe -select_streams v -show_streams ForBiggerFun.mp4 | grep nb_frames
nb_frames=1440
ffmpeg -i ForBiggerFun.mp4
23.98 帧/秒 时长:00:01:00.07
如果我们使用 nb_frames 计算每帧的持续时间,我们得到 fps = nb_frames/Duration = 1440/60.07 = 23.972032628599965,不同于23.98
哪个值更靠谱?差异是否意味着帧的持续时间可能与其他帧不同(帧分布不均匀)?
请注意,时长和 fps 都四舍五入到小数点后两位。
为了获得更精确的读数,运行
ffprobe -v 0 -select_streams v -show_entries stream=duration_ts,time_base,nb_frames ForBiggerFun.mp4
这将产生
[STREAM]
time_base=1/48000
duration_ts=2881920
nb_frames=1440
[/STREAM]
您的精确帧率为 nb_frames / (duration_ts / time_base)
= 1440 / (2881920 / 48000)
= 23.9840
。但是请注意,所有流的持续时间都不相同。事实上,音频流长了 30 毫秒,播放器将延长视频的持续时间以匹配它,因此从算术上讲,有效帧率略小。