ios - 在 iOS 中同时使用两个音频单元进行 I/O 是否安全?

标签 ios core-audio

我正在为 iOS 开发一个 VOIP 项目并注意到一个奇怪的问题。我的设置如下所示:

  1. Capture 端有一个 VoiceProcessingIO 单元(用于回声消除),具有输出范围、输出总线和输入范围,启用输入总线。
  2. 渲染端有一个 RemoteIO 单元,带有输出范围,启用输出总线。

到目前为止我没有使用任何音频图。

当我开始录音时,我注意到上面的设置导致输出声音非常低,直到我关闭输出范围,VoiceProcessingIO 的输出总线。虽然这听起来像是我的代码中的错误(设置错误的 IO 总线),但仍然无法理解为什么捕获端的更改会影响渲染端。

从 developer.apple.com 阅读了适用于 iOS 的 Audio Unit Hosting Guide 后,我注意到它多次提到每个设计模式应该只包含一个 I/O 音频单元。我想知道这是强制性的还是可选的。将我的代码与两个音频单元一起保存是否安全?

的确,使用两个音频单元可能有其自身的原因,因为如果我想将一端静音,我可以简单地关闭一个单元。我不能用 kAudioUnitProperty_EnableIO 做到这一点,因为它在 AudioUnitInitialize() 之后无法更改,这意味着如果我想禁用其中一个,单音频单元解决方案可能必须关闭两个 channel 并再次重新初始化音频单元。这会导致糟糕的用户体验,因为此时语音可能会暂停片刻。

谢谢, 福州

最佳答案

好吧,看来我在问一个角落问题。无论如何,我想我根据目前的实验有了一些想法:

  1. 如果我使用两个 RemoteIO 单元...它在本地端可能看起来不错,但在远程端会导致问题。还记得我提到过我正在开发 VOIP 应用程序吗?我发现在使用渲染端使用扬声器时,我的捕获端只能将非常低的音量传递给远程端。

  2. 如果我使用两个 VoiceProcessingIO 单元...虽然看起来我们可以创建两个音频单元对象,但它们实际上是同一个。我的意思是,在我的代码中,如果我创建两个单元并关闭其中一个(例如,使麦克风静音),那么另一个也会停止工作。

  3. 如果我使用一个 VoiceProcessingIO 单元和一个 RemoteIO 单元……那就更复杂了。首先,不要仅将 VoiceProcessingIO 单元用作渲染端。它不会触发回声消除。所以唯一的选择是使用 VoiceProcessingIO 单元作为捕获,使用 RemoteIO 作为渲染。它可能有效,但要小心。如果您碰巧启用了 VoiceProcessingIO 单元的输入和输出端,您可能会听到自己的扬声器或扬声器输出的音量更低。

顺便说一句,所有讨论仅针对 iOS。我没有机会玩 Mac。

所以,是的,如果我们真的这样做,看起来没有保证的行为,最后的希望是遵循 Apple 的音频单元托管指南。

我仍然期待更多的人在这里收到您的意见。如果您发现任何新内容,请告诉我。

关于ios - 在 iOS 中同时使用两个音频单元进行 I/O 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10702329/

相关文章:

ios - 将 AVAudioRecorder 输入转换为浮点缓冲区

avfoundation - CoreAudio 和 AVFoundation 之间的性能

ios - 读取音频文件,执行过滤器(即混响),然后写入音频文件而不在 iOS 上播放

ios - 通过 CMSampleBufferRef 数据传递到音频输出插孔

objective-c - 将包含 NSString 的 NSArray 转换为 NSString

javascript - 如何使用 react-native 为 android 创建日期选择器?

ios - 以编程方式滚动对 UIWebView 没有影响

ios - UICollectionViewCompositionalLayout 的背景 View 在哪个方法中出队

ios - 执行从 GameScene 到主菜单的 Segue

ios - Novocaine - 如何循环播放文件? (iOS)