How do I avoid the following error: AVAudioEngineGraph required condition is false: NULL != tap

How do I avoid the following error: AVAudioEngineGraph required condition is false: NULL != tap

我搜索了这个错误,但没有发现任何人有同样的错误。我很确定我知道这个错误意味着什么,但我不知道如何避免它。

基本上发生的事情是我有一个 phone 调用 MultipeerConnectivity。我正在使用 AVAudioEngine 录制音频并播放来自对等方的音频。

我注意到用户说话的时间与其他设备播放该音频所需的时间之间存在相当大的延迟,但我通过移除水龙头并重新安装解决了这个问题它。这完全消除了任何延迟。但是,有时它会引发错误。

我还允许用户将他们的麦克风静音,当他们点击静音时,水龙头被移除。一旦他们点击取消静音,水龙头就会重新安装。有时这也会引发相同的错误:

AVAudioEngineGraph.mm:2707: InputAvailable: 所需条件为 false: NULL != tap

虽然这个错误似乎完全是随机的。有时会发生,有时不会。我无法始终如一地重现错误。


我猜这是因为它试图在已经存在水龙头的地方安装水龙头,但我不知道如何避免它。我想我可以增加安装水龙头的总线,但这似乎不是最佳选择。

我还查看了 AVAudioInputNode 上是否有一个 属性 可以告诉我是否已经在特定总线上安装了分路器,但我似乎没有找到任何分路器。

有人遇到过这个问题吗?

如果您找到更好的解决方案,请告诉我它是什么。这不是一个 100% 完整的解决方案,但它是我能找到的最好的解决方案,因为我在这个问题上得到的帮助很少。

我找到了一些解决方法,但可能还有更好的解决方案。这并不能完全解决问题,自从我进行更改以来,我已经看到过一两次问题,但它确实减少了它发生的可能性。

基本上我所做的是当我取下水龙头时,一定要等到它完成后再安装水龙头。在我的例子中,我有一个静音按钮,我确保不允许用户触摸按钮的速度快于水龙头被移除的速度。因此,只要触摸按钮,我就不允许按下任何按钮,直到移开水龙头,然后重新激活按钮。

其次,我不确定这有什么作用,但在输入节点上安装分路器之前,我总是先调用 inputNode.reset() 然后调用 inputNode.removeTap(onBus: 0)首先,然后安装水龙头。

inputNode.reset()
inputNode.removeTap(onBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 4096, format: localInputFormat) {
    ...
}