iOS开发求助:AirPods蓝牙麦克风录音及语音识别崩溃问题
解决AirPods蓝牙麦克风录音时的采样率不匹配崩溃问题
这是蓝牙音频设备和音频引擎采样率不匹配导致的典型问题——内置麦克风的采样率和AirPods的采样率不一致,你代码里提前获取了inputNode的格式,之后切换蓝牙音频会话时,这个格式就和实际蓝牙设备的格式不兼容了,直接触发崩溃。
先看报错的核心原因:
*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: format.sampleRate == hwFormat.sampleRate'
这个错误直白告诉你:你传给录音Tap的格式(recordingFormat)和硬件实际的蓝牙麦克风格式,采样率完全不匹配。内置麦能正常工作,是因为你提前获取的格式刚好匹配内置麦的采样率,但切换到蓝牙后就失效了。
修复步骤和代码示例
核心思路是:先正确配置并激活蓝牙音频会话,再获取当前输入设备的实际格式,而不是提前获取inputNode的格式。
修改后的代码如下:
// 1. 先请求语音权限 askSpeechPermission() // 2. 配置音频会话,处理蓝牙输入 do { let session = AVAudioSession.sharedInstance() // 设置录音类别,允许蓝牙输入 try session.setCategory(.record, mode: .default, options: .allowBluetooth) // 必须激活会话,系统才会切换到蓝牙输入设备 try session.activate() // 3. 激活会话后,再获取当前输入节点的实际格式 let audioEngine = AVAudioEngine() let inputNode = audioEngine.inputNode // 这里获取的格式是当前激活的蓝牙设备的格式,采样率完全匹配 let recordingFormat = inputNode.outputFormat(forBus: 0) // 4. 初始化语音识别请求 let request = SFSpeechAudioBufferRecognitionRequest() // 5. 安装录音Tap,使用正确的格式 inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, time in request.append(buffer) } // 启动音频引擎(你原代码可能遗漏了这一步) try audioEngine.start() } catch { // 不要空catch,打印错误方便调试 print("音频会话配置失败:\(error.localizedDescription)") }
关键注意点
- 激活会话的时机:必须在设置类别后激活会话,这样系统才会切换到蓝牙输入设备,此时获取的inputNode格式才是蓝牙设备的正确格式。
- 不要忽略错误:空catch会掩盖配置过程中的问题,比如蓝牙设备未连接、权限不足等,一定要打印或处理错误信息。
- 设备切换处理:如果用户在录音过程中切换设备(比如从AirPods切回内置麦),你需要重新配置音频会话和inputNode的Tap,否则会再次出现格式不匹配的问题。
内容的提问来源于stack exchange,提问作者Viper8
相关产品推荐
相关产品推荐

