通过navigator.getUserMedia
访问用户的麦克风非常简单。但是,如果我使用移动浏览器并希望从远处接收音频,例如使用“扬声器”模式,该怎么办?
我将如何实现这一目标?似乎有本机应用程序可以实现这一点,但Web Audio呢?
这样做的目的是使用DTMF在设备之间发送消息。我已经通过我的笔记本电脑实现了这一点,因为它的麦克风可以远距离记录周围的音频,但我可以访问的任何手机似乎只能在“喉舌”附近录制音频,所以我必须把手机放得非常接近即使收到消息的可能性很小,也要使用扬声器。除非我能让移动麦克风从远处拾取音频,否则这会失败。
编辑:距离,我的意思是大于几英尺,而不是仅仅几厘米。环境声音,而不是麦克风旁边的声音。
答案 0 :(得分:2)
这不能完成,因为它与设备的硬件直接相关。如果设备硬件(麦克风)无法从数米之外拾取声音,那么就无法做到。
答案 1 :(得分:1)
我在这里回答我自己的问题。感谢所有帮助过的人,尽管这里发布的实际答案都不令人满意,IMO。
在较新版本的Chrome上,navigator.mediaDevices
有一个名为enumerateDevices
的功能,可用于列出可用的硬件设备,包括麦克风。事实证明,这确实会在我的Android手机上返回“扬声器”设备。因此,如果您的设备中您怀疑扬声器未设置为默认浏览器麦克风,并且您(或您的用户)使用的是Chrome版本47或更高版本,则可以使用enumerateDevices
返回的设备ID指定一个特定的麦克风。
因此,如果您的用户在特定麦克风设备的select元素中选择了一个选项,您就会获取该设备的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)
或者,如果您正在处理原始样本,您可以将每个样本乘以一个数字,然后再将它们传递给您用于处理它们的任何函数。
答案 2 :(得分:0)
两年前,我实施了一个可在移动网络浏览器上运行的webrtc(使用谷歌示例),并以环境级别捕获声音。我真的没有对谷歌图书馆进行深入的代码分析,但也许你可以从这里开始。