gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:10:48 26 4
gpt4 key购买 nike

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

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(示例 2.4.11、3.3.0)的 OpenCV(二进制文件)版本,第一个 seek 有效,但后续的无效。也就是说,它可以从上面的例子中寻找帧 200,而不是 400 和其余的;视频只是跳回到第 0 帧。但是因为它适用于 2.4.9,所以我现在很高兴。

最佳答案

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

听起来 OpenCV 实现了一种“安全”的搜索方式:视频文件可以包含流偏移量。例如,您的音频流可能会与您的视频流相冲突。再举一个例子,您可能剪掉了视频的开头并保存了结果。如果您的剪切没有恰好发生在关键帧上,则像 ffmpeg 这样的视频编辑软件会在输出文件中包含您剪切之前的少量帧,以便允许剪切发生的帧正确解码(之前的帧可能是必需的)。在这种情况下,也会有流偏移。

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

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

关于python - 为什么使用 OpenCV 搜索随机视频很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48830865/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com