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

iOS15下AVAudioPlayerNode连接mainMixerNode报错-10878如何解决

根因说明

throwing -10878对应音频底层的kAudioUnitErr_Uninitialized错误,iOS15对AVAudioEngine启动前的音频会话校验、节点数据准备逻辑的严谨度远高于iOS14,原有代码缺少前置音频会话配置、也没有提前给播放器节点调度音频数据,导致引擎启动时底层音频单元反复初始化失败,既打印冗余错误日志,也拉长了初始化耗时。

修复方案

按以下步骤调整代码即可解决问题:

  • 初始化音频引擎前,先配置并激活AVAudioSession,匹配当前业务的音频使用场景
  • 完成节点连接后,提前给AVAudioPlayerNode调度待播放的音频数据,不要等引擎启动后再等待节点拉取
  • 调整启动顺序:先调度音频数据,再启动引擎,最后调用节点的play方法

修复后完整代码示例

import AVFoundation

class MyAudio {
    let audioEngine: AVAudioEngine
    let audioFile: AVAudioFile
    let playerNode: AVAudioPlayerNode

    init() {
        // 配置音频会话,可根据业务需求调整category、mode、options参数
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(.playback, mode: .default)
            try audioSession.setActive(true)
        } catch {
            print("音频会话配置失败: \(error.localizedDescription)")
        }
        
        // 原有资源初始化逻辑
        audioFile = try! AVAudioFile(forReading: Bundle.main.url(forResource: "sound", withExtension: "mp3")!)
        audioEngine = AVAudioEngine()
        playerNode = AVAudioPlayerNode()
        audioEngine.attach(playerNode)
        audioEngine.connect(playerNode, to: audioEngine.mainMixerNode, format: audioFile.processingFormat)
        
        // 提前调度音频文件到播放器节点
        playerNode.scheduleFile(audioFile, at: nil)

        do {
            try audioEngine.start()
            playerNode.play()
        } catch {
            print(error.localizedDescription)
        }
    }
}
额外说明

如果业务需要循环播放音频,只需在scheduleFile方法的回调中重新触发调度即可,不会影响本次修复的效果。调整完成后错误日志会完全消失,初始化耗时会恢复到和iOS14相近的水平。

内容的提问来源于stack exchange,提问作者user13540254

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:09:01