Objective-C:iPhone 12 Pro Max麦克风遇强噪音自动调节能否禁用?
解决AVAudioRecorder分贝值自动调节问题
这个问题源于iPhone 12 Pro Max等新机型默认启用了麦克风自动增益控制(AGC),导致音频电平测量的基准会随环境噪音动态变化。可以通过配置AVAudioSession的模式来禁用该自动调节功能:
核心解决方案
- 将AVAudioSession设置为
measurement模式,该模式会自动关闭系统的自动增益控制与降噪功能,确保音频电平测量的基准稳定 - 确保AVAudioRecorder启用计量功能(
isMeteringEnabled = true),才能正常获取averagePowerForChannel数值
示例代码
配置音频会话
import AVFoundation let audioSession = AVAudioSession.sharedInstance() do { // 设置类别为playAndRecord,模式指定为measurement try audioSession.setCategory(.playAndRecord, mode: .measurement, options: []) try audioSession.setActive(true) } catch { print("音频会话配置失败: \(error.localizedDescription)") }
初始化AVAudioRecorder
// 创建临时存储路径(可替换为自定义路径) let tempDir = NSTemporaryDirectory() let tempFileURL = URL(fileURLWithPath: tempDir).appendingPathComponent("temp_recording.caf") // 配置录音参数,使用线性PCM格式保证测量精度 let recorderSettings: [String: Any] = [ AVFormatIDKey: Int(kAudioFormatLinearPCM), AVSampleRateKey: 44100.0, AVNumberOfChannelsKey: 1, AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue ] do { let recorder = try AVAudioRecorder(url: tempFileURL, settings: recorderSettings) recorder.isMeteringEnabled = true // 必须启用计量才能获取电平值 recorder.record() // 定时更新并打印电平值 Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in recorder.updateMeters() let currentPower = recorder.averagePower(forChannel: 0) print("当前分贝值: \(currentPower)") } } catch { print("录音机初始化失败: \(error.localizedDescription)") }
补充说明
measurement模式是苹果专为音频测量场景设计的,会屏蔽所有系统层面的音频增益自动调节逻辑,确保测量基准一致- iPhone 8等旧机型因硬件或系统版本差异,默认未启用这类强自动调节机制,因此不会出现基准偏移问题
- 需在Info.plist中添加
NSMicrophoneUsageDescription字段,申请麦克风权限后才能正常使用录音功能
内容的提问来源于stack exchange,提问作者user3335999
相关产品推荐
相关产品推荐

