【问题标题】:Is seeking to specific frames of an MJPEG video faster than doing the same for an h.264 file?寻找 MJPEG 视频的特定帧是否比寻找 h.264 文件更快?
【发布时间】:2017-07-08 23:18:22
【问题描述】:

我正在录制视频,需要快速随机地寻找视频中的特定帧。

我可以以 MJPEG 或 h.264 压缩标准录制视频。

我了解 MJPEG 会生成单独的 jpeg,并生成比 h.264 更大的文件大小,并且 h.264 可以跨多个视频帧进行压缩。

这种差异是否意味着我将获得更快的寻道时间? 使用 ffmpeg 或 gstreamer 寻找文件中的随机位置 以编程方式?

当从视频文件中仅读取 1 帧时,MJPEG 是否允许帧搜索操作以减少 IO 要求?

【问题讨论】:

  • 用 ffmpeg 很容易测试,对吧?但可能是的(比较默认值),尽管可能在某些内部模式下使用 h264。

标签: video ffmpeg gstreamer h.264 mjpeg


【解决方案1】:

实际上,FFmpeg 2.1+ 也可以非常快速地从 h.264 中提取帧。假设您按时间点指定所需的帧,则不需要“遍历所有视频数据包来计算它们”,如接受的答案中所述。我也不认为有办法请求第 N 帧(除了将 N 乘以固定帧速率以确定所需的时间点)。

这是一个示例,使用免费提供的动画短片的 h.264 版本,"Big Buck Bunny"

让我们要求一个确切的帧,正好是视频的 10 分钟:

$ ffmpeg -ss 00:10:00.000 -i /home/eric/Videos/bbb_sunflower_2160p_30fps_normal.mp4 -y -vframes 1 -s 3840x2160 /tmp/bbb-10:00.000.jpg

提取只用了大约 1.8 秒。

当心:如果你颠倒了-i 和 -ss 参数,你就是在“寻找输出”(而不是“寻找输入”)。在这种情况下“...the input will be decoded (and discarded) until it reaches the position given by -ss. This will be done very slowly, frame by frame.

例如:

$ ffmpeg -i /home/eric/Videos/bbb_sunflower_2160p_30fps_normal.mp4 -ss 00:10:00 -y -vframes 1 -s 3840x2160 /tmp/bbb-10:00.000.jpg

提取大约需要 12 分 45 秒(请注意,电影本身不到 11 分钟!)。所以在我的机器上,它的运行不是实时的。

更多关于使用 FFmpeg “寻找”的细节可以在这里找到:https://trac.ffmpeg.org/wiki/Seeking

【讨论】:

    【解决方案2】:

    选择 MJPEG。
    如果您正在寻找特定 (Nth) 帧,在 H.264 情况下,您必须找到最接近您寻找的帧的 I 帧,然后 解码此 I 帧和第 N 帧之间的所有帧,甚至进一步如果第 N 帧是 B 帧,则恢复完整的第 N 帧。这需要几毫秒,但对您来说可能很关键。
    MJPEG 将具有更大的文件大小但没有解码开销,因此除非您的磁盘非常非常非常慢,否则它是您的选择。
    在任何情况下,ffmpeg 都必须遍历所有视频数据包来计算它们,因此它是您的磁盘和处理器速度之间的权衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      相关资源
      最近更新 更多