我最近收到了一些用户的抱怨:当他们在iOS 10下录制时,麦克风“太敏感”并且“显着失真”。麦克风在其他应用程序和旧操作系统版本下运行良好。
首先,我用AudioQueueRef
替换了“旧”核心AVAudioRecorder
解决方案。这没有用,所以我试图深入研究这个问题并发现了一个有趣的行为:-[AVAudioRecorder averagePowerForChannel:]
方法在静默环境中至少返回-52db。如果我开始刮擦麦克风周围的框架(或吹入),则此值达到+ 25db!
虽然Apple Docs说:
返回值
录制声音的当前平均功率(以分贝为单位)。 返回值0 dB表示满量程或最大功率;一个 返回值-160 dB表示最小功率(即接近 沉默)。
如果提供给录音机的信号超过±满量程,那么 返回值可能超过0(也就是说,它可能会输入正数 范围内)。
static const CGFloat kSilenceDBValue = -160.0; // based on the documentation of -[AVAudioRecorder averagePowerForChannel]
for (NSUInteger i = 0; i < ASAudioRecorderNumberOfChannels; ++i) {
const CGFloat averageLevel = (CGFloat)[self.recorder averagePowerForChannel:i];
const CGFloat peakLevel = (CGFloat)[self.recorder peakPowerForChannel:i];
// Assert fires if stressing the mic
NSAssert1(kSilenceDBValue <= averageLevel && averageLevel <= 0.0, @"Average level has invalid value: %@", @(averageLevel));
NSAssert1(kSilenceDBValue <= peakLevel && peakLevel <= 0.0, @"Peak level has invalid value: %@", @(peakLevel));
...
}
我还设置了demo project here。
值本身可以用(n指数)函数平衡,但应该是吗? 我在配置上有什么遗漏,所以我得到了这么高的平均功率值吗?
由于