将 VoiceProcessingIO 用于 Voip 并获取原始麦克风输入

Using VoiceProcessingIO for Voip and getting raw mic input as well

我正在使用 VoiceProcessingIO 音频单元进行 voip 通话。但是,当我设置扬声器(设置kAudioSessionOverrideAudioRoute_Speaker音频会话属性)时,通过调用AudioUnitRender在输入回调中接收到的PCM数据音量非常低。

对于voip电话来说,其实还可以。对话者听得更微弱,但他听到了。但是,我想将高质量版本的输入音频保存到磁盘,可能是来自麦克风的原始音频。

真的可以吗?在我的测试中,我无法做到这一点。当使用 VoiceProcessingIO 时,来自输入回调的音频非常低。也许,我可以从其他来源获得未处理的音频?请注意,在 voip 通话期间仍必须使用 VoiceProcessingIO。

Apple 论坛上的相同问题是 thread-655091,1 年前有人问过,至今没有答案。 我发现最接近 SO 的问题是 Two audio units? and Effect before render callback?,但他们更关心 VoiceProcessingIO 的输出而不是输入。

一个想法是添加一个并行的“原始”RemoteIO 单元以从麦克风获取音频,但是在 Two audio units? and in apple-forum-110816 中,开发人员表示不可能添加另一个并行的 RemoteIO 到VoiceProcessingIO,因为设置了 音频会话类别为 PlayAndRecord,音频模式为 VoiceChat,RemoteIO 将无法正常工作。我还没有机会尝试,但似乎可以。

还有其他策略吗?在 VoiceProcessingIO 单元启动并处理来自麦克风的原始数据之前是否调用了一些“预渲染输入回调”?

是否可以在麦克风和 VoiceProcessingIO 单元之间安装一些 TAP?

AFAIK,没有 public API 允许从 iOS 设备上的麦克风获取已处理和未处理的输入。

如果您需要经过处理的输入(用于回声消除的语音处理等),那么您最好的选择是为您的其他需求(通过某些 DSP 库等)向音频数据添加增益,因为它是浮动数据。