Opus编码PortAudio录制音频时出现编码后数据丢失问题
问题原因分析
- 输出缓冲区遍历逻辑错误
你调用enc.sound->resize(max_size)将向量扩容到了48000字节,而opus_encode_float的返回值enc.size才是实际编码生成的有效字节数,剩余48000 - enc.size的位置都是resize操作默认填充的0值。如果你遍历的时候没有限定只读取前enc.size个字节,而是遍历整个向量,就会误以为内容全部为空。 - 未校验编码接口返回值与输入合法性
opus_encode_float返回负值代表编码执行出错,你当前没有做任何错误判断,出现以下场景时都会导致编码失败,输出缓冲区无有效内容:- Opus编码器初始化参数不匹配:设置的声道数、采样率和输入音频的实际参数不一致,或传入的
FRAMES_PER_BUFFER和编码器预期的帧长不匹配 - 输入音频数据长度不足:
data.sound的实际采样点数量少于FRAMES_PER_BUFFER * 声道数,编码器读取输入时出错
- Opus编码器初始化参数不匹配:设置的声道数、采样率和输入音频的实际参数不一致,或传入的
- 空输入分支的未初始化问题
当data.size == 0时,你传入了栈上未初始化的float sound[max_size]数组作为编码输入,内存内容随机,极端场景下会导致编码器输出长度为0的有效数据。 - 额外提示:
AudioEnc结构体中的sound是裸指针,你在Encode函数中new的向量没有配套释放逻辑,极易出现内存泄漏,建议直接修改结构体存储vector实例而非指针,避免手动管理内存。
内容的提问来源于stack exchange,提问作者Diamonddedo
相关产品推荐
相关产品推荐

