为什么使用 OpenCV 搜索随机视频很慢?

Ara*_*aje 6 python opencv ffmpeg

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

GPP*_*PPK 1

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

几点:

如果搜索速度很重要,那么您几乎肯定希望在进行视频操作时使用 GPU:

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