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

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

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

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


person buildsucceeded    schedule 03.06.2012    source источник


Ответы (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.

person foundry    schedule 07.05.2013
comment
Спасибо за решение - знаете, где в коде я должен это установить? Управляет ли он глобальным уровнем усиления микрофона или только для определенного потока записи? - person David Daudelin; 09.04.2014
comment
@DavidDaudelin - он устанавливает уровни усиления микрофона для вашего приложения, и настройки остаются в силе в течение всего времени выполнения вашего приложения до тех пор, пока вы их не измените. Подходящими местами для их установки могут быть делегат приложения или init метод контроллера. Обычно я создаю объект audioController и настраиваю там audioSession. Поведение вашего приложения в фоновом режиме зависит от ваших настроек и настроек других приложений, которые могут конкурировать за контроль оборудования. - person foundry; 10.04.2014
comment
Я знаю, прошло много времени с тех пор, как на этот вопрос дан ответ, но мне нужна очень большая помощь. Мне нужно увеличить громкость микрофона, чтобы звук во время записи был лучше. в то время как микрофон симулятора получает достаточный объем входных данных, устройство iphone получает входной звук очень низким уровнем. Это создает для нас проблему. на мой вопрос: может ли увеличение усиления решить эту проблему? . Я пробовал ваш код, но isInputGainSettable возвращает false. Но каким-то образом я могу установить входное усиление с помощью метода setInputGain. почему эти двое из них противоречат друг другу. любая идея? Спасибо - person smoothumut; 31.12.2014
comment
Хорошо, это решает мою проблему, большое спасибо, теперь я действительно счастлив :) - person smoothumut; 31.12.2014
comment
@smoothumut Как ты это исправил? такая же проблема .. - person Teja Konjeti; 30.06.2020
comment
@TejaKonjeti Прошло очень много времени, не помню, как решил проблему. простите за это. - person smoothumut; 01.07.2020
comment
@smoothumut Ничего страшного :) 5 лет - большой срок ???? - person Teja Konjeti; 01.07.2020

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

person Jeremy Grenier    schedule 03.06.2012
comment
Хорошая статья, но в ней описывается только программная обработка аудиопотока, что, как я уже упоминал, я уже делаю. - person buildsucceeded; 03.06.2012
comment
Ответы только по ссылкам не особенно полезны, а ссылки имеют тенденцию умирать, делая ответ совершенно бесполезным. - person nhgrif; 05.02.2014