在Swift中使用AudioEngine重复声音时发生碰撞

在Swift中使用AudioEngine重复声音时发生碰撞,swift,avaudioengine,Swift,Avaudioengine,我试着播放不同效果的声音。在上一个viewController中,我录制了一个声音,然后在下一个屏幕中,可以播放效果。第一次工作正常,但第二次崩溃,错误如下: 2015-08-07 13:00:45.900音高完美[9643:1121173]13:00:45.900 错误:AVAudioEngine.mm:253:AttachNode:所需条件为 错:!nodeimpl->HasEngineImpl()2015-08-07 13:00:45.953节距 完美[9643:1121173]由于未捕获

我试着播放不同效果的声音。在上一个viewController中,我录制了一个声音,然后在下一个屏幕中,可以播放效果。第一次工作正常,但第二次崩溃,错误如下:

2015-08-07 13:00:45.900音高完美[9643:1121173]13:00:45.900 错误:AVAudioEngine.mm:253:AttachNode:所需条件为 错:!nodeimpl->HasEngineImpl()2015-08-07 13:00:45.953节距 完美[9643:1121173]由于未捕获异常而终止应用程序 'com.apple.coreaudio.avfaudio',原因:'所需条件为假: !nodeimpl->HasEngineImpl()

有人知道它为什么会崩溃吗?我研究了AVAudioEngine、AVAudioPlayer和AVAudioPlayerNode类,但没有结果


谢谢

看起来您在播放可变音高效果后正在重置发动机

func soundEnded() {
    stopButton.hidden=true
    disabledButton.enabled=true;
    if(audioEngine.running) {
        audioEngine.stop()
        audioEngine.reset();
    }
}

audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: soundEnded)
audioEngine.startAndReturnError(nil)
stopButton.hidden=false
stopButton.enabled=true
audioPlayerNode.play()

因此,在添加节点并链接链的情况下,没有再次设置引擎。当您尝试播放playerNode时,它会崩溃。

最后,崩溃是由初始化viewDidLoad函数中的audioPlayerNode和audioEngine对象引起的。显然,它们需要在每次使用时实例化,或者在停止并重置之后实例化。
将这些行直接放在playAudioWithVariablePitch函数的开头,而不是放在viewDidLoad函数中,解决了崩溃问题。我仍然对音调、混响和回声的播放有问题。他们在到期前就被剪掉了,我仍然不知道为什么。这与audioPlayerNode.scheduleFile方法的completionHandler有关。

我知道这是一个老问题,但我没有看到上面的正确答案

它崩溃的原因实际上已在错误消息中概述:

AttachNode:所需条件为false:!nodeimpl->HasEngineImpl()

换句话说,在附加节点时,必须确保该节点尚未附加到引擎(
!nodeimpl->HasEngineImpl()


解决方案是在尝试再次添加节点之前,使用audioEngine.detachNode删除该节点。

在我的情况下,我的计时器一次又一次地调用,并且该代码被写入计时器中

self.recognitionTask?.finish()
node.removeTap(onBus: 0)
self.request.endAudio()

self.recognitionTask = nil
//Maybe this line was causing the issue
self.audioEngine.stop()
因此,如果您已经停止请求,卸下水龙头并停止发动机,则不应再次调用这些线路


希望这对某些人有所帮助

在注释了所有autoEngine.reset()行之后,它仍然会崩溃。
self.recognitionTask?.finish()
node.removeTap(onBus: 0)
self.request.endAudio()

self.recognitionTask = nil
//Maybe this line was causing the issue
self.audioEngine.stop()