使用 WebRTC 浏览器 => 服务器实时流式传输音频

Lol*_*lya 4 audio-recording audio-streaming live-streaming webrtc openwebrtc

我正在尝试将一些音频流从我的浏览器发送到某个服务器(udp,也尝试使用 websockets)。我正在使用 webrtc 录制音频流,但是在将数据从 nodeJS 客户端传输到我的服务器时遇到问题。任何的想法?是否可以使用 webrtc(openwebrtc) 将音频流发送到服务器?

Bra*_*rad 5

要将音频从浏览器发送到服务器,您有几种不同的可能性。

网络套接字

只需通过二进制网络套接字将音频数据发送到您的服务器。您可以使用带有 ScriptProcessorNode 的 Web Audio API 来捕获原始 PCM 并无损发送。或者,您可以使用 MediaRecorder 记录 MediaStream 并使用像 Opus 这样的编解码器对其进行编码,然后您可以通过 Web Socket 进行流式传输。

Facebook 的 GitHub repo上有一个使用视频完成此操作的示例。仅流式传输音频在概念上是相同的,因此您应该能够调整示例。

HTTP(未来)

在不久的将来,您将能够使用 WritableStream 作为 Fetch API 的请求主体,从而允许您使用来自浏览器的流源创建普通的 HTTP PUT。这与您使用 Web Socket 所做的基本相同,只是没有 Web Socket 层。

WebRTC(数据通道)

使用 WebRTC 连接和作为“对等点”的服务器,您可以打开数据通道并发送与通过 Web 套接字或 HTTP 发送的完全相同的 PCM 或编码音频。

这增加了大量的复杂性,但没有真正的好处。不要使用这种方法。

WebRTC(媒体流)

WebRTC 调用支持直接处理 MediaStreams。您可以附加流并让 WebRTC 堆栈负责协商编解码器、适应带宽变化、丢弃未到达的数据、保持同步以及围绕限制性防火墙环境协商连接。虽然从表面上看这让事情变得更容易,但这也复杂。没有任何 Node.js 软件包可以向您公开 MediaStreams,因此您不得不处理其他软件……它们都没有像它那样容易集成。

大多数走这条路的人将执行 gstreamer 作为 RTP 服务器来处理媒体组件。我不相信这是最好的方法,但这是我目前所知道的最好的方法。