我正在尝试使用 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()
只需为您正在使用的每个线程制作单独的 cap 对象