首页 > 解决方案 > 无法将流输出 (h264) 保存到文件

问题描述

我有一个带有picamera-h264-web-streaming的覆盆子相机,并且遇到了无法将每一帧保存到我的覆盆子上的自定义视频文件的问题。我需要我的视频文件作为 h264 编解码器,但 mp4 也可以。每 15 分钟它应该创建一个新视频。流不会停止,所以我只更改文件名。

实际上,我将每个帧作为字节附加到文件中,并在录制为 mp4 后将其转换。我认为元文件或某些东西丢失了,因为所有视频都没有前 10-20 秒的记录。

通过使用 ffmpeg 进行转换,我得到以下错误: 转换错误

原始流输出.py:

class StreamingOutput(object):
    def __init__(self):
        self.frame = None
        self.buffer = BytesIO()
        self.condition = Condition()
        self.separator = b'\x00\x00\x00\x01'
        
        

    def write(self, buf):
        if buf.startswith(self.separator):           
            self.buffer.seek(0)
            with self.condition:
                self.frame = self.buffer.read()
                self.condition.notify_all()   
            self.buffer.seek(0)
            self.buffer.truncate() 
        return self.buffer.write(buf)

流式传输和录制 output.py

class StreamingOutput(object):
    def __init__(self):
        self.frame = None
        self.buffer = BytesIO()
        self.condition = Condition()
        self.separator = b'\x00\x00\x00\x01'
        self.name = "/tmp/empty_video.h264"

    def setName(self, name):
        self.name = name

    def write(self, buf):
        if buf.startswith(self.separator):           
            self.buffer.seek(0)
            with self.condition:
                self.frame = self.buffer.read()
                # MY CHANGES!!!
                self.writeToFile(self.frame)
                # END
                self.condition.notify_all()   
            self.buffer.seek(0)
            self.buffer.truncate() 
        return self.buffer.write(buf)

    def writeToFile(self, frame):
        with open(self.name, "ab") as file:
            file.write(frame)

我已经尝试过 OpenCV,但这会引发以下异常:

Expected Ptr<cv::UMat> for argument 'image'

使用 OpenCV 的代码:

self.myFile = cv2.VideoWriter(filename, cv2.VideoWriter_fourcc(*'H264'), 15, (704, 576))

有人建议吗?

标签: pythonraspberry-picodecpicamera

解决方案


推荐阅读