ffmpeg FPS 信息与视频不匹配
ffmpeg FPS information mismatch with the video
我有一堆视频,其中包含一些关于视频中发生的事情的统计信息。一条这样的信息是根据视频的时间给出的,以秒为单位,最多保留一位小数。
为了获取视频的 FPS,我使用 ffmpeg -i
但是当我使用给定的 FPS 手动计算一个特定帧的时间时,它不匹配。
例如,ffmpeg 输出 FPS = 30。
我看视频统计,156.8 = 2.368 的帧必须是
4704'th
帧。我使用 'skvideo' 打开视频,读取所有帧,然后查看 4704'th
帧。这是时间 2.12 左右的某个框架?我在多个视频中检查了多个此类实例,这是一种常见行为。
我不明白为什么会这样,我该如何解决这个问题?
因此我不受 ffmpeg 的限制。 Skvideo 被用来阅读视频。我尝试了 opencv
,截至目前它不适用于 VideoCapture
,并且重新安装它对我来说很浪费时间。不过我觉得'opencv/skvideo'应该没关系,手动算帧数也是可以的。
所以,在解决方案中,我正在寻找 -
给定视频内部的时间戳,如何找到特定时间位置的帧?
万一有人可能已经处理过这个,这与 THUMOS
数据集有关。我在 Ubuntu 16.04
EDIT_1
其实我可以说得更具体一些,因为这是公开的数据。时间界限很重要activity。例如,在一段视频中,篮球扣篮发生在什么时候?它成对给出 - [开始结束]。有些视频有多个活动,有些只有一个。
Here为示例视频,以下为activity次。
[[ 16.5, 20.8],
[ 26.6, 32.2],
[ 34.8, 42.1],
[ 47.8, 50.0],
[ 58.1, 62.9],
[ 65.6, 67.2],
[ 68.5, 74.0],
[ 76.4, 78.3],
[ 78.7, 79.8],
[ 80.8, 82.1],
[ 85.0, 87.3],
[ 90.1, 91.4],
[ 98.5, 100.3]]
我也试过手动检查,32.87 FPS "almost" 适用于少数视频,但不适用于所有视频。几乎意味着它关闭了 ~ 10 帧。这对我的任务来说是一个巨大的差异,我需要精确的框架。
此外,必须有一些方法,因为可以通过多个视频播放器直观地观察到数据集中的时间是正确的。
如果您的目标是提取与时间戳对应的帧,请使用
ffmpeg -i in.mp4 -vf select='lt(t,TS)*lt(TS-t,1/FPS)' -vsync 0 frame.png
TS 应替换为您的时间戳,FPS 应替换为帧率,例如'lt(t,78.7)*lt(78.7-t,1/30)'
如果视频像您显示的那样可变帧率,则帧索引不可靠。
使用 ffmpeg 在给定时间戳获取帧的一种简单的帧精确方法是使用 ffmpeg seek -ss
选项。
如果这就是您要查找的内容,您可以在此处找到说明 - https://trac.ffmpeg.org/wiki/Seeking
我有一堆视频,其中包含一些关于视频中发生的事情的统计信息。一条这样的信息是根据视频的时间给出的,以秒为单位,最多保留一位小数。
为了获取视频的 FPS,我使用 ffmpeg -i
但是当我使用给定的 FPS 手动计算一个特定帧的时间时,它不匹配。
例如,ffmpeg 输出 FPS = 30。
我看视频统计,156.8 = 2.368 的帧必须是
4704'th
帧。我使用 'skvideo' 打开视频,读取所有帧,然后查看 4704'th
帧。这是时间 2.12 左右的某个框架?我在多个视频中检查了多个此类实例,这是一种常见行为。
我不明白为什么会这样,我该如何解决这个问题?
因此我不受 ffmpeg 的限制。 Skvideo 被用来阅读视频。我尝试了 opencv
,截至目前它不适用于 VideoCapture
,并且重新安装它对我来说很浪费时间。不过我觉得'opencv/skvideo'应该没关系,手动算帧数也是可以的。
所以,在解决方案中,我正在寻找 -
给定视频内部的时间戳,如何找到特定时间位置的帧?
万一有人可能已经处理过这个,这与
THUMOS
数据集有关。我在 Ubuntu 16.04
EDIT_1
其实我可以说得更具体一些,因为这是公开的数据。时间界限很重要activity。例如,在一段视频中,篮球扣篮发生在什么时候?它成对给出 - [开始结束]。有些视频有多个活动,有些只有一个。
Here为示例视频,以下为activity次。
[[ 16.5, 20.8],
[ 26.6, 32.2],
[ 34.8, 42.1],
[ 47.8, 50.0],
[ 58.1, 62.9],
[ 65.6, 67.2],
[ 68.5, 74.0],
[ 76.4, 78.3],
[ 78.7, 79.8],
[ 80.8, 82.1],
[ 85.0, 87.3],
[ 90.1, 91.4],
[ 98.5, 100.3]]
我也试过手动检查,32.87 FPS "almost" 适用于少数视频,但不适用于所有视频。几乎意味着它关闭了 ~ 10 帧。这对我的任务来说是一个巨大的差异,我需要精确的框架。
此外,必须有一些方法,因为可以通过多个视频播放器直观地观察到数据集中的时间是正确的。
如果您的目标是提取与时间戳对应的帧,请使用
ffmpeg -i in.mp4 -vf select='lt(t,TS)*lt(TS-t,1/FPS)' -vsync 0 frame.png
TS 应替换为您的时间戳,FPS 应替换为帧率,例如'lt(t,78.7)*lt(78.7-t,1/30)'
如果视频像您显示的那样可变帧率,则帧索引不可靠。
使用 ffmpeg 在给定时间戳获取帧的一种简单的帧精确方法是使用 ffmpeg seek -ss
选项。
如果这就是您要查找的内容,您可以在此处找到说明 - https://trac.ffmpeg.org/wiki/Seeking