如何避免以下错误:AVAudioEngineGraph required condition is false: NULL != tap

Log*_*gan 6 audio avaudioplayer ios avaudiosession swift

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

基本上发生的事情是我通过 MultipeerConnectivity 拨打电话。我正在使用 AVAudioEngine 来录制音频并播放来自对等方的音频。

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

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

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

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


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

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

有人对这个问题有经验吗?

Log*_*gan 2

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

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

基本上我所做的是,当我拆除水龙头时,请确保等到它完成后再允许安装水龙头。就我而言,我有一个静音按钮,并且我确保不允许用户触摸按钮的速度快于点击可以删除的速度。因此,一旦触摸按钮,我就不允许按下任何按钮,直到移除水龙头,然后重新激活按钮。

其次,我不确定这是否有任何作用,但在 inputNode 上安装 Tap 之前,我总是先调用 inputNode.reset() ,然后调用 inputNode.removeTap(onBus: 0) ,然后安装 Tap。

inputNode.reset()
inputNode.removeTap(onBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 4096, format: localInputFormat) {
    ...
}
Run Code Online (Sandbox Code Playgroud)