Как контролировать аппаратное усиление/уровень микрофона на iPhone?

моя функция аудио-анализа лучше реагирует на iPad (2), чем на iPhone (4). Он кажется чувствительным к более мягким звукам на iPad, в то время как iPhone требует гораздо более громкого ввода для правильной реакции. Будь то из-за размещения микрофона, различных компонентов, различных конфигураций программного обеспечения или какого-то другого фактора, я хотел бы иметь возможность контролировать его в своем приложении.

очевидно, я мог бы просто умножить все мои звуковые образцы, чтобы программно применить усиление. Конечно, что имеет стоимость программного обеспечения тоже, так что:

можно ли контролировать усиление микрофона от программного обеспечения в iOS, аналогично тому, как это происходит в MacOS? Я не могу найти никакой документации по этому поводу, но я надеюсь, что я просто пропустил его как-то.

2 ответов


на 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");
        }               

на 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);

(обработка ошибок опущена)

поскольку вы заинтересованы в управлении входным усилением, вы также можете отключить автоматическую регулировку усиления, установив режим аудио сеанса в AVAudioSessionModeMeasurement (на iOS5+6)

[self.audioSession setMode:AVAudioSessionModeMeasurement
                     error:nil];
NSLog(@"mode:%@",self.audioSession.mode);

эти настройки довольно специфичны для оборудования, поэтому доступность не может быть принята. Например, я могу изменить коэффициент усиления на iPhone3GS/ios6 и iPhone4S / ios5.1, но не на ipadMini / ios6.1. Я могу отключить AGC на iPhone3G и iPad mini, но не iPhone4S.


Я думаю, это может вам помочь:http://www.stefanpopp.de/2011/capture-iphone-microphone/