【问题标题】:How do I avoid the following error: AVAudioEngineGraph required condition is false: NULL != tap如何避免以下错误:AVAudioEngineGraph required condition is false: NULL != tap
【发布时间】:2017-09-28 10:03:37
【问题描述】:

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

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

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

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

AVAudioEngineGraph.mm:2707:InputAvailable:必需条件为假:NULL != tap

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


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

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

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

【问题讨论】:

  • 我也坚持这个问题。
  • @NileshParmar 我还没有找到解决方案。如果我这样做了,我会更新发布这个问题的答案。
  • 好的,谢谢,请尽快更新。
  • @NileshParmar 和你一样,如果你在我之前找到解决方案的话。谢谢。
  • 你好,你找到解决办法了吗?

标签: ios swift audio avaudioplayer avaudiosession


【解决方案1】:

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

我找到了一些解决方法,但可能还有更好的解决方案。这并不能完全消除问题,自从我做出改变以来,我已经看到过一两次问题,但它肯定会减少它发生的机会。

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

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

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

【讨论】:

  • 好的。我对此有另一种解决方案。我首先安装了TapOnbus,每20秒我重新启动用于调用的计时器继续识别录音。我解决的问题不是 100%,而是 95%。
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2021-06-07
  • 2019-01-02
  • 2018-01-25
  • 2012-10-05
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多