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

先播放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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:42:53