iPhone上的Core Audio - 任何改变麦克风增益的方法(扬声器麦克风或耳机麦克风)?

Posted

技术标签:

【中文标题】iPhone上的Core Audio - 任何改变麦克风增益的方法(扬声器麦克风或耳机麦克风)?【英文标题】:Core Audio on iPhone - any way to change the microphone gain (either for speakerphone mic or headphone mic)? 【发布时间】:2010-05-28 19:07:22 【问题描述】:

经过大量搜索,答案似乎是否定的,但我想在放弃之前我会在这里问一下。对于我正在处理的一个包括录制声音的项目,当路由是外部麦克风 + 扬声器和耳机麦克风 + 耳机时,输入电平听起来有点安静。有谁确切地知道是否可以在 Core Audio 的任何部分以编程方式更改 iPhone 上的麦克风增益级别?

如果不是,是否有可能我并没有真正处于“免提”模式(至少使用外接麦克风),而只是认为我处于“免提”模式?这是我的音频会话初始化代码:

OSStatus error = AudiosessionInitialize(NULL, NULL, audioQueueHelperInterruptionListener, r);

[...some error checking of the OSStatus...]

UInt32 category = kAudioSessionCategory_PlayAndRecord; // need to play out the speaker at full volume too so it is necessary to change default route below
error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
if (error) printf("couldn't set audio category!");

UInt32 doChangeDefaultRoute = 1;
error = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);
if (error) printf("couldn't change default route!");

error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioQueueHelperPropListener, r);
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", (int)error);

UInt32 inputAvailable = 0;
UInt32 size = sizeof(inputAvailable);

error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", (int)error);

error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, audioQueueHelperPropListener, r);
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", (int)error);

error = AudioSessionSetActive(true); 
if (error) printf("AudioSessionSetActive (true) failed");

非常感谢您的任何指点。

【问题讨论】:

How to control hardware mic input gain/level on iPhone?的可能重复 【参考方案1】:

增益是音频单元的一个属性。

我没试过,但是你应该可以做AudioUnitSetProperty并关闭“自动增益控制”或简称AGC这个属性键:kAUVoiceIOProperty_VoiceProcessingEnableAGC

另见kAUVoiceIOProperty_BypassVoiceProcessing

【讨论】:

好的,具体来说 kAUVoiceIOProperty_VoiceProcessingEnableAGC 仅适用于语音处理 I/O 音频单元,但这可能是我的一个选项,谢谢。 只是为了跟进这一点,任何音频单元或音频会话设置本身都没有增益控制。但是,一些音频单元预设会导致更多的感知增益,或者更多的信号和更少的噪音,特别是对于语音应用。【参考方案2】:

增益控制是自动的,平均值始终是被视为“最佳”的水平。您可以通过混音器将输入路由到控制音量,但我认为它可能会剪辑。

这是在 iphone 上开始使用 coreAudio 的好地方

http://www.subfurther.com/blog/?p=507

【讨论】:

有趣,您能否指出有关通过混音器路由的文档/示例代码? 谢谢 - 我在搜索中看到过那篇博文,但我更感兴趣的是关于增益/AGC 的具体示例或文档。 好吧,正如我所说.. 没有办法操纵麦克风增益。但是您可以在播放或录制之前通过将 remoteIO 音频单元连接到 AUGraph 中的混音器音频单元来控制信号的音量,如链接中所述。 明白了,我以为你在谈论一种使用混音器影响增益水平的方法——在采集后推动音量可能对这个应用程序没有好处,因为我希望提高信噪比而不是提高播放音量,但我很欣赏这个建议。【参考方案3】:

对于 iOS 5.0 及更高版本,您现在可以将 AudioSession 模式设置为 kAudioSessionMode_Measurement。

kAudioSessionMode_Measurement

适用于希望将系统提供的信号处理对输入和/或输出音频信号的影响降至最低的应用程序。

您可以像这样在 Core Audio 中设置 AudioSession 模式:

UInt32 mode = kAudioSessionMode_Measurement;
AudioSessionSetProperty(kAudioSessionProperty_Mode, sizeof(mode), &mode)

【讨论】:

这不提供增益控制,尽管它关闭了 AGC。【参考方案4】:

从 iOS 5 开始,您可以按如下方式设置全局模拟输入增益设置

UInt32 uInt32Size = sizeof(UInt32);
UInt32 isGainAvaiable = 0;
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_InputGainAvailable, &uInt32Size, &isGainAvaiable);
if (isGainAvaiable)

    Float32 gainFloat = 0.142857f; //for example...
    status = AudioSessionSetProperty(kAudioSessionProperty_InputGainScalar, sizeof(gainFloat), &gainFloat);

【讨论】:

以上是关于iPhone上的Core Audio - 任何改变麦克风增益的方法(扬声器麦克风或耳机麦克风)?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:音频单元 vs OpenAL vs Core Audio

Core Audio的渲染回调不会改变输出音频[重复]

多个文件播放器上的Core Audio声音测量

使用 Core Audio 从 PCM 原始数据中获取电平值

试图弄清楚 Core Audio 的 NBandEQ

如何使用 Core Audio 设置/获取音量级别?