如何从 javascript 上的 getUserMedia() 获取超过 3 声道的音频输入

Posted

技术标签:

【中文标题】如何从 javascript 上的 getUserMedia() 获取超过 3 声道的音频输入【英文标题】:How to get more than 3ch audio input from getUserMedia() on javascript 【发布时间】:2018-07-01 12:18:35 【问题描述】:

我想从 javascript 上的 getUserMedia() 获得超过 3 声道的音频输入。

我使用谷歌浏览器。 我用Windows10连接了3ch以上音频输入的音频接口, 使用 USB 电缆。 我尝试使用“navigator.mediaDevices.getUserMedia(constraints);”从音频接口获取声音在 JavaScript 上。 我可以获得 1 和 2 声道音频输入。 但我无法从音频接口获得超过 3 声道的音频输入。

音频接口附带的数字混音器软件可以获得3ch以上的音频输入。

我认为 getUserMedia() 从默认的 Windows 音频驱动程序中获取声音。 所以我可以获得 1 和 2 声道音频输入。

听说mac OS的音频驱动是USB AUDIO CLASS 2.0。 我在mac OS上试过了。 我可以获得 1 和 2 声道音频输入。 但我无法使用 getUserMedia() 获得超过 3 声道的音频输入。

如何从javascript的音频接口获得超过3ch的音频输入?

我认为如果 getUserMedia() 从 ASIO 驱动程序中获取声音,我可以做到。 但我不确定如何在 javascript 上的 getUserMedia() 上使用 ASIO 驱动程序。

如果你知道什么,请告诉我。 提前谢谢你。

【问题讨论】:

【参考方案1】:

首先让我先说,即使您确实在浏览器中使用 JS 进行多通道(3+ 通道)输入记录,我会惊讶地看到它运行良好且至少没有非常高的延迟。话虽如此,在此过程中尝试和学习总是值得的。

Chromium 的 audio_input_controller.cc

如果您检查 Chromium 的源代码(Chrome 是基于其构建的),文件 audio_input_controller.cc 指出:

Line 31 >> const int kMaxInputChannels = 3;

这表明,如果您想要超过 3 个频道,我认为这是不可能的。这是假设 Chrome 没有在此基础上进一步构建并添加更多通道输入支持,但是到目前为止,我还没有看到任何直接通过 Chrome 支持高于立体声通道输入的东西。这是在 GitHub 文件夹中,没有特定的操作系统,所以我假设它在所有桌面平台上都使用。

media.getusermedia.channels

如MediaDevices.getUserMedia() docs中所述:

首选项 media.getusermedia.channels 让您可以控制 要捕获的最大通道数;值 0,默认值, 告诉 getUserMedia() 捕获所有可用的、受支持的、 渠道。

所以要测试实际支持的最大输入通道数,我会将此参数设置为 0,然后查看实际返回了多少音频缓冲区 - 这样您就可以确定系统的通道限制。

总结

我不确定您的应用程序的目标是什么,但就通过浏览器的多通道输入而言,除了等到浏览器本身支持多通道输入之外别无选择。就像你说的,你的 DAW 可以访问超过 3ch 的输入,因为这是一个独立于浏览器运行的编译软件,并且可以访问所有系统级信息(即你的声卡硬件及其所有通信)。

推荐

我不确定您的编程经验水平,但是对于这种事情,您通常会使用 C++(或其他语言,但 C++ 通常是音频的首选)来构建一个独立于您的浏览器并运行的应用程序它在你的电脑上。要在 C++ 中获取多声道音频输入,您可以使用 JUCE 或 portaudio 之类的框架。

如果您致力于在 Web 浏览器中使用 JS,您可以创建一个将音频从桌面发送到本地网页的进程。这可以在 C++ 中完成,或者如果您对此比较陌生,使用PyAudio 的 Python 可能更容易上手。

此外,如果您熟悉/没有被介绍给 Electron.js,,您还可以构建一个已编译的应用程序(即 Windows 上的 .exe),它可以访问所有音频通道,因为它不是在浏览器,但只是使用浏览器来解释 javascript。我发现这个 binding for portaudio 可以在 Electron.js 中使用,它应该支持多通道输入。这样你就可以只使用 JavaScript/html/CSS 编写一个桌面应用程序并拥有多声道音频输入!

【讨论】:

感谢您的评论。在浏览器本身支持多声道输入之前,我们无法在Web浏览器上获得多声道输入的声音,对吗?好的,我将在我将开发的本机应用程序上进行尝试。

以上是关于如何从 javascript 上的 getUserMedia() 获取超过 3 声道的音频输入的主要内容,如果未能解决你的问题,请参考以下文章

如果在 iOS 9+ 上的 Safari 中手机上安装了应用程序,如何从 Javascript 检查?

如何从存储在我的 PC 上的文件中获取 XML 数据并使用 javascript 填充 HTML 表格?

this.data.getUsers(...).subscribe不是一个函数

twitteR R API getUser,用户名仅为数字

如何附加带有递增数字的 api

如何使用 AngularJs 或其他 JavaScripts 查找浏览器应用程序设置?