如何在iPhone上控制硬件麦克风输入增益/电平?

bui*_*ded 8 core-audio ios remoteio

我的音频分析功能在iPad(2)上比iPhone(4)响应更好.它似乎对iPad上较柔和的声音很敏感,而iPhone需要更响亮的输入才能正确响应.无论这是因为麦克风放置,不同的组件,不同的软件配置或其他因素,我希望能够在我的应用程序中控制它.

显然,我可以将所有音频样本相乘以编程方式应用增益.当然那也有软件成本,所以:

是否可以通过iOS中的软件控制麦克风的增益,与MacOS中的相似?我找不到任何关于此的文档,但我希望我能以某种方式错过它.

fou*_*dry 17

在ios6 +上,您可以使用AVAudioSession属性

        CGFloat gain = sender.value;
        NSError* error;
        self.audioSession = [AVAudioSession sharedInstance];
        if (self.audioSession.isInputGainSettable) {
            BOOL success = [self.audioSession setInputGain:gain 
                                                     error:&error];
               if (!success){} //error handling
        } else {
            NSLog(@"ios6 - cannot set input gain");
        }               
Run Code Online (Sandbox Code Playgroud)

在ios5上,您可以使用AudioSession功能获取/设置音频输入增益属性

    UInt32 ui32propSize = sizeof(UInt32);
    UInt32 f32propSize = sizeof(Float32);
    UInt32 inputGainAvailable = 0;
    Float32 inputGain = sender.value;


    OSStatus err = 
        AudioSessionGetProperty(kAudioSessionProperty_InputGainAvailable
                            , &ui32propSize
                            , &inputGainAvailable);

    if (inputGainAvailable) {
    OSStatus err = 
        AudioSessionSetProperty(kAudioSessionProperty_InputGainScalar
                             , sizeof(inputGain)
                             , &inputGain);
    } else {
        NSLog(@"ios5 - cannot set input gain");
    }
    OSStatus err = 
        AudioSessionGetProperty(kAudioSessionProperty_InputGainScalar
                              , &f32propSize
                              , &inputGain);
    NSLog(@"inputGain: %0.2f",inputGain);
Run Code Online (Sandbox Code Playgroud)

(错误处理省略)

由于您对控制输入增益感兴趣,您可能还希望通过将音频会话模式设置为AVAudioSessionModeMeasurement(ios5 + 6)来禁用自动增益控制

[self.audioSession setMode:AVAudioSessionModeMeasurement
                     error:nil];
NSLog(@"mode:%@",self.audioSession.mode);
Run Code Online (Sandbox Code Playgroud)

这些设置是相当硬件特定的,因此无法假定可用性.例如,我可以改变iPhone3GS/ios6和iPhone4S/ios5.1上的增益,但不能改变ipadMini/ios6.1上的增益.我可以在iPhone3G和iPad mini上禁用AGC,但不能在iPhone4S上禁用AGC.

  • @DavidDaudelin - 它为您的应用设置麦克风增益级别,并且设置保留在应用程序的整个运行时间中,直到/除非您更改它们.设置它们的合适位置是app委托或控制器的`init`方法.我通常会创建一个audioController对象并在那里设置audioSession.应用程序后台运行时的行为取决于您的设置以及可能竞争硬件控制的其他应用程序的设置. (2认同)