音频套件 (iOS)我真的可以在硬件级别设置麦克风增益吗?

问题描述

我是这一切(Xcode、AudioKit)的新手,但我想创建一个能够录制非常响亮的音频(例如,原声鼓)的应用程序。问题是我需要能够将麦克风的增益调低,可能会显着降低。也就是说,仅对接收到的样本进行某种乘法运算可能还不够,因此我想在硬件级别设置增益。

我意识到 iPhone/iPad 内置麦克风的功能会受到限制;至少有些麦克风会有物理限制,尤其是在较旧/较便宜的型号上。目前我所知道的是,像 GarageBand 这样的应用程序能够在某些设备上设置输入增益。在我的旧 iPad 上使用 GB,我只能在连接了外部麦克风的情况下设置增益(而且效果很好)。我看过一些 YouTube 视频,其中人们使用 GB 来设置内置麦克风的增益。

到目前为止,我已经尝试了各种示例,包括 Xamarin 和 Xcode 的东西。奇怪的是,使用 AVAudioSession.inputGainSettable 在我的 iPad 的内置麦克风上返回 true。奇怪的是,如果范围在 0.7 和 1.0 之间,setInputGain 可以正常工作。任何更低的值都不会产生任何错误,但 inputGain 设置为 0.7。在 0.7 时,与 1.0 时有明显差异,但我仍然不知道幕后发生了什么:实际输入电平是否更低,还是样本“预处理”以降低绝对值?

我在使用 AVFoundation 进行音频捕获时遇到了其他问题。在旧 iPad 上,除了上述增益设置限制外,AVFoundation 音频捕获效果很好,尤其是当我使用外部麦克风时(我可以将增益设置为 0 到 1 之间的任何值,并且录制的音频是我所期望的)。在 iPhone XR 上,inputGainSettable 始终返回 false,即使使用外部麦克风也是如此,并且 setInputGain 始终失败。

所以看起来我需要降到更低的级别。目前这对我来说相当模糊,但我想我可以使用 AudioUnits 和一个混音器,然后在输入上设置增益?这让我想到了 AudioKit。

我正在处理 AudioKit 中的 Recorder 示例。我可以使用 AKBooster 来设置 AKNode 实例的增益。但是我不清楚是要在 AKMicrophone 还是 AKmixer(例如由 AKStereoFieldLimiter 创建的实例)上设置增益。它们似乎具有相同的效果。结果是我的输入电平较低,但仍有削波。所以我的问题是:这真的是在硬件级别设置麦克风的增益(我所看到的只是内部麦克风的物理限制),还是我不明白在混音器中正确使用 AKNode?

如果答案是“无法调低增益以录制原声鼓”,那么您认为 GarageBand 之类的东西是如何做到的?

谢谢!

解决方法

好的,学到了一些东西和一个谜......

首先,当我说我无法在旧 iPad 上的 GarageBand 中设置“输入”级别(增益)时,我错了。我可以,但范围是 0.7 到 1.0。稍后会详细介绍...

我一直在试验 AudioKit Recorder 示例项目。据我所知,以下对在硬件级别实际设置麦克风增益没有影响:

let mic = AKMicrophone()
mic.volume = volumeSetting

还有……

let mic = AKMicrophone()
let gainedMic = AKBooster(mic)
gainedMic.gain = gainSetting

虽然我不确定这一点,但似乎 AKMicrophone.volume 和 AKBooster.gain 之间存在相关性。所以假设我有这个:

let mic = AKMicrophone()
let gainedMic = AKBooster(mic)

如果我这样做...

mic.volume = 5.0
gainedMic.gain = 1.0

输出似乎与我这样做一样:

mic.volume = 10.0
gainedMic.gain = 0.5

所以看起来(除非我在这里遗漏了一些东西)AKMicrophone.volumeAKBooster.gain 不会成为我能够用来调整麦克风增益的东西,所以我可以录制原声鼓。然而,我没有得到的是,如果我使用外部麦克风,为什么我可以使用我修改过的 Recorder 示例应用程序并使用 AKMicrophone 和/或 AKBooster 并获得我的原声鼓的良好录音?我期待它剪辑。然后我意识到,如果我将 AKBooster 增益设置为 1.0,将 AKMicrophone 设置为 10,输出会发生削波,但没有我预期的那么多。

然后我看了一下AKSettings.session.inputGain。 AKSettings.session 是 AVAudioSession 的瘦包装器。在我修改后的 Recorder 应用程序中,我设置了麦克风和混音器,但没有设置 AKMicrophone.volume 和 AKBooster.gain。然后我检查了 AKSettings.session.inputGain。在旧 iPad 上,我的内置麦克风为 0.75。当我连接外部麦克风并启动修改后的 Recorder 应用程序时,AKSettings.session.inputGain 值会发生变化。 inputGain 设置似乎是最后通过 AVAudioSession.setInputGain() 设置的任何内容。也就是说,如果我加载 GB,将 mic "input" 设置为 max,卸载 GB,加载 Recorder,则 AKSettings.session.inputGain 为 1.0。

这里真正奇怪的是,如果我在非 AudioKit 示例应用程序或 GB 中通过 AVAudioSession.setInputGain() 设置麦克风增益,然后关闭 iPad,再次启动 iPad,然后启动修改后的 Recorder 应用程序,AKSettings.session.inputGain 报告关闭前其他应用程序设置的最后一个增益。什么是节省这个硬件增益值? iPad?外接麦克风(蓝色雪球)?

事实证明,在我使用外部麦克风和修改后的 Recorder 应用程序进行测试期间,我没有得到任何削波,因为 AKSettings.session.inputGain 在测试期间大约为 0.2。 “AVAudioSession.h”中的注释指出,如果有默认值,iOS 设备会将 AKSettings.session.inputGain 设置为麦克风的默认值,但有些麦克风没有默认值。所以我想要么我的 Blue Snowball 要么没有默认增益值,要么将默认值定义为它收到的最后一个增益 AVAudioSession.setInputGain()。

无论如何,我很惊讶我找不到关于 AKMicrophone.volume 和 AKBooster.gain 的任何讨论,尤其是在处理外部麦克风时。对于内置麦克风,在我的小型测试场景(麦克风增益范围为 0.7 和 1.0 的旧 iPad 和无法更改增益的 iPhone XR)中,我有两台性能略有不同的设备。这是因为底层硬件是这样的,对于 iPad,我首先使用增益设置为 0.75 的内置麦克风和将麦克风增益设置为 1.0 的 iPhone。因此,如果我正在使用 AudioKit 开发语音录制应用程序,那么我的应用程序的起点很可能会设置为使 iPad 具有适当的录音电平并在 iPhone 上出现剪辑问题,或者它会是正确的对于 iPhone,但对于 iPad 来说太安静了。至于外置麦克风,怎么没人提过在不同的 iOS 设备上使用不同的外置麦克风会产生截然不同的体验?

我想我可能又回到了我仍然遗漏了 AudioKit 中一些重要的东西的地步,因为它与 AKMicrophone.volume、AKBooster.gain 和 AKSettings.session.inputGain 相关。有人可以对此有所了解吗?谢谢!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...