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

时间:2012-05-22 12:47:22

标签: ios core-audio

我正在研究iOS的VOIP项目并发现了一个奇怪的问题。我的设置如下所示:

  1. Capture end有一个VoiceProcessingIO单元(用于回声消除),具有输出范围,输出总线和输入范围,输入总线已启用。
  2. 渲染结束有一个RemoteIO单元,输出范围,输出总线已启用。
  3. 到目前为止,我没有使用任何音频图。

    当我开始录制语音时,我注意到上面的设置导致输出语音非常低,直到我关闭VoiceProcessingIO的输出范围,输出总线。虽然这听起来像是我的代码中的一个错误(设置了错误的IO总线),但是为什么捕获结束的更改会影响渲染结束仍然没有意义。

    从developer.apple.com阅读iOS音频单元托管指南后,我注意到它多次提到每个设计模式应该只包含一个I / O音频单元。我想知道这是强制性的,还是只是可选的。保持我的代码有两个音频单元是否安全?

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

    谢谢, 福州

3 个答案:

答案 0 :(得分:1)

好吧,我好像在问一个角落问题。无论如何,我想我到目前为止基于我的实验有一些想法:

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

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

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

  4. BTW,所有讨论仅适用于iOS。我没有机会和Mac一起玩。

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

    我仍然期待更多人在这里投入你的意见。如果您发现任何新消息,请告诉我。

答案 1 :(得分:0)

好吧,我似乎遇到了同样的问题,我也为我的应用程序使用了两个音频单元,处理IO记录和远程播放,我发现输出音量下降。

从你的提示:“如果您碰巧启用了VoiceProcessingIO单元的输入和输出端,您可能会听到自己扬声器或扬声器的音量输出更低。”,现在我尝试禁用进动IO的输出像这样:

flag = 0;
status = AudioUnitSetProperty(_recordAudioUnit,
                              kAudioOutputUnitProperty_EnableIO,
                              kAudioUnitScope_Output,
                              kOutputBus,
                              &flag,
                              sizeof(flag));

是的,最终我得到了更大的渲染量,但是另一个问题发生了,这是记录不再有效。

我不知道您是否遇到这样的问题,所以希望尽快看到您的更新。

答案 2 :(得分:0)

AUGraph有一个错误代码

kAUGraphErr_OutputNodeErr                 AUGraphs只能包含一个OutputUnit。                 如果尝试添加第二个输出单元,则会返回此错误                 或者在图表运行时删除图表的输出单位

AUGraph.h,第106行