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

Ird*_*des 6 html javascript audio ruby-on-rails icecast

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

解决方案必须完全基于浏览器/网络,没有附加软件。服务器在 Rails 5.0.0.1 上。

我应该从哪里开始?

我正在努力在网上找到任何相关信息,因为一切都在谈论将音频文件上传/录制为完整文件,而不是流。

Bra*_*rad 5

解决方案必须完全基于浏览器/网络,没有附加软件。

目前这是不可能的,因为无法进行流式 HTTP PUT 请求。也就是说,要通过XHRFetch发出 HTTP 请求,请求主体必须是不可变的。

有一个新的ReadableStream标准,现在随时可用,允许您制作 ReadableStream(您的编码音频)并将其放入服务器。一旦可用,这是可能的。

服务器在 Rails 5.0.0.1 上。

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

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

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

要将数据发送到服务器,您需要一个二进制网络套接字。

在服务器端,如果您将编解码器保留在那里,FFmpeg使这变得容易。

获得编码的音频后,您需要向 Icecast 或类似内容发出 HTTP PUT 请求,并在带外更新元数据,或将其混合到您正在 PUT 到服务器的容器中。


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

AudioPump Web 编码器