AVAudioRecorder averagePowerForChannel返回无效值

时间:2016-10-25 06:49:03

标签: ios objective-c iphone ipad avaudiorecorder

我最近收到了一些用户的抱怨:当他们在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指数)函数平衡,但应该是吗? 我在配置上有什么遗漏,所以我得到了这么高的平均功率值吗?

由于

0 个答案:

没有答案