python opencv 录制视频_python - 使用Opencv Python多线程录制视频 - 堆栈内存溢出

我认为您的工作方向正确,但是我无法使用您的代码保存文件。 这是一个使用多线程获取帧的视频流到视频小部件。 每个摄像机流都有两个线程:

线程#1-专用于仅读取摄像机流中的帧。

线程#2-专用于处理帧(显示和写入)。

因为cv2.VideoCapture.read()是一项阻止操作,所以我们将阅读帧与显示/写入分开。 因此,我们在其自己的独立线程中读取帧以通过减少I / O操作引起的延迟来“改善” FPS。 此外,通过将帧捕获隔离到其自己的线程,将始终有准备好处理的帧,而不必等待I / O操作完成并返回新的帧。 在第二个专门用于处理的线程中,我们现在可以自由地显示每个帧并将其保存到我们的输出文件中。

同样,通过将所有这些封装到一个对象中,我们可以为每个摄像机创建一组线程,无论使用多少个摄像机,它都可以轻松扩展。 由于每个摄像机流都是在后台线程中生成的,因此我们必须保持主线程处于活动状态。 确保将src字符串更改为您自己的相机。 这是同时录制三个视频流的示例。

from threading import Thread

import cv2

import time

class VideoWriterWidget(object):

def __init__(self, video_file_name, src=0):

# Create a VideoCapture object

self.frame_name = str(src)

self.video_file = video_file_name

self.video_file_name = video_file_name + '.avi'

self.capture = cv2.VideoCapture(src)

# Default resolutions of the frame are obtained (system dependent)

self.frame_width = int(self.capture.get(3))

self.frame_height = int(self.capture.get(4))

# Set up codec and output video settings

self.codec = cv2.VideoWriter_fourcc('M','J','P','G')

self.output_video = cv2.VideoWriter(self.video_file_name, self.codec, 30, (self.frame_width, self.frame_height))

# Start the thread to read frames from the video stream

self.thread = Thread(target=self.update, args=())

self.thread.daemon = True

self.thread.start()

# Start another thread to show/save frames

self.start_recording()

print('initialized {}'.format(self.video_file))

def update(self):

# Read the next frame from the stream in a different thread

while True:

if self.capture.isOpened():

(self.status, self.frame) = self.capture.read()

def show_frame(self):

# Display frames in main program

if self.status:

cv2.imshow(self.frame_name, self.frame)

# Press Q on keyboard to stop recording

key = cv2.waitKey(1)

if key == ord('q'):

self.capture.release()

self.output_video.release()

cv2.destroyAllWindows()

exit(1)

def save_frame(self):

# Save obtained frame into video output file

self.output_video.write(self.frame)

def start_recording(self):

# Create another thread to show/save frames

def start_recording_thread():

while True:

try:

self.show_frame()

self.save_frame()

except AttributeError:

pass

self.recording_thread = Thread(target=start_recording_thread, args=())

self.recording_thread.daemon = True

self.recording_thread.start()

if __name__ == '__main__':

src1 = 'Your link1'

video_writer_widget1 = VideoWriterWidget('Camera 1', src1)

src2 = 'Your link2'

video_writer_widget2 = VideoWriterWidget('Camera 2', src2)

src3 = 'Your link3'

video_writer_widget3 = VideoWriterWidget('Camera 3', src3)

# Since each video player is in its own thread, we need to keep the main thread alive.

# Keep spinning using time.sleep() so the background threads keep running

# Threads are set to daemon=True so they will automatically die

# when the main thread dies

while True:

time.sleep(5)

你可能感兴趣的:(python,opencv,录制视频)