摄像头与音频一起初始化的时候顺序是否有额外的讲究?

Viewed 173

重现步骤

运行该初始化代码就会报错 音视频都需要初始化的时候是否有不同的顺序需要调整?

期待结果和实际结果

软硬件版本信息

k230 micropython

错误日志

image.png
尝试解决过程

补充材料

    self.VIDEO_MAIN_WIDTH = 1920                        # 视频主通道宽度
    self.VIDEO_MAIN_HEIGHT = 1080                       # 视频主通道高度
    self.VIDEO_VENC_MAIN_CHN_ID = VENC_CHN_ID_0         # type: ignore  视频主通道编码通道ID
    self.VIDEO_BIT_RATE = 1024                          # 视频码率 1Mbps
    self.VIDEO_FPS = 25                                 # 视频帧率
    self.AUDIO_RATE = 8000                              # 音频采样率
    self.AUDIO_CHUNK = self.AUDIO_RATE//self.VIDEO_FPS  # 音频帧大小
    self.AUDIO_FORMAT = paInt16                         # type: ignore # 音频采样精度,支持16bit(paInt16)/24bit(paInt24)/32bit(paInt32)
    self.AUDIO_CHANNELS = 2                             # 音频声道数,支持单声道(1)/立体声(2)


def start_impl(self):
    """ 实现实时流启动逻辑 """
    try:
        if self.has_video:
            logger.info("初始化音视频外设")
            # 初始化传感器实例
            self.cam_sensor = Sensor() # type: ignore 初始化摄像头传感器 当前的GC2093挂在csi2接口上
            # 重置传感器
            self.cam_sensor.reset() 
            # 设置帧大小
            self.cam_sensor.set_framesize(  width=self.VIDEO_MAIN_WIDTH,
                                            height=self.VIDEO_MAIN_HEIGHT,
                                            alignment=12)
            # 设置像素格式
            self.cam_sensor.set_pixformat(Sensor.YUV420SP) # type: ignore
            # 设置sensor输出帧率
            self.cam_sensor._set_chn_fps(chn = 0, fps = self.VIDEO_FPS)
            # 初始化视频编码器
            self.video_encoder = Encoder() # type: ignore
            # 设置编码器输入缓冲区
            self.video_encoder.SetOutBufs(self.VIDEO_VENC_MAIN_CHN_ID,
                                            8,
                                            self.VIDEO_MAIN_WIDTH,
                                            self.VIDEO_MAIN_HEIGHT)
            # 绑定camera和venc
            self.video_link = MediaManager.link(self.cam_sensor.bind_info()['src'], # type: ignore
                                                (VIDEO_ENCODE_MOD_ID,               # type: ignore
                                                 VENC_DEV_ID,                       # type: ignore
                                                self.VIDEO_VENC_MAIN_CHN_ID))
            # 创建PyAudio对象
            self.pyAudio_obj = PyAudio() # type: ignore
            # 初始化PyAudio对象
            self.pyAudio_obj.initialize(self.AUDIO_CHUNK)
            # 初始化G711对象
            self.g711_encoder = g711.Encoder(K_PT_G711A, self.AUDIO_CHUNK) # type: ignore
            # 初始化媒体管理器
            MediaManager.init() # type: ignore
            # 创建G711编码器
            self.g711_encoder.create() # type: ignore
            # 设置编码通道属性
            self.video_chnAttr = ChnAttrStr(self.video_encoder.PAYLOAD_TYPE_H264,  # type: ignore
                                            self.video_encoder.H264_PROFILE_MAIN, 
                                            self.VIDEO_MAIN_WIDTH, self.VIDEO_MAIN_HEIGHT,
                                            src_frame_rate = self.VIDEO_FPS,    # 编码器输入帧率
                                            dst_frame_rate = self.VIDEO_FPS,    # 编码器输出帧率
                                            bit_rate = self.VIDEO_BIT_RATE,     # 编码器码率
                                            gop_len = 30)                       # 编码器GOP长度
            # 创建编码器
            self.video_encoder.Create(self.VIDEO_VENC_MAIN_CHN_ID, self.video_chnAttr)
            # 开始编码
            self.video_encoder.Start(self.VIDEO_VENC_MAIN_CHN_ID)
            # 启动摄像头
            self.cam_sensor.run()
            # 使用音频对象创建1个音频输入流
            self.audio_input_stream = self.pyAudio_obj.open(format=self.AUDIO_FORMAT,
                                                            channels=self.AUDIO_CHANNELS,
                                                            rate=self.AUDIO_RATE,
                                                            input=True,
                                                            frames_per_buffer=self.AUDIO_CHUNK)
            # 设置音频输入流参数
            self.audio_input_stream.volume(85, LEFT) # type: ignore 设置左声道音量
            self.audio_input_stream.volume(85, RIGHT) # type: ignore 设置右声道音量
            # 开启音频3A 自动噪声抑制(ANS)
            self.audio_input_stream.enable_audio3a(AUDIO_3A_ENABLE_ANS) # type: ignore 
            logger.info("音视频外设初始完成")
        elif self.has_audio:
            logger.info("音频暂未实现")
            pass

        # 启动视频发送线程
        self._send_thread = _thread.start_new_thread(self._send_video_loop, ())
        return True

    except Exception as e:
        self._cleanup_resources()
        raise ValueError(f"启动实时流异常: {str(e)}")
3 Answers

self.cam_sensor = Sensor() # type: ignore 初始化摄像头传感器 当前的GC2093挂在csi2接口
你看看这个Sensor()是不是少了参数?

您可以参考 mp4format.py 的使用示例。该示例展示了如何同时采集sensor画面和音频,并在对音视频数据进行编码后,将其录制成 MP4 文件。

文件路径:/src/canmv/port/builtin_py/media/mp4format.py

我参考该示例进行了调整 但还是提示 warning: sensor not call run() 最新的初始化代码在最后一楼

请运行 mp4format.py 查看是否同样出现错误。如运行后未见错误,请仔细对比两者的代码细节,找出关键差异。

我参考该示例进行了调整 但还是提示 warning: sensor not call run()
调整后的初始化代码如下

def start_impl(self):
    """ 实现实时流启动逻辑 """
    try:
        if self.has_video:
            logger.info("初始化音视频外设")
            # 初始化传感器实例
            self.cam_sensor = Sensor() # type: ignore 初始化摄像头传感器 当前的GC2093挂在csi2接口上
            # 重置传感器
            self.cam_sensor.reset()
            # 初始化视频编码器
            self.video_encoder = Encoder() # type: ignore

            # 设置sensor输出帧大小
            self.cam_sensor.set_framesize(  width=self.VIDEO_MAIN_WIDTH,
                                            height=self.VIDEO_MAIN_HEIGHT,
                                            alignment=12)
            # 设置sensor输出像素格式
            self.cam_sensor.set_pixformat(Sensor.YUV420SP) # type: ignore
            # 设置sensor输出帧率
            self.cam_sensor._set_chn_fps(chn = 0, fps = self.VIDEO_FPS)

            # 设置编码器输入缓冲区
            self.video_encoder.SetOutBufs(self.VIDEO_VENC_MAIN_CHN_ID_0,
                                            15,
                                            self.VIDEO_MAIN_WIDTH,
                                            self.VIDEO_MAIN_HEIGHT)
            # 创建PyAudio对象
            self.pyAudio_obj = PyAudio() # type: ignore
            # 初始化PyAudio对象
            self.pyAudio_obj.initialize(self.AUDIO_CHUNK)
            # 初始化G711对象
            self.g711_encoder = g711.Encoder(K_PT_G711A, self.AUDIO_CHUNK) # type: ignore

            # 绑定camera和venc
            self.video_link = MediaManager.link(self.cam_sensor.bind_info()['src'], # type: ignore
                                                (VIDEO_ENCODE_MOD_ID,               # type: ignore
                                                 VENC_DEV_ID,                       # type: ignore
                                                self.VIDEO_VENC_MAIN_CHN_ID_0))
            # 初始化媒体管理器
            MediaManager.init() # type: ignore

            # 设置编码通道属性
            self.video_chnAttr = ChnAttrStr(self.video_encoder.PAYLOAD_TYPE_H264,  # type: ignore
                                            self.video_encoder.H264_PROFILE_MAIN, 
                                            self.VIDEO_MAIN_WIDTH, self.VIDEO_MAIN_HEIGHT,
                                            src_frame_rate = self.VIDEO_FPS,    # 编码器输入帧率
                                            dst_frame_rate = self.VIDEO_FPS,    # 编码器输出帧率
                                            bit_rate = self.VIDEO_BIT_RATE,     # 编码器码率
                                            gop_len = 30)                       # 编码器GOP长度
            # 创建视频编码器
            self.video_encoder.Create(self.VIDEO_VENC_MAIN_CHN_ID_0, self.video_chnAttr)
            # 创建G711音频编码器
            self.g711_encoder.create()
            # 使用音频对象创建1个音频输入流
            self.audio_input_stream = self.pyAudio_obj.open(format=self.AUDIO_FORMAT,
                                                            channels=self.AUDIO_CHANNELS,
                                                            rate=self.AUDIO_RATE,
                                                            input=True,
                                                            frames_per_buffer=self.AUDIO_CHUNK)
            # 设置音频输入流参数
            self.audio_input_stream.volume(85, LEFT) # type: ignore 设置左声道音量
            self.audio_input_stream.volume(85, RIGHT) # type: ignore 设置右声道音量
            # 开启音频3A 自动噪声抑制(ANS)
            self.audio_input_stream.enable_audio3a(AUDIO_3A_ENABLE_ANS) # type: ignore 
            # 开始编码
            self.video_encoder.Start(self.VIDEO_VENC_MAIN_CHN_ID_0)
            # 启动摄像头
            self.cam_sensor.run()
            logger.info("音视频外设初始完成")
        elif self.has_audio:
            logger.info("音频暂未实现")
            pass

        # 启动视频发送线程
        self._send_thread = _thread.start_new_thread(self._send_video_loop, ())
        return True

    except Exception as e:
        self._cleanup_resources()
        raise ValueError(f"启动实时流异常: {str(e)}")