Javascript 网络音频:如何让移动麦克风从远处拾取音频?

Javascript 网络音频:如何让移动麦克风从远处拾取音频?,javascript,google-chrome,mobile,web-audio-api,getusermedia,Javascript,Google Chrome,Mobile,Web Audio Api,Getusermedia,通过navigator.getUserMedia访问用户的麦克风非常简单。但如果我使用的是移动浏览器,想从远处拾取音频,比如“扬声器”模式,该怎么办 我将如何实现这一目标?似乎有一些本地应用程序可以实现这一点,但网络音频呢 其目的是使用DTMF在设备之间发送消息。我已经用我的笔记本电脑做到了这一点,因为它的麦克风可以从很远的距离录制周围的音频,但我接触到的任何手机似乎都只能在“话筒”附近录制音频,因此我必须将手机举得离源扬声器非常近,甚至有一点点机会接收到消息。除非我能让移动话筒从远处拾取音频,

通过
navigator.getUserMedia
访问用户的麦克风非常简单。但如果我使用的是移动浏览器,想从远处拾取音频,比如“扬声器”模式,该怎么办

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

其目的是使用DTMF在设备之间发送消息。我已经用我的笔记本电脑做到了这一点,因为它的麦克风可以从很远的距离录制周围的音频,但我接触到的任何手机似乎都只能在“话筒”附近录制音频,因此我必须将手机举得离源扬声器非常近,甚至有一点点机会接收到消息。除非我能让移动话筒从远处拾取音频,否则这就达不到目的


编辑:所谓距离,我的意思是大于几英尺,而不是仅仅几厘米。环境声音,而不是局限在麦克风旁边的声音。

这是无法做到的,因为它与设备的硬件直接相关。如果设备硬件(麦克风)无法从几米远的地方拾取声音,那么就没有办法了。

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

我在这里回答我自己的问题。我要感谢所有帮助过我的人,尽管这里公布的实际答案都不令人满意

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

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

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

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

您确定这是不同的“模式”吗当处于扬声器模式时,或者你只是在假设这一切?@NicholasKyriakides我假设存在一种不同的模式,因为对输入波形进行放大似乎无法提高质量,使我无法解码音频信号。通过放大,我只是将样本相乘。我认为这无论如何都不管用,但值得一试。Android的声音分析器应用程序与我尝试实现的功能非常相似,它能够拾取远处的声音并绘制光谱图,因此,要么我做得不对,要么网络音频不可能。这可能会帮助你智能手机的环境麦克风可能是几个物理设备,但我认为它们是操作系统中的一个设备。因此,当您想要更好的音频时,只需增加麦克风的增益,浏览器就可以让操作系统处理它。我在做假设,但这就是它应该如何工作的。因此,请尝试增加增益,如中所示(应在Chrome中工作,不确定其他人):@Blindman67您的两条评论都是我问题的相关答案,因此,如果您想将您的评论细化为答案,那就太酷了。简而言之,扬声器实际上有一个单独的模式;在对第一个链接中的mediaDevices示例进行了改编后,该设备被称为“扬声器”。尽管我现在很确定这已经是我的默认情况了。使用gainNode还可以调整麦克风的音量,如HTML5教程所示。但事实证明,我的问题可能与麦克风输入无关。如果我的硬件不支持,这是正确的,但它支持。见上述评论;我原来的问题已经得到了回答,只是没有打印成正式的答案。事实证明,虽然确实存在“扬声器”模式,但这不是实际问题,因为这是默认设备。实际问题似乎也不是增益节点卷。在这一点上,我认为这是一个软件问题,因为我的目标是提高频率,我有这样的应用程序,但我似乎无法在移动Chrome上实现这一点(但我可以在桌面上实现)。确实,欢迎您根据上述评论修改您的答案。毕竟,还有一笔赏金可以给某人好的,如果可以在移动chrome上实现这一点,也许网络音频文档可以帮助回答这个问题
volume     = context.createGain()
volume.gain.value = 3 // raises the volume to 300%
audioInput = context.createMediaStreamSource(e)
audioInput.connect(volume)