ios - 在iOS中使用多个语音处理IO音频单元

标签 ios audio core-audio

我正在 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/

相关文章:

ios - 使用 PhotoKit 在文件夹中创建子文件夹

javascript - 更改页面长度/滚动条时的 iOS 视觉闪光

javascript - jQuery:延迟变量 play() 函数?

algorithm - 给定每秒 44 个样本的 LPCM 阵列消除噪声

objective-c - 无法使用类型为 'void *' 的右值初始化类型为 'void *const *' 的变量

android - Firebase 配置的 Codemagic 预构建问题

ios - 尾随约束缺失错误

macos - 在 Catalina 上,coreaudiod 始终保持在 12.5% 左右的 CPU

javascript - 是否可以将用javascript生成的html音频录制到后端的音频文件中?

python - wav 文件幅度计算