我正在 iOS 上开发一个 VOIP 项目。根据 Apple 文档的建议,我使用 VoiceProcessingIO 音频单元来获得回声消除支持。
由于我的应用程序需要在渲染和捕获端进行单独操作(例如,关闭扬声器但让麦克风继续工作),所以我创建了两个音频单元,一个关闭捕获端口,另一个关闭渲染端口。
在我了解回声消除的工作原理之前,当前代码运行良好:它需要比较来自麦克风和扬声器的信号。所以我担心的是:像我的方法一样使用两个语音处理音频单元是否安全?此外,由于音频消除主要从捕获端进行,是否可以使用 RemoteIO 音频单元进行渲染(连接到扬声器)?
我不是100%有信心,因为我只是进入这个领域很短的时间。我也从 developer.apple.com 尝试过,但我从 developer.apple.com 找到的所有示例通常只使用一个音频单元。
谁能给点提示?我的方法对 VoiceProcessingIO 单元的功能有任何潜在影响吗?
谢谢, 福州
最佳答案
首先,VoiceProcessingIO(在我写这篇文章时)只是回声抑制,而不是回声消除。如果输出太大声,它基本上只是关闭输入。这意味着例如在 VOIP 通话中,远端在通话时听不到您的声音。完全回声消除将保持输入打开,但会尝试减去输出的回声。
我建议只使用一个单元,并以编程方式自行处理“关闭扬声器”的情况。您的输出回调可能如下所示:
OSStatus output_callback(
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inInputBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
my_context_t *context = inRefCon;
audio_sample_t *dst = (audio_sample_t *)ioData->mBuffers[0].mData;
if (context->muted) {
memset(dst, 0, inNumberFrames * sizeof(audio_sample_t));
} else {
get_output_samples(context, dst, inNumberFrames);
}
return noErr;
}
对回声抑制给予沉默不应对其产生不利影响。
关于ios - 在iOS中使用多个语音处理IO音频单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10638297/