cv2.VideoCapture.set() 有替代函数吗?

Is there an alternative function to cv2.VideoCapture.set()?

我正在使用线路分析器测试我的算法的代码性能 %lprun -f track()

Timer unit: 1e-06 s (µs)

Total time: 1724.82 s

   Line #      Hits         Time  Per Hit   % Time  Line Contents
   ==============================================================
   138         1      35075.0  35075.0      0.0    video = cv2.VideoCapture(input_video_path)
   139         1          6.0      6.0      0.0    frame_i = 0
   142                                           
   143       927       4004.0      4.3      0.0    for img in frames:
   144       926     294117.0    317.6      0.0        print('Percentage of video processed : {}'.format(round( (currentFrame / total) * 100, 2)))
   145                                                 # capture frame-by-frame
   146       926  545906580.0 589531.9     31.7        video.set(1, currentFrame);
   147                                                 # ret, img = video.read()
   148       926       9046.0      9.8      0.0        frame_i += 1

并对 video.set(1, currentFrame) 花费 31.7% 的时间感到惊讶(545.9 秒)。
这个功能到底是做什么的,有没有替代品可以节省大约 9 分钟?
编辑这里是整个 code 和线分析器

set(1, ...) 表示 cv.CAP_PROP_POS_FRAMES。您应该 使用命名常量,而不是幻数。

这个做的在视频文件中叫做“求”。

在视频文件中查找的成本很高,因为必须找到最近的前一个关键帧,然后解码可能的多个帧直到所需的点。任何图书馆都必须付出努力。这不是OpenCV的错。

如果您想要尽可能快,您必须将视频转码为仅帧内格式。然后,只有特定的帧必须被解码。您可以使用不带 B 帧或 P 帧(仅 I 帧)的 H.264,也可以使用 MJPEG。

一般来说,您应该避免寻找。逐帧阅读视频,不要跳来跳去,更不要“跳到下一帧”。