You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AVAudioEngine为主混音节点安装Tap时触发执行断点崩溃问题求助

AVAudioEngine为主混音节点安装Tap时触发执行断点崩溃问题求助

我目前正在开发一款音频可视化应用,基于MediaPlayer和AVAudioEngine实现用户音乐库文件的播放功能——打算先把音乐播放逻辑跑通,再着手做可视化部分。

但现在遇到了一个棘手的问题:在配置好播放引擎后,APP毫无征兆地因为EXC_BREAKPOINT (code=1)崩溃了。我知道这个错误通常是解包nil值导致的,但我已经用guard语句处理了所有可选值,应该不是这个原因。经过反复排查,我确定崩溃触发在installTap的调用上——哪怕我把processAudioBuffer函数整个删掉,还是会出现同样的崩溃。

补充下环境信息:测试设备运行的是iOS 26 beta 3,而我的APP最低支持iOS 18及以上。

下面是我的相关代码:

setupAudioEngine 函数

private func setupAudioEngine() {
    do {
        try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print("Audio session error: \(error)")
    }
    
    engine = AVAudioEngine()
    guard let engine else { return }
    _ = engine.mainMixerNode
}

play 函数

func play(_ mediaItem: MPMediaItem) {
    guard let url = mediaItem.assetURL else {
        print("No asset URL for media item")
        return
    }
    
    player = AVAudioPlayerNode()
    guard let engine, let player else { return }
    
    do {
        audioFile = try AVAudioFile(forReading: url)
        guard let audioFile else {
            print("Failed to create audio file")
            return
        }
        
        engine.attach(player)
        engine.connect(player, to: engine.mainMixerNode, format: audioFile.processingFormat)
        
        duration = Double(audioFile.length) / audioFile.fileFormat.sampleRate
        
        engine.prepare()
        if !engine.isRunning {
            try engine.start()
        }
        
        player.scheduleFile(audioFile, at: nil)
        
        DispatchQueue.main.async { [weak self] in
            self?.isPlaying = true
            self?.startDisplayLink()
        }
    } catch {
        print("Error playing audio: \(error)")
        DispatchQueue.main.async { [weak self] in
            self?.isPlaying = false
            self?.stopDisplayLink()
        }
    }
    
    engine.mainMixerNode.installTap(onBus: 0, bufferSize: 1024, format: engine.mainMixerNode.outputFormat(forBus: 0)) { [weak self] buffer, _ in
        self?.processAudioBuffer(buffer)
    }
    
    player.play()
}

有没有大佬能帮我分析下崩溃的原因?我实在找不到问题所在了😭


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 12:28:09