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
相关产品推荐
相关产品推荐

