【问题标题】:Why is random video seeks with OpenCV slow?为什么使用 OpenCV 进行随机视频搜索很慢?
【发布时间】:2018-07-27 14:30:19
【问题描述】:

使用 OpenCV 在视频文件中寻找随机点似乎比在 Windows Media Player 或 VLC 等媒体播放器中慢得多。我正在尝试使用VideoCapture 在以 H264(或 MPEG-4 AVC(part10))编码的视频文件上寻找不同的位置,寻找该位置所需的时间似乎与查询的帧数成正比。这是我正在尝试做的一个小代码示例:

import cv2

cap = cv2.VideoCapture('example_file')   

frame_positions = [200, 400, 8000, 200000]
for frame_position in frame_positions:
   cap.set(cv2.cv.CV_CAP_PROP_FRAMES, frame_position)
   img = cap.read()
   cv2.imshow('window', img)
   cv2.waitKey(0)

从上方显示图像的感知时间与帧数成正比。也就是说,第 200 帧和第 400 帧几乎没有任何延迟,8000 帧有些明显的滞后,但 200000 帧几乎需要半分钟。

为什么 OpenCV 不能像 Windows Media Player 那样“快速”搜索?会不会是 OpenCV 在搜索时没有正确使用 FFMPEG 编解码器?使用编解码器的一些替代配置从源构建 OpenCV 会有所帮助吗?如果是这样,谁能告诉我配置可能是什么?

我只在 Windows 7 和 10 PC 上测试过这个,OpenCV 二进制文件原样,系统路径中有相关的 FFMPEG DLL。

另一个观察结果:对于高于 2.4.9 的 OpenCV(二进制)版本(例如 2.4.11、3.3.0),第一次搜索有效,但后续搜索无效。也就是说,它可以从上面的例子中寻找帧 200,但不能寻找 400 和其余部分;视频只是跳回到第 0 帧。但由于它适用于 2.4.9,所以我现在很高兴。

【问题讨论】:

    标签: python opencv ffmpeg


    【解决方案1】:

    以下是一些相关的 github 问题:

    https://github.com/opencv/opencv/issues/4890

    https://github.com/opencv/opencv/issues/9053

    使用 ffmpeg 重新编码您的视频。它对我有用。

    【讨论】:

      【解决方案2】:

      GPU 加速对于搜索应该无关紧要,因为您不是在解码帧。此外,即使您正在解码帧,在 GPU 上执行此操作也会比在 CPU 上慢,因为您现在的 CPU 已将视频编解码器“焊接”到芯片中,这使得视频解码速度非常快,并且必须进行一些簿记才能将数据从主存储器铲入 GPU。

      听起来 OpenCV 实现了一种“安全”的搜索方式:视频文件可以包含流偏移。例如,您的音频流可能与您的视频流相反。作为另一个示例,您可能已经剪掉了视频的开头并保存了结果。如果您的剪辑没有精确地发生在关键帧处,则像 ffmpeg 这样的视频编辑软件将在输出文件中包含少量帧之前您的剪辑,以便允许您剪辑发生的帧被正确解码(可能需要之前的帧)。在这种情况下,也会有一个流偏移。

      为了确保以正确的方式解释这些偏移量,即真正准确地击中相对于“时间 0”的所需帧,唯一“简单”但昂贵的方法是真正吃掉和解码所有视频帧。这显然就是 openCV 在这里所做的。您的视频播放器不会为此烦恼,因为日常用户不会注意到,而且 GUI 中的控件无论如何都不够精确。

      我可能错了。但对other questions 的回答以及我为评估它们而进行的一些实验表明,只有“缓慢”地计算视频中的帧数才能得到准确的结果。

      【讨论】:

      • GPU 在搜索时很重要,因为除非你正好落在 I 帧上,否则你正在解码帧。
      【解决方案3】:

      这可能是因为这是一个非常基本的代码示例,并且提到的应用程序正在做一些更聪明的事情。

      几点:

      如果搜索速度很重要,you almost definitly want to work 在进行视频操作时使用 GPU:

      https://github.com/opencv/opencv/blob/master/samples/gpu/video_reader.cpp

      【讨论】:

      • 这很有帮助,尤其是让我意识到即使是视频观看也非常依赖 GPU。我还进行了一些研究,以确认您怀疑 VLC 几乎所有视频渲染都使用图形驱动程序。也是在那个时候我偶然发现了libVLC,它利用了 VLC 几乎无处不在的特性和一个非常好的 API。它甚至有 Python 绑定。此外,OpenCV GPU 功能还没有配备“随机搜索”。我或许应该为此提出功能请求。
      猜你喜欢
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多