视频播放20分钟后,cv2 cap.set()的运行时间显着增加

时间:2019-06-05 21:22:38

标签: python-3.x cv2

我正在使用cv2从一个长达一个小时的视频中获取帧。使用cap.set(cv2.CAP_PROP_POS_FRAMES, frame_counter - 1)可以正常工作,直到视频播放约20分钟,此后要花几秒钟来运行,这对于我的程序来说太长了。这是我的代码:

frame_counter = 1

cap_set_time = 0
count_inc = 150

cap = cv2.VideoCapture("<video fname>.MPG")

while cap.isOpened():

    cap_read_time_start_t = time.time()
    ret, frame = cap.read()
    cap_read_time = time.time() - cap_read_time_start_t

    print("for frame #:",frame_counter,"\t\t seconds per capset time :",str(round( cap_set_time, 7)),"\t\t seconds per cap.read time: " + str(round( cap_read_time, 7)))

    frame_counter += count_inc

    cap_set_start_t = time.time()
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_counter - 1)
    cap_set_time = time.time() - cap_set_start_t

    if not ret:
        cap.release()
        break

采样输出:

  

帧号:1,每组设置时间秒:每组设置时间0秒读取时间:0.0049469

     

帧号:151,每次设置时间的秒数:每盖帽的0.0368052秒。读取时间:0.001281

     

帧号:301,每封设置时间的秒数:每封设置的0.070514秒。读取时间:0.000824

     

帧号:451,每次设置上限时间的秒数:每个上限0.0767548秒,读取时间:0.000912

     

...

     

帧号:13201,每组设置时间的秒数:每组设置的时间0.0851121秒,读取时间:0.000891   帧号:13351,每副耳机时间的秒数:每副帽子的0.134234秒读取时间:0.0011251   帧号:13501,每副耳机时间的秒数:每副帽子的0.11519秒读取时间:0.000993

     

...

     

对于帧号:每个设置时间51001秒:每个设置4.2120111秒读取时间:0.0009148   对于帧编号:每个上限时间51151秒:每个上限4.1116858秒读取时间:0.0008929   对于第#帧:每副设置时间51301秒:每副设置4.1339762秒读取时间:0.0010149

     

...

     

对于帧#:每组设置时间65251秒:8.9148369秒   读取时间:帧号0.0011823:每组65401秒   时间:每上限9.618139秒读取时间:帧号0.0008669   每次通话时间65551秒:每次通话9.1504071秒读取时间:0.0008261

为清楚起见,capset time是呼叫cap.set(cv2.CAP_PROP_POS_FRAMES, frame_counter - 1)的时间,而cap.read time是呼叫ret, frame = cap.read()的时间。请注意,capset time是如何从最初的0.036秒增加到50,000帧内增加约4秒的时间。 这是当前的问题

我已经尝试在减速发生之前重新实例化VideoCapture()对象,该对象不起作用。我在网上搜索过,却没有在其他地方看到此问题的报告。

值得一提的是,一种解决方案是将视频分成20分钟以下的视频。除非绝对可行,否则我想避免这种方法。

有人知道这是什么原因和/或如何解决此问题吗?可能是视频本身引起的吗?在我看来,这似乎不太可能,但仍然值得考虑。

谢谢, 杰里米

0 个答案:

没有答案