ffmpeg FPS信息与视频

时间:2017-12-04 01:39:26

标签: opencv video ffmpeg video-processing frame-rate

我有一堆视频,其中包含视频中发生的一些统计信息。一个这样的信息是根据视频的时间以秒为单位给出的。

要获取视频的FPS,我使用的是ffmpeg -i

但是当我使用给定的FPS手动计算一个特定帧的时间时,它不匹配。

例如,ffmpeg输出FPS = 30。

我看一下视频统计,156.8 = 2.368的帧必须是 4704'th框架。我使用'skvideo'打开视频,读取所有帧,然后查看4704'th帧。这是2.12左右的时间框架。我在多个视频中检查了多个这样的实例,这是一种常见的行为。

我不明白为什么会这样,我怎么能解决这个问题呢?

因此我不受ffmpeg的束缚。 Skvideo正被用来阅读视频。我尝试了opencv,截至目前它并不适用于VideoCapture,重新安装它对我来说时间成本很高。但我猜'opencv / skvideo'无关紧要,人们也可以手动计算帧数。

所以,在解决方案中,我正在寻找 -

  1. 考虑到视频内部的时间戳,如何找到该特定时间段的帧?

  2. 如果某人可能已就此工作过,这与THUMOS数据集有关。我在Ubuntu 16.04

  3. EDIT_1

    实际上我可以更具体,因为它是公开的数据。时间限制是一项重要的活动。例如,在视频中,篮球扣篮何时发生?它成对出现 - [开始结束]。有些视频有多个活动,有些只有一个。

    Here是一个示例视频,以下是活动时间。

    [[  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“几乎”适用于少数视频,但并非适用于所有视频。并且差不多意味着大约10帧。这对我的任务来说是一个巨大的差异,我需要精确的框架。

    此外,还有一些方法,因为可以通过多个视频播放器直观地观察到数据集中的时间是正确的。

2 个答案:

答案 0 :(得分:1)

如果您的目标是提取与时间戳对应的框架,请使用

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)'

如果视频是可变帧率,那么帧索引是不可靠的,就像你的那样。

答案 1 :(得分:0)

使用ffmpeg在给定时间戳获取帧的简单帧精确方法是使用ffmpeg seek -ss选项。 如果您正在寻找,请在此处找到说明 - https://trac.ffmpeg.org/wiki/Seeking