网络音频:如何使用移动麦克风从远处拾取音频

Web Audio: How can I get a mobile microphone to pick up audio from a distance?

本文关键字:音频 移动 何使用 网络 麦克风      更新时间:2023-09-26

通过navigator.getUserMedia访问用户的麦克风非常容易。但是,如果我正在使用移动浏览器,并且想从远处接收音频,比如使用"扬声器"模式,该怎么办?

我将如何实现这一目标?似乎有一些本地应用程序可以实现这一点,但网络音频呢?

这样做的目的是使用DTMF在设备之间发送消息。我已经用我的笔记本电脑做到了这一点,因为它的麦克风可以从很远的距离记录周围的音频,但我能接触到的任何手机似乎都只在"话筒"附近记录音频,所以我必须把手机放在离源扬声器非常近的地方,哪怕只是一点点收到消息的机会。除非我能让移动麦克风从远处拾取音频,否则这就违背了我的目的。

编辑:我所说的距离是指几英尺以上,而不是几厘米。环境声音,与麦克风旁边的声音相反。

我在这里回答我自己的问题。感谢所有帮忙的人,尽管这里发布的实际答案都不令人满意,IMO.

在较新版本的Chrome上,navigator.mediaDevices有一个名为enumerateDevices的功能,可用于列出可用的硬件设备,包括麦克风。事实证明,这确实在我的安卓手机上返回了一个"扬声器"设备。因此,如果您的设备怀疑扬声器没有设置为默认的浏览器麦克风,并且您(或您的用户)使用的是Chrome 47或更高版本,则可以使用enumerateDevices返回的设备ID来指定特定的麦克风。

因此,如果您的用户在特定麦克风设备的选择元素中选择了一个选项,您将获取该设备的ID并将其传递给getUserMedia

navigator.getUserMedia({ audio: {deviceId: {exact: <insert device uuid here>}} }, callback)

请注意,截至本文发布之时,enumerateDevices API仅在Chrome上可用。在任何其他浏览器或web视图中,这可能都不起作用。

如果麦克风的音量对您的应用程序来说太低,您可以通过为AudioContext创建gainNode来增加音量。

volume     = context.createGain()
volume.gain.value = 3 // raises the volume to 300%
audioInput = context.createMediaStreamSource(e)
audioInput.connect(volume)

或者,如果您处理的是原始样本,您可以将每个样本乘以一个数字,然后将它们传递给用于处理它们的任何函数。

这是无法完成的,因为它与设备的硬件直接相关。如果设备硬件(麦克风)无法接收几米外的声音,那么就无能为力。

两年前,我实现了一个webrtc(使用谷歌示例),它可以在移动web浏览器上工作,声音可以通过环境级别捕获。我真的没有对谷歌库进行深入的代码分析,但也许你可以从这里开始。