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