【问题标题】:Swift AVAudioEngine crash: player started when in a disconnected stateSwift AVAudioEngine 崩溃:播放器在断开连接状态下启动
【发布时间】:2014-11-10 23:38:42
【问题描述】:

所以我下面的代码应该一遍又一遍地重播 chimes.wav 文件,音调更高,但由于底部的错误而崩溃。谁能找到导致此错误的原因?

import UIKit
import AVFoundation
class aboutViewController: UIViewController {


    var audioEngine: AVAudioEngine = AVAudioEngine()
    var audioFilePlayer: AVAudioPlayerNode = AVAudioPlayerNode()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.



        var timePitch = AVAudioUnitTimePitch()
        timePitch.pitch = 2000
        let filePath: String = NSBundle.mainBundle().pathForResource("chimes", ofType: "wav")!
        let fileURL: NSURL = NSURL(fileURLWithPath: filePath)!
        let audioFile = AVAudioFile(forReading: fileURL, error: nil)
        let audioFormat = audioFile.processingFormat
        let audioFrameCount = UInt32(audioFile.length)
        let audioFileBuffer = AVAudioPCMBuffer(PCMFormat: audioFormat, frameCapacity: audioFrameCount)
        audioFile.readIntoBuffer(audioFileBuffer, error: nil)

        var mainMixer = audioEngine.mainMixerNode
        audioEngine.attachNode(audioFilePlayer)
        audioEngine.attachNode(timePitch)
        audioEngine.connect(audioFilePlayer, to:mainMixer, format: audioFileBuffer.format)
        audioEngine.connect(timePitch, to: audioEngine.outputNode, format: audioFile.processingFormat)


        audioEngine.startAndReturnError(nil)

        audioFilePlayer.play()

        audioFilePlayer.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
        audioFilePlayer.scheduleBuffer(audioFileBuffer, atTime: nil, options:.Loops, completionHandler: nil)

    }

2014-11-10 18:34:37.746 windChimes[2350:108235] **** 由于未捕获的异常“com.apple.coreaudio.avfaudio”而终止应用程序,原因:“播放器在断开连接状态下启动” **** 首先抛出调用堆栈: (0x185f01e48 0x1965f40e4 0x185f01d08 0x1848726c0 0x18489a33c 0x18489975c 0x10009e638 0x10009e858 0x18a6b0e84 0x18a6b0b94 0x18a853ad4 0x18a765310 0x18a7650dc 0x18a76505c 0x18a6ada2c 0x18a005994 0x18a000564 0x18a000408 0x189fffc08 0x189fff98c 0x189ff93bc 0x185eba14c 0x185eb70d8 0x185eb74b8 0x185de51f4 0x18ef7b5a4 0x18a716784 0x1000a54f8 0x1000a5538 0x196c62a08) libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)

【问题讨论】:

  • 我也有这个问题,过去4个小时试图修复它,但没有成功。我尝试了各种组合、执行顺序、连接方式以及与其他音频节点的连接,但这条消息仍然存在。我现在将求助于其他东西来播放音频缓冲区。

标签: ios swift core-audio


【解决方案1】:

语句:“player started when a disconnected state”表示连接链有问题。这意味着要么节点未附加到引擎,要么节点未正确链接在一起。因为 audioFilePlayer 和 timePitch 节点都已附加,所以我的印象是这两条线有问题:

audioEngine.connect(audioFilePlayer, to:mainMixer, format: audioFileBuffer.format)
audioEngine.connect(timePitch, to: audioEngine.outputNode, format: audioFile.processingFormat)

连接应该将所有组件链接在一起:

audioFilePlayer -> timePitch -> audioEngine.mainMixerNode(或 outputNode)

所以连接应该是这样的:

audioEngine.connect(audioFilePlayer, to:timePitch, format: audioFile.processingFormat)
audioEngine.connect(timePitch, to: audioEngine.outputNode, format: audioFile.processingFormat)

我希望这会有所帮助。

【讨论】:

  • 太棒了!我已将播放器连接到主混音器,并得到了同样的错误。我将播放器重新连接到引擎输出节点并缩放!它奏效了。
【解决方案2】:

如果您将多个AVAudioPlayerNode 连接到仅接受一个输入的节点,也会发生此错误。

例如:

let playerOne = AVAudioPlayerNode()
let playerTwo = AVAudioPlayerNode()
let reverbEffect = AVAudioUnitReverb()

engine.attach(playerOne)
engine.attach(playerTwo)
engine.attach(reverbEffect)

engine.connect(playerOne, to: reverbEffect, format: format)
engine.connect(playerTwo, to: reverbEffect, format: format)
engine.connect(reverbEffect, to: engine.outputNode, format: format)

如果您尝试使用 playerOne 播放音频,现在将引发错误,因为它不再连接到任何节点(当我们调用 engine.connect(playerTwo, to: reverbEffect, format: format) 时,它的输出已隐式断开)

修复很简单;将您的两个播放器节点连接到AVAudioMixerNode

let playerOne = AVAudioPlayerNode()
let playerTwo = AVAudioPlayerNode()
let mixer = AVAudioMixerNode()
let reverbEffect = AVAudioUnitReverb()

engine.attach(playerOne)
engine.attach(playerTwo)
engine.attach(mixer)
engine.attach(reverbEffect)

engine.connect(playerOne, to: mixer, format: format)
engine.connect(playerTwo, to: mixer, format: format)
engine.connect(mixer, to: reverbEffect, format: format)
engine.connect(reverbEffect, to: engine.outputNode, format: format)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多