4

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

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

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

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

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

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

谢谢,福州

4

3 回答 3

1

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

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

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

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

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

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

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

于 2012-05-31T04:48:30.097 回答
0

There is an Error code for AUGraph

kAUGraphErr_OutputNodeErr AUGraphs can only contain one OutputUnit. this error is returned if trying to add a second output unit or the graph's output unit is removed while the graph is running

AUGraph.h, line 106

于 2013-08-09T09:19:20.947 回答
0

好吧,看来我遇到了同样的问题,我的应用程序也使用了两个音频单元,处理 IO 进行录制和远程播放,我发现输出音量被压低。

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

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

是的,最后我得到了更大音量的渲染,但发生了另一个问题,那就是录制不再工作。

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

于 2012-12-26T03:36:25.363 回答