其他答案适用于保存
单个视频源。但是,如果您有多个视频源,例如多个IP摄像机源、RTSP流或网络摄像头,则可能希望同时记录它们。这里介绍一种使用多线程同时保存
多个视频源的方法。其思想是为每个视频源设置两个线程:1)专门用于从流中读取帧;2)专门用于处理帧(显示和保存)。
由于
cv2.VideoCapture.read()
是一个阻塞操作,因此我们必须将读取帧与保存帧分开。我们可以在自己独立的线程中读取帧,通过减少I/O操作的延迟来提高性能。通过将帧捕获专用于其自己的线程,将始终有一帧准备好被处理,而不必等待I/O操作完成并返回新的帧。第二个线程专门用于处理和保存帧到输出文件。我们可以将所有这些封装到单个对象中,以便可以根据同时视频流的数量进行扩展。请确保更改视频
src
参数以适应您自己的视频源。以下是同时录制三个视频流的示例。
from threading import Thread
import cv2
import time
class VideoWriterWidget(object):
def __init__(self, video_file_name, src=0):
self.frame_name = str(src)
self.video_file = video_file_name
self.video_file_name = video_file_name + '.avi'
self.capture = cv2.VideoCapture(src)
self.frame_width = int(self.capture.get(3))
self.frame_height = int(self.capture.get(4))
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))
self.thread = Thread(target=self.update, args=())
self.thread.daemon = True
self.thread.start()
self.start_recording()
print('initialized {}'.format(self.video_file))
def update(self):
while True:
if self.capture.isOpened():
(self.status, self.frame) = self.capture.read()
def show_frame(self):
if self.status:
cv2.imshow(self.frame_name, self.frame)
key = cv2.waitKey(1)
if key == ord('q'):
self.capture.release()
self.output_video.release()
cv2.destroyAllWindows()
exit(1)
def save_frame(self):
self.output_video.write(self.frame)
def start_recording(self):
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)
while True:
time.sleep(5)
与相机/IP/RTSP/流媒体、FPS、视频、线程和多进程相关的帖子
Python OpenCV从相机实时流 - 多线程,时间戳
使用OpenCV cv2.VideoCapture在Python中从IP相机进行视频流传输
如何使用OpenCV捕获多个相机流?
OpenCV实时流视频捕获较慢。如何丢弃帧或与实时同步?
使用OpenCV VideoWriter将RTSP流存储为视频文件
OpenCV视频保存
Python OpenCV多进程cv2.VideoCapture mp4