iOS应用使用AVAudioRecorder启动录音时出现开头点击杂音问题求助
杂音产生核心原因及修复方案
1. 音频会话配置顺序错误
你当前代码先初始化AVAudioRecorder,再配置AVAudioSession的类别,顺序完全颠倒。音频会话的全局配置必须在创建录音实例前完成,否则录音实例初始化时读取的是旧的会话参数,启动录音时参数发生突变会产生硬件冲击杂音。
2. 缺少预准备录音流程
直接调用record()会让系统同时完成硬件初始化、缓冲区创建、录音启动三个步骤,瞬时的硬件唤醒操作很容易产生咔哒声,提前调用prepareToRecord()可以预加载所有资源,避免启动时的冲击。
3. 音频会话激活时机不合理
你没有手动激活音频会话,依赖系统启动录音时自动激活,会话激活瞬间的音频路由切换也会产生杂音,建议提前手动激活会话。
修正后代码示例
// 第一步:先配置并激活音频会话 let audioSession = AVAudioSession.sharedInstance() do { // 可根据实际需求调整options,不需要混音的话也可以不加,.allowBluetooth是可选,看是否需要支持蓝牙录音 try audioSession.setCategory(.playAndRecord, mode: .default, options: [.mixWithOthers]) try audioSession.setActive(true) } catch { print("音频会话配置失败: \(error)") } // 第二步:定义录音参数,初始化录音器 private var recorderSettings: [String: Any] { [ AVFormatIDKey: NSNumber(value: kAudioFormatMPEG4AAC), AVSampleRateKey: 44100.0, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue ] } do { audioRecorder = try AVAudioRecorder(url: fileUrl, settings: recorderSettings) // 第三步:预准备录音 audioRecorder?.prepareToRecord() audioRecorder?.isMeteringEnabled = true // 第四步:启动录音 audioRecorder?.record() } catch { print("录音器初始化失败: \(error)") } // 后续的计量定时器逻辑保持不变即可 meteringTimer = Timer.scheduledTimer(withTimeInterval: 0.05, repeats: true, block: { (timer) in self.audioRecorder?.updateMeters() self.soundSamples[self.currentSample] = self.audioRecorder?.averagePower(forChannel: 0) ?? 0 self.currentSample = (self.currentSample + 1) % self.numberOfSamples })
额外优化建议
- 如果你的场景不需要边录音边播放音频,直接将音频会话类别改为
.record,减少音频路由切换的开销,能进一步降低杂音出现概率 - 如果仍有杂音,可检查按钮点击时是否有系统自带的点击音效被录入,可临时禁用按钮的交互音效再验证
- 停止录音时,先调用
audioRecorder?.stop(),再延迟100ms左右调用audioSession.setActive(false),避免停止时也出现杂音
内容的提问来源于stack exchange,提问作者Peter Warbo
相关产品推荐
相关产品推荐

