尝试使用多线程在 opencv 中缓冲视频时出错

问题描述 投票:0回答:1

我正在尝试使用 OpenCV 中的线程将视频读入缓冲区,我得到“

Assertion fctx->async_lock failed at libavcodec/pthread_frame.c:167
”,我想使用线程来执行此操作的原因是这样我可以一次将大量帧读入列表中,所以它是快速地。我需要所有帧并且不能跳过任何帧。我认为多线程将是可行的方法。我的代码是单线程的,又名“
buffer_refill = 1
”。

import threading
import cv2

cap = cv2.VideoCapture('data/temp/testing/test.mp4')
frames = []
total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
frames_left = total_frames
threads = []

print(total_frames)

min_buffer = 120
buffer_refill = 60

def buffer():
    print('buffer')
    frame = cap.grab()
    ret, frame = cap.retrieve()
    frames.append(frame)

def get_buffer(num):
    global frames_left
    for i in range(num):
        frames_left -= 1
        if frames_left > 0:
            t = threading.Thread(target=buffer)
            t.start()
            threads.append(t)
    for thread in threads:
        thread.join()
    print('block')

while(cap.isOpened()):
    if frames_left > 0 and len(frames) < min_buffer:
        get_buffer(buffer_refill)
    else:
        cv2.imshow('Frame',frames[0])
        frames.pop(0)
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break

cap.release()
cv2.destroyAllWindows()
python multithreading opencv
1个回答
0
投票

只需为您正在使用的每个线程制作单独的 cap 对象

© www.soinside.com 2019 - 2024. All rights reserved.