Storing RTSP stream as video file with OpenCV VideoWriter

后端 未结 1 1311
猫巷女王i
猫巷女王i 2020-12-03 18:41

I\'m developing a Python module, with OpenCV, that connects to an RTSP stream to perform some preprocessing on the video (mostly, reducing fps and resolution), and then stor

相关标签:
1条回答
  • 2020-12-03 19:15

    Here's a RTSP stream to video widget. I would recommend creating another thread for obtaining the frames as cv2.VideoCapture.read() is blocking. This can be expensive and cause latency as the main thread has to wait until it has obtained a frame. By putting this operation into a separate thread that just focuses on grabbing frames and processing/saving the frames in the main thread, it dramatically improves performance. You also can experiment with other codecs but using MJPG should be safe since its built into OpenCV. I used my IP camera stream and saved the frames to output.avi. Be sure to change rtsp_stream_link to your own RTSP stream link. :)

    from threading import Thread
    import cv2
    
    class RTSPVideoWriterObject(object):
        def __init__(self, src=0):
            # Create a VideoCapture object
            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('output.avi', 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()
    
        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('frame', 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)
    
    if __name__ == '__main__':
        rtsp_stream_link = 'your stream link!'
        video_stream_widget = RTSPVideoWriterObject(rtsp_stream_link)
        while True:
            try:
                video_stream_widget.show_frame()
                video_stream_widget.save_frame()
            except AttributeError:
                pass
    
    0 讨论(0)
提交回复
热议问题