【问题标题】:Web Audio: How can I get a mobile microphone to pick up audio from a distance?网络音频:如何让移动麦克风从远处拾取音频?
【发布时间】:2016-08-08 13:54:56
【问题描述】:

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

我将如何实现这一目标?似乎有原生应用可以做到这一点,但是 Web Audio 呢?

这样做的目的是使用 DTMF 在设备之间发送消息。我已经用我的笔记本电脑实现了这一点,因为它的麦克风可以从很远的地方录制周围的音频,但是我可以使用的任何手机似乎只能在“喉舌”附近录制音频,所以我必须将手机非常靠近源发言人,即使有很小的机会收到消息。除非我能让移动麦克风从远处拾取音频,否则这将达不到目的。

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

【问题讨论】:

  • 你确定它是在扬声器模式下的不同“模式”还是你只是假设这一切?
  • @NicholasKyriakides 我假设存在一种不同的模式,因为对输入波形进行放大似乎并不能提高我解码音频信号的质量。通过放大,我只是将样本相乘。我不认为这会奏效,但值得一试。适用于 Android 的 Sound Analyzer 应用程序的功能与我想要实现的功能非常相似,它能够拾取远处的声音并绘制频谱图,因此要么我做的不正确,要么无法使用 Web Audio。
  • 智能手机的环境麦克风可能是几个物理设备,但我认为它们是操作系统中的一个设备。因此,当您想要更好的音频时,您只需增加麦克风的增益,浏览器就可以让操作系统处理它。我在做假设,但它应该是这样工作的。所以尝试增加增益(应该在 Chrome 中工作,不确定其他):html5rocks.com/en/tutorials/webaudio/intro
  • @Blindman67 你的两个 cmets 都是我的问题的相关答案,所以,如果你们中的任何一个想将你的 cmets 详细说明为答案,那会很酷。简而言之,扬声器实际上有一个单独的模式;在第一个链接中调整了 mediaDevices 示例后,该设备实际上是“免提电话”。虽然我现在很确定这已经是我的默认设置了。使用 gainNode 还可以调整麦克风的音量,如 html5rocks 教程中所示。但事实证明,我的问题可能与麦克风输入无关。

标签: javascript google-chrome mobile web-audio-api getusermedia


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果我的硬件不支持这个是正确的,但它确实支持。见上面的 cmets;我原来的问题已经回答了,只是没有输入正式的答案。事实证明,虽然确实存在“免提”模式,但这并不是真正的问题,因为那是默认设备。实际问题似乎也不是增加节点数量。在这一点上,我认为这是一个软件问题,因为我的目标是提高频率存在,并且我有可以做到这一点的应用程序,但我似乎无法在移动 Chrome 上实现这一点(但我可以在桌面上)。跨度>
    • 确实,欢迎您根据上述 cmets 修改您的答案。毕竟,仍然有赏金去找人。 :)
    • 好的,如果可以在移动 chrome 上执行此操作,也许网络音频文档可以帮助回答
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多