Portaudio录制音频播放无声音或出现嘈杂嗡嗡声故障求助
核心错误点
播放回调的frameIndex强制重置问题
你的playCallback函数第一行写了data->frameIndex = 1;,这会导致每次播放回调触发时,读取位置都被强制重置到第1帧,根本无法顺序读取完整的音频数据:要么是永远只重复读取前几帧数据产生周期性嗡嗡杂音,要么直接触发播放结束逻辑无声音输出。
修复方案:直接删除playCallback中的data->frameIndex = 1;这行代码。play函数中frameIndex赋值顺序错误
你在play函数中先执行_data.frameIndex = 0;,再执行_data = Audio;,赋值顺序完全颠倒:录制完成返回的Audio结构体中frameIndex等于maxFrameIndex,赋值后_data.frameIndex直接被覆盖为最大值,播放时计算的framesLeft为0,直接结束播放,自然没有任何声音输出。
修复方案:调换两行代码的顺序,先赋值音频数据,再重置播放起始位置:_data = Audio; _data.frameIndex = 0;录制与播放通道数不匹配
你初始化时录制流设置为1声道(单声道),播放流设置为2声道(双声道),如果你的NUM_CHANNELS宏没有和流参数同步匹配,会导致音频数据解析错位:单声道数据按照双声道格式读取会把相邻的两个采样值分别识别为左右声道,产生严重的失真杂音。
修复方案:要么统一录制和播放的声道数,要么在播放前把单声道数据转成双声道数据(每个采样值同时赋值给左右声道)。输出流延迟参数错误
你初始化_outputParameters.suggestedLatency时错误调用了defaultLowInputLatency,这是输入设备的延迟参数,应该替换为输出设备的延迟参数:_outputParameters.suggestedLatency = Pa_GetDeviceInfo(_outputParameters.device)->defaultLowOutputLatency;
其他优化点
- 你在构造函数中已经调用了
init(),main函数中又重复调用了audio->init(),会导致内存泄漏(之前分配的recordedSamples内存没有释放就重新分配),建议删除main函数中的重复init()调用。 - 录制用的
paClipOff标记可能会导致溢出的采样值没有被裁剪,产生爆音,测试阶段可以先去掉这个标记使用默认配置。
内容的提问来源于stack exchange,提问作者Diamonddedo

