先播放AVPlayer视频再用AudioKit录音时应用崩溃问题
解决AVPlayer与AudioKit共存时的录音崩溃问题
这个问题我之前做项目时也碰到过,本质是AVPlayer和AudioKit的音频会话配置冲突导致的。AVPlayer播放视频时会抢占系统音频会话,还可能悄悄修改采样率相关设置,等你切换到录音页面时,音频输入总线的采样率变成了0,直接触发AKNodeRecorder崩溃。下面是几个经过验证的解决办法:
1. 切换到录音页面前,重置并明确配置音频会话
进入录音页面的第一时间,先重新初始化AVAudioSession,强制设置采样率,确保AudioKit能拿到合法的输入参数。代码示例:
func setupAudioSessionForRecording() { do { let session = AVAudioSession.sharedInstance() // 设置会话类别为播放+录音,按需调整options try session.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetooth]) // 强制设置采样率,和AudioKit保持一致 try session.setPreferredSampleRate(44100.0) try session.setActive(true) // 同步AudioKit的采样率设置 AKSettings.sampleRate = 44100.0 } catch let error { print("音频会话配置失败: \(error.localizedDescription)") } }
注意要在AudioKit引擎启动前完成这个操作。
2. 离开视频页面时,释放AVPlayer的音频会话资源
从视频页跳转到录音页前,先暂停AVPlayer并让音频会话失活,避免它占用资源:
func cleanupAVPlayerAudio() { avPlayer.pause() avPlayer.replaceCurrentItem(with: nil) // 可选,彻底释放资源 do { try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) } catch { print("释放音频会话失败: \(error)") } }
3. 延迟AudioKit的初始化时机
不要在页面初始化时就启动AudioKit,建议在viewDidAppear里完成音频会话配置后再启动引擎,确保系统音频资源已经准备好:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) setupAudioSessionForRecording() startAudioKitEngine() } func startAudioKitEngine() { let microphone = AKMicrophone() // 配置你的AudioKit节点链... do { try AudioKit.start() // 初始化AKNodeRecorder let recordingFile = try AKAudioFile() let recorder = try AKNodeRecorder(node: microphone, file: recordingFile) } catch { print("AudioKit启动或录音器初始化失败: \(error)") } }
4. 提前检查输入采样率合法性
崩溃日志里的input bus 0 sample rate is 0说明AudioKit无法获取有效采样率,在初始化录音器前可以加一层校验:
guard let inputFormat = AKMicrophone.inputNode.inputFormat(forBus: 0), inputFormat.sampleRate > 0 else { print("输入设备采样率无效,无法启动录音") return } // 确认采样率合法后再初始化录音器 let recorder = try AKNodeRecorder(node: microphone, file: recordingFile)
核心思路就是避免两个音频模块抢占资源,明确各自的音频会话配置优先级,确保AudioKit启动时能拿到干净、合法的音频输入环境。
内容的提问来源于stack exchange,提问作者torof
相关产品推荐
相关产品推荐

