重现步骤
运行该初始化代码就会报错 音视频都需要初始化的时候是否有不同的顺序需要调整?
期待结果和实际结果
软硬件版本信息
k230 micropython
错误日志
尝试解决过程
补充材料
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)}")