python 将picam2视频流捕获为正确格式化的文件

icomxhvb  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(147)

我在Raspberry Pi 3B+上使用picamera2 Python库。我的目标是在网络上同时录制和播放视频。由于这个库没有提供这种开箱即用的同步功能,我编写了以下代码来实现这一点:

def __startStream(self):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as self.sock:
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind(("0.0.0.0", 5001))
        self.sock.listen()

        self.conn, addr = self.sock.accept()
        net_stream = self.conn.makefile("wb")      
        rec_stream = open(f"rec.mp4", 'wb')
        
        def write_both(data):
            rec_stream.write(data)
            return net_stream._write(data)

        net_stream._write = net_stream.write
        net_stream.write = write_both

        self.picam2.encoder.output = FileOutput(net_stream)
        self.picam2.start_encoder()
        self.picam2.start()

这段代码的问题是,我使用BufferedWriter将数据保存到视频文件中,这并没有正确地将其格式化为视频文件,因此它无法导入任何视频编辑应用程序,很少有玩家可以播放它。
我想替换BufferedWriter与其他一些库,将正确格式化此视频文件。我试过OpenCV:

rec_stream  = cv2.VideoWriter('video.avi', -1, 25, (1024, 600))

但是它抛出错误,因为它不喜欢picamera2提供的数据,我找不到任何关于如何将其转换为它可以接受的数据的信息。
任何人都可以请建议我如何才能实现写入此视频数据,以正确格式化的视频文件?

iyzzxitl

iyzzxitl1#

将视频数据写入格式正确的视频文件的一个可能的解决方案是使用Python库ffmpeg。您可以通过pip install ffmpeg-python安装它。
要在代码中使用它,您可以将rec_streamopen语句替换为以下内容:

import ffmpeg

rec_stream = (
    ffmpeg
    .input('pipe:', format='h264', framerate=25, pixel_format='yuv420p', video_size='1024x600', loglevel='quiet')
    .output('rec.mp4', vcodec='copy') # Change the format to what you need
    .overwrite_output()
    .run_async(pipe_stdin=True)
)

# write to the stream
for frame in YOUR_FRAME_DATA:
    rec_stream.stdin.write(frame)
rec_stream.stdin.close()
rec_stream.wait()

这样,您就可以创建一个ffmpeg输入,它使用与picamera2编码器相同的配置从stdin读取数据。然后,指定所需的输出格式和输出文件。
最后,使用run_async开始在后台运行ffmpeg命令,通过stdin发送数据。这允许您像以前一样继续写入rec_stream,但现在数据应该被正确格式化。

相关问题