我正在尝试在单独的线程中从相机录制视频而不加载主进程。为此,我实现了 Recorder 类,但它并不总是有效。有时视频坏了,有时程序只是“起床”。我认为错误在连接中的某个地方,但我不能完全理解
# recorder.py
import queue
import threading
from typing import Tuple
import cv2
class Recorder(threading.Thread):
def __init__(self, output_path: str,
fourcc: str = 'mp4v',
fps: float = 30,
resolution: Tuple[int, int] = (1920, 1080),
record_in_background: bool = True):
super(Recorder, self).__init__(daemon=record_in_background)
self.resolution = resolution
self.writer = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*fourcc),
fps, self.resolution)
self.frames_queue = queue.Queue()
self.recording = False
def __del__(self):
self.frames_queue.join()
self.writer.release()
def write(self, frame):
self.frames_queue.put(frame)
def start(self):
super().start()
return self
def run(self):
self.recording = True
while self.recording or not self.frames_queue.empty():
frame = self.frames_queue.get()
resized_frame = cv2.resize(frame, self.resolution)
self.writer.write(resized_frame)
self.frames_queue.task_done()
def stop(self):
self.recording = False
self.join()
# main.py
import cv2
import recoder
cam = cv2.VideoCapture(0)
r = recoder.Recorder("123.mp4", resolution=(640, 480))
r.start()
while True:
ret, frame = cam.read()
if not ret:
break
r.write(frame)
cv2.imshow("frame", frame)
cv2.waitKey(1)
if cv2.waitKey(25) == ord('q'):
break
cv2.destroyAllWindows()
cam.release()
r.stop()