javascript - SFU 和客户端机器之间存在什么类型的连接?
问题描述
我已经阅读了大量有关 WebRTC、ICE、Stun 和 Turn 的文章。
现在,当谈到 SFU 时,我不确定客户端(最终用户浏览器)和 SFU 之间建立了什么连接(它是 webrtc 连接吗??)。有人可以详细说明流程吗?
我的假设:当它是基于 SFU 的架构时。SFU & Client 建立 webrtc 连接并互相发送数据。SFU 了解当前房间中的所有人并相应地发送数据。初始信号将 sfu 服务器的候选冰块发送给客户端,反之亦然。
我对么 ?
解决方案
是的,客户端和 SFU 之间的连接是 WebRTC 连接。SFU 充当对等端点。
w3c 规范中没有对等点和 SFU 之间的区别,除了它忽略了在基于浏览器的客户端中定义联播的接收,这是您需要 SFU(或 MCU)的东西。
典型流量
- 通过信令在每个客户端和 SFU 端点之间进行定期的提议/答案交换。
- 如果服务器是提供者,它会向客户端发送接收联播的要约。一个正常的报价,除了客户端可以在
setRemoteDescription
它将发送单个视频轨道的多个编码(层)之后知道:
pc.getSenders()[0].getParameters().encodings.length // > 1 means simulcast
- 如果客户是提议者,它必须创建一个提议来发送联播,例如:
您不必对视频使用联播,但这很常见。音频的发送更简单,通常也是协商的,以及两者的客户端接收。pc.addTransceiver(videoTrack, {sendEncodings: [ {rid: "hi"}, {rid: "mid", maxBitrate: 500000, scaleResolutionDownBy: 2}, {rid: "low", maxBitrate: 150000, scaleResolutionDownBy: 4}, ]});
- 如果服务器是提供者,它会向客户端发送接收联播的要约。一个正常的报价,除了客户端可以在
- ICE 候选人被交换作为此谈判的正常部分(在客户和 SFU 之间)。
- 一旦连接了多个客户端,SFU(选择性转发单元)通常会从每个参与者接收音频和(同时广播,也就是多尺寸)视频,然后通常会向每个参与者发送来自当前正在讲话的人的大视频和音频,以及来自当前发言者的较小视频(一部分)其他人。具体的选择性转发逻辑通常由应用程序通过信令控制。
每个参与者都有一个加密连接,该连接终止于 SFU 中间盒,而不是彼此。这意味着即使 WebRTC 始终是加密的,您与其他参与者的连接在技术上也不是端到端加密的。因此,请确保您信任或控制您的 SFU。基于 SFU 的 e2ee 标准解决方案正在开发中。
推荐阅读
- python - 我可以使用远程 git 存储库并且不要通过 GitPython 在本地克隆它吗
- powerbi - 如何解决此代码中的 Expression.Error
- windows - 如何在 Cygwin 和 Windows 之间建立管道
- ant-media-server - 发布 RTMP 流时 ant 媒体服务器错误
- flutter - 如何使我的文本响应任何屏幕颤动飞镖
- node.js - SyntaxError: 导入 axios 时无法在模块外使用 import 语句
- flutter - 如何在颤动中从文本字段中显示验证错误消息
- android - 如何在 MpAndroidChart 中突出显示部分行
- javascript - 日期在 Node.js 中丢失前导 0
- websocket - 我可以使用动态主题向单个用户发出套接字而不是使用 socket.id