如何捕获HTML5麦克风输入到icecast?

通过HTML5 / Javascript(无闪存)捕获麦克风音频流然后将其发送到已设置的icecast服务器的步骤和方法是什么?

解决方案必须完全基于浏览器/网络,无需其他软件。 服务器在Rails 5.0.0.1上。

我应该从哪里开始?

我很难在网上找到任何相关信息,因为所有内容都谈到将音频文件上传/录制为完整文件,而不是流。

解决方案必须完全基于浏览器/网络,无需其他软件。

目前这是不可能的,因为无法制作流式HTTP PUT请求 。 也就是说,要通过XHR或Fetch发出HTTP请求,请求体必须是不可变的。

ReadableStream有一个新标准,现在可以在任何一天使用,允许您制作ReadableStream(您的编码音频)并将其PUT到服务器 。 一旦可用,这是可能的。

服务器在Rails 5.0.0.1上。

不知道为什么你提到它,因为你说它必须全部存在于浏览器中。 无论如何,让我告诉你我是如何使用服务器端代理实现的。

客户端,您需要使用getUserMedia()捕获音频。 (请务必使用adapter.js ,因为规范最近已更改,您不希望手动处理约束对象更改。)一旦有了,您可以发送PCM样本(我建议减少从32位浮点数到16位先签名,或者您可以使用AAC或MP3客户端等编解码器。 如果您在客户端中执行编解码器,那么您将只能发送一个或两个流。 如果您执行编解码器服务器端,由于CPU要求,您可以根据需要派生任意多个,但根据您派生的流,您将获得更多带宽。

对于客户端上的编解码器,您可以使用MediaRecorder或通过emscripten(或类似)编译为JavaScript的编解码器。 Aurora.js有一些用于解码的编解码器,但我相信其中至少有一个编解码器也有编码。

要将数据提供给服务器,您需要一个二进制Web套接字。

在服务器端,如果您将编解码器保存在那里, FFmpeg可以轻松实现。

获得编码音频后,您需要向Icecast或类似网站发出HTTP PUT请求,以及在带外更新元数据,或者将多路复用到您正在服务器的容器中。


自我推销:如果你不想自己做所有这些,我有一些你可以从我那里获得许可的代码,叫做AudioPump Web Encoder,它完全符合你的要求。 您可以根据需要对其进行修改,获取组件并将其嵌入到项目中等。如果您有兴趣,请发送电子邮件至brad@audiopump.co。

AudioPump Web编码器