WebRTC 是一个用于 Web 的开放框架,可在应用程序和浏览器中启用实时通信 (RTC) 功能。2021年,WebRTC终于正式标准化。如今,WebRTC 无处不在,并且在各种场景中肯定证明了自己非常有用。但是,使用 WebRTC 进行构建并不容易。让我们看看为什么。
两个 API 统领一切
WebRTC 仅基于两个主要 API:MediaStream API 和 RTCPeerConnection API。看起来很简单,对吧?它是……在一开始。
最简单形式的 WebRTC
1) 捕获/管理媒体 (MediaStream API)
const stream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
localStream = stream;
2)发送/接收媒体(RTCPeerConnection API)
pc1 = new RTCPeerConnection(configuration);
const offer = await pc1.createOffer(offerOptions);
await pc1.setLocalDescription(offer);
localStream.getTracks().forEach(track => pc1.addTrack(track, localStream));
//send offer/receive answer and
//receive incoming media
这就是它变得复杂的地方
当为两个以上的参与者实施解决方案时,复杂性就会浮出水面。当我们有两个以上的用户将 paper 连接到 peer 时,它会变得有点混乱。
正如我们在上图中看到的,八个用户之间发生了许多连接。它创建了一个网格(和一团糟!)。这就是所谓的网状架构。每个用户的媒体流都需要上传到其他七个参与者中的每一个,然后下载其他人的媒体流。您可以想象计算机或移动设备跟上流量的挑战。
这种关系是线性的,如下图所示。
蓝线表示使用网状架构时所需的流/连接数。黄线表示 SFU 架构的流数。红线表示使用 MCU 架构的流。有关此架构的更多信息,请参见下文。
媒体服务器的兴起
网状网络固有的复杂性催生了围绕媒体服务器构建的新架构。这些是帮助我们分配流量的中间设备。媒体服务器处理视频/音频细节、缩放、浏览器和移动支持。
WebRTC 中最常用的媒体服务器架构是 SFU 和 MCU。
扩展到单个媒体服务器之外
大型服务器可以处理数百个媒体流,但垂直扩展是有限制的。在某些时候,一台服务器是不够的。对于需要处理数百个并发参与者的生产应用程序,使用地理定位进行水平扩展是一种常见方法。
此时,是时候通过在级联架构中添加更多服务器来横向扩展了。一个典型的用例示例是一个大型广播应用程序,其中有数千个订阅者和一个发布者。
另一种是大型多方视频会议。同样,您可以使用单个服务器。但是当您在同一个电话中接近一百个或更多人时,您需要添加更多服务器。您可以使用一个 SFU 将流量中继到其他 SFU,每个用户连接到多个 SFU。
扩展 WebRTC 媒体服务器和分配用户流量需要编排和容器来实现真正的水平可扩展性。这将是我下一篇博文的主题。
作者:Alberto Gonzalez
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。