我在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提供的数据,我找不到任何关于如何将其转换为它可以接受的数据的信息。
任何人都可以请建议我如何才能实现写入此视频数据,以正确格式化的视频文件?
1条答案
按热度按时间iyzzxitl1#
将视频数据写入格式正确的视频文件的一个可能的解决方案是使用Python库
ffmpeg
。您可以通过pip install ffmpeg-python
安装它。要在代码中使用它,您可以将
rec_stream
的open
语句替换为以下内容:这样,您就可以创建一个
ffmpeg
输入,它使用与picamera2
编码器相同的配置从stdin
读取数据。然后,指定所需的输出格式和输出文件。最后,使用
run_async
开始在后台运行ffmpeg
命令,通过stdin
发送数据。这允许您像以前一样继续写入rec_stream
,但现在数据应该被正确格式化。