WebRTC 开发实践:为什么你需要 SFU 服务器

2023-11-12

转自:https://blog.51cto.com/ticktick/2349113
当你入门 WebRTC 之后,很快就会接触到一个名词,叫做:SFU,你可能很容易就在网上寻找到很多 SFU 的开源实现,并并兴致勃勃地开始编译、部署和测试这些服务器,但是可曾想过,为啥我们的 WebRTC 应用需要 SFU 服务器 ?

1 WebRTC P2P 通话的网络模型

1.png

如图是 WebRTC P2P 模式下的网络拓扑结构,ClientA 和 ClientB 如果能够顺利建立 P2P 的连接,则可直接通过 P2P 互相交换数据。如果由于某些网络环境原因,无法成功打通 P2P 连接的话,则可以通过一台 TURN Server 来中转数据给对方。

这个 TURN Server 是指支持 TURN 协议 的服务器,它扮演着一种网络中继的角色,支持把一个 Client 的数据包透明转发到多个其他的 Client 客户端。

在这种简单的 P2P 通话场景下,其实这种模型基本够用了,根本不需要架设什么 SFU 服务器。

下面我们再近一步,看看多人通话的场景:

2.png

如图所示,多人通话跟单人通话唯一的不同就是每个客户端都需要跟其他两个端都分别建立 P2P 连接,我在《WebRTC 开发实践:从一对一通话到多人会议》也介绍过这个场景。与一对一通话一样,如果两个端能够顺利建立 P2P 的连接,则直接通过 P2P 互相交换数据;如果无法打通,则利用 Turn Server 来中转数据。

我们把这种完全使用 P2P 方式的网络拓扑结称之为 Mesh 结构,下面我们谈谈它的优劣点。

2 WebRTC Mesh 网络拓扑结构的优劣

优点:

逻辑简单,容易实现

服务端比较 “轻量”,TURN 服务器比较简单,一定比例的 P2P 成功率可极大减轻服务端的压力

缺点:

每新增一个客户端,所有的客户端都需要新增一路数据上行,客户端上行带宽占用太大。因此,通话人数越多,效果越差

无法在服务端对视频进行额外处理,如:录制存储回放、实时转码、智能分析、多路合流、转推直播等等

由此可以看到,mesh 结构的缺点影响还是比较大的,真正商业化的应用,是需要具备良好的通话质量、服务稳定性和可扩展性的,因此,亟需一种新的网络拓扑结构,能够很好的规避 mesh 结构的这些短板。

3 什么是 SFU ?

SFU 的全称是:Selective Forwarding Unit,是一种通过服务器来路由和转发 WebRTC 客户端音视频数据流的方法。

3.png

如图所示,SFU 服务器最核心的特点是把自己 “伪装” 成了一个 WebRTC 的 Peer 客户端,WebRTC 的其他客户端其实并不知道自己通过 P2P 连接过去的是一台真实的客户端还是一台服务器,我们通常把这种连接称之为 P2S,即:Peer to Server。除了 “伪装” 成一个 WebRTC 的 Peer 客户端外,SFU 服务器还有一个最重要的能力就是具备 one-to-many 的能力,即可以将一个 Client 端的数据转发到其他多个 Client 端。

这种网络拓扑结构中,无论多少人同时进行视频通话,每个 WebRTC 的客户端只需要连接一个 SFU 服务器,上行一路数据即可,极大减少了多人视频通话场景下 Mesh 模型给客户端带来的上行带宽压力。

SFU 服务器跟 TURN 服务器最大的不同是,TURN 服务器仅仅是为 WebRTC 客户端提供的一种辅助的数据转发通道,在 P2P 不通的时候进行透明的数据转发。而 SFU 是 “懂业务” 的, 它跟 WebRTC 客户端是平等的关系,甚至 “接管了” WebRTC 客户端的数据转发的申请和控制。

4 什么是 MCU ?

从上述 SFU 的定义可以看到,SFU 这种网络拓扑模型,通过由 SFU Server 来实现 one-to-many ,减轻了多人视频通话场景下每个客户端的上行带宽压力,但是下行依然是多路流,随着通话人数的增大,下行带宽的压力依然会成比例的增大,那能否让下行也只剩一路流呢?—— 可以,通过在服务器端合流后再下发即可解决,如下图所示:

4.png

这种网络拓扑结构,被称之为 MCU,它的特点是,由 MCU Server 将各路客户端上行的视频流合成为一路,再转发给其他客户端。这种模型相比于 SFU 降低了多人视频通话场景下客户端的下行带宽压力,但是由于合流需要转码操作,对服务器端压力比较大,而且下发给客户端的流是固定的合流画面,灵活性不是特别好。

5 为啥推荐选择 SFU ?

综上所述,纯 mesh 方案无法适应多人视频通话,也无法实现服务端的各种视频处理需求,最先排除在商业应用之外。

SFU 相比于 MCU,服务器的压力更小(纯转发,无转码合流),灵活性更好(可选择性开关任意一路数据的上下行等),受到更广泛的欢迎和应用,常见的开源 SFU 服务器有:Licode,Janus,Jitsi,mediasoup,Medooze 等等,各有特点,大家可以去项目主页了解更详细的情况。

当然,也可以组合使用 SFU + MCU 的混合方案,以灵活应对不同场景的应用需要。

5 小结

关于 WebRTC SFU 相关知识点就分享到这里了,如有疑问的小伙伴欢迎来信 lujun.hust@gmail.com 交流。另外,也欢迎大家关注我的新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC 开发实践:为什么你需要 SFU 服务器 的相关文章

  • iceConnectionState 已断开连接(通过互联网使用时)

    这个问题以前曾被问过 但我还没有找到答案 我基本上遇到了与描述相同的问题here https stackoverflow com questions 34405816 peerjs webrtc iceconnectionstate fai
  • 如何与本机桌面 (win) 应用程序建立对等连接

    我需要与本机桌面 win 应用程序和网络浏览器建立对等连接 只是为了传输原始数据 从理论上讲 WebRTC 似乎是实现这一目标的唯一方法 如果您想使用 WebRTC 在浏览器和桌面之间交换数据 您可以使用此库将桌面部分编码为 C 语言 ht
  • 本地网络上的 WebRTC? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在阅读有关 WebRTC 的内容 它看起来非常有前途 我想制作一个简单的局域网游戏 自动连接同一网络上的人们 尽管我可以找到人们
  • 适用于高带宽应用的 WebRTC 数据通道

    我想通过 WebRTC 数据通道发送单向流数据 并且正在寻找最佳配置选项 高带宽 低延迟 抖动 以及其他人在此类应用程序中的预期比特率的经验 我的测试程序发送 2k 的块 使用 2k 的 bufferedAmountLowThreshold
  • 为 webRTC 使用特定端口

    当使用 webRTC 创建点对点音频连接时 如果用户位于路由器后面 我们使用的 STUN 服务器将返回公共 IP 现在在 ICE 对象中 我可以看到 rport 始终介于 50000 及以上 有没有办法使用特定端口 以便用户不必打开所有这些
  • 通过 Websocket 传输视频

    我正在尝试构建可以从双方传输视频的移动应用程序 即视频通话之类的东西 我研究了 webrtc 但这还没有为移动本机应用程序做好准备 无论如何 webrtc 正在做的是允许浏览器直接捕获相机和音频而不需要插件等 但在本机移动应用程序中捕获相机
  • webrtc如何选择输入视频设备?

    我正在研究webRTC应用程序 我参考的是这个软件 apprtc https code google com p webrtc source browse trunk samples js apprtc https code google
  • 为Windows应用程序实现webrtc数据通道[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有谁知道如何向用 C 构建的 Windows 应用程序实现 WebRTC DataChannel API 以便在 NAT 后面的客户端
  • 移动浏览器将以及何时支持 getUserMedia?

    我使用 前沿 HTML5 WebRTC API 编写了一个 Web 应用程序 请参阅下面的代码 这适用于 Chrome v20 启用了 MediaStream 标志 和最新的 FF Nightly 版本 17 0a1 创建了 media n
  • 我可以在 DTLS-SRTP 加密中指定自己的加密密钥吗

    在 Chrome 中的 webrtc Web 应用程序中 我曾经通过覆盖 SDP 中的加密信息来指定自己的加密密钥 我现在正在迁移我的 webrtc Web 应用程序以使用 DTLS SRTP 进行加密 启用 DTLS 后 有没有办法告诉
  • 具有 3 个用户连接的 WebRTC

    我现在正在实施源代码WebRTC 示例 https github com webrtc samples tree gh pages src content peerconnection audio通过使用网状拓扑成为 3 个用户连接 但是
  • 使用 Docker 的 mediasoup v3

    我正在尝试运行一个2docker 中的 WebRTC 示例 使用 mediasoup 当我在一组实例上进行视频通话时 我想运行两台服务器 我的错误 你有没有看到这个错误 createProducerTransport null 错误 由于地
  • WebRTC 局域网内是否需要 STUN 服务器?

    我使用Webrtc开发了一个p2p视频聊天 我知道需要 STUN 或 TURN 服务器来识别 NAT 后面的公共 IP 目前正在使用 Google 的 STUN 服务器 我的应用程序安装在连接到 LAN 的服务器上 但无法访问互联网 我是否
  • 为什么turn服务器不支持tcp连接?

    我是 WebRTC 新手 我需要为我的 webrtc 应用程序配置我自己的 Turn 服务器 我使用以下命令安装了我的转弯服务器 apt get install coturn 我只需要通过 tcp 运行转变服务器 它不必使用 UDP 进行任
  • webrtc - 视频出现斑点,但它仍然是黑色的

    我使用 chrome 21 运行我的 webrtc 代码 如果我在同一个 chrome 中打开两个选项卡 然后打开其中包含 webrtc 代码的页面 一个选项卡用于发送视频流 一个选项卡用于接收视频流 效果很好 但是 如果我使用两种隐身模式
  • WebRTC:通道、轨道和流与 RTP SSRC 和 RTP 会话之间的关系

    来自 Mozilla 网站 https developer mozilla org en US docs Web API Media Streams API https developer mozilla org en US docs We
  • 使用webrtc时可以关闭SRTP吗

    现在我测试webrtc与SIP客户端 sx20 的通信 我使用 webrtc sdp 发送邀请消息 但 sip 客户端答案没有指纹 并且 sip 客户端的答案不是 SRTP 只是 RTP 所以我需要关闭WEBRTC中的SRTP 我可以做吗
  • WebRTC/getUserMedia:如何正确静音本地视频?

    我正在尝试实现将本地视频静音的功能MediaStreamTrack在我的 WebRTC 应用程序中 我是这样处理的 function muteVideo if this localStream this localStream getVid
  • 录制视频和音频并上传到服务器

    我想为网站添加视频录制功能 我一直在搜索并尝试所有可能的可用解决方案 但还没有任何工作正常 我已经尝试过以下解决方案 WebRTC 我知道使用 WebRTC 我们可以从网络摄像头和麦克风获取流 我发现了很多关于相同内容的文章 但没有一篇解释
  • mime.lookup 的 webrtc 错误

    我在我的电脑上尝试了 webrtc 演示 但在演示步骤 04 中 当我使用 npm install 和 node index js 时 它显示 类型错误 mime lookup 不是一个函数 即使我通过输入 npm install mime

随机推荐

  • xss-labs通关大合集

    漏洞原理 看这里哇 目录 xss labs level1 level2 level3 level4 level5 level6 level7 level8 level9 level10 level11 level12 level13 lev
  • 虚拟服务器本地ssd型,云服务器本地ssd型

    云服务器本地ssd型 内容精选 换一换 若您对扩展的云服务器的规格有特殊的要求 可通过使用新模板创建伸缩配置 可按照您的需求配置新模板的规格参数 使得伸缩组内云服务器的规格均符合创建新模板的规格 登录管理控制台 选择 计算 gt 弹性伸缩
  • Python实现PP图和QQ图的应用

    Python实现PP图和QQ图的应用 在数据可视化领域 PP图和QQ图常常被用作数据研究和分析的工具 PP图 Probability Probability plot 和QQ图 Quantile Quantile plot 是由概率论和统计
  • Qt中的坐标系统

    1 坐标系统 GUI操作系统都有特定的坐标系统 图形界面程序在坐标系统中进行窗口和部件的定位 定位类型 顶级窗口部件的定位 窗口内部件的定位 窗口部件的大小设置 Qt使用统一的坐标系统定位窗口部件的位置和大小 Qt部件提供成员函数在坐标系统
  • T-SQL语句添加约束

    语法 ALTER TABLE 表名 ADD CONSTRAINT约束名约束类型 具体的约束声明 约束名的取名规则推荐采用 约束类型 约束列 当然你也可以不这么命名 这样单纯是比较方便 如 主键 Primary Key 约束 PK UserI
  • python爬虫Request

    1 先确定是否为动态加载网站 2 找URL规律 3 正则表达式 xpath表达式 4 定义程序框架 补全并测试代码 1 request是什么 Requests是用python语言基于urllib编写的 采用的是Apache2 License
  • AVPlayer耳机插拔

    AVPlayer耳机插拔暂停播放 耳机插拔监听 NSNotificationCenter defaultCenter addObserver self selector selector audioRouteChanged name AVA
  • Qt4代码移植Qt5时的 QTcpServer 64位 BUG

    原Qt4上接口代码如下 void QTcpServer incomingConnection int socketDescriptor 移植到Qt5后 BUG现象就是 用MinGW32位编译出来的程序 QTcpServer工作正常 但用Mi
  • 最新uniapp大佬级应用整理,谁说uniapp做不出好东西是小儿科

    最近经济 就业都不太好 在家躺平各位i兄弟看过来了 大佬从不抱怨环境 给大家整理几款uniapp神级作品 1 舒尔他方格听说过吧 可以锻炼思维和反应速度 免费开源要不要 下载地址 https ext dcloud net cn plugin
  • ARM DS5调试记录(1)安装&调试介绍

    一 安装说明 说明 安装文档已经把相应的细节介绍得很清楚了 这里主要是就之前安装遇到的问题和解决办法进行记录 1 安装虚拟网卡时 出现 系统资源不足 无法满足所需的服务 目前没有太好的解决办法 我是通过系统还原解决的 后面 有更好的解决办法
  • Arduino(三)——按钮控制数码管

    本节 我们学习一下内容 1 用按键控制数码管从1 9显示 然后再清零 2 外部中断函数 1 我们先来看下面的图 我们需要根据我们按键是否连通来连接我们的电路 所以我们连接好后就会是这样的 看完了连接图 接下来就要看我们的任务了 也就是让数码
  • 通达信公式破解

    通达信公式破解 通达信股票公式的导入方法 http blog sina com cn s blog 7f809c880102vk1n html 1 你下载到公式文件 XXXXX tne 后 保存或复制一份到桌面 或 我的文档 或你喜欢存放的
  • 控制工程学习4

    一 一阶系统的单位阶跃响应 单位跃阶 a起决定作用 在单位跃阶中时间常数t 等于a分之一的时候x 0 63 时间常数为系统特有 在稳定时间即4倍时间常数则等于0 98 二 非零初始条件下的传递函数 当t 0时即x 0 输入有两项为u s 和
  • 2024秋招海康威视前端笔试大题笔经

    文章目录 杂谈 大题及大致解析 论述题 1 html和htmls的区别 2 什么是深拷贝 什么是浅拷贝 如何实现 编程题 1 大人小孩排队 2 数组内是否存在 nums i nums j t 且 i j k 杂谈 考得不是很难 一开始进去会
  • C++的类模板

    1 类模板基本语法 template
  • 麒麟V10系统安装教程

    1 准备麒麟V10镜像 第一种方法 访问麒麟官网 https www kylinos cn scheme desktop 2 htmlhttps www kylinos cn scheme desktop 2 html点击申请使用 填写个人
  • Python:字典嵌套字典的数据类型,如何取出字典外部以及层级嵌套字典的键值对

    思路整理 1 循环遍历取出外层的 key 和 value 的值 2 判断遍历后的 value 数据类型是否为 字典 dict 3 if true 则再次循环遍历取出 key 和 value 的值 代码实现 coding utf 8 Time
  • 小程序navigateTo与redirectTo,跳转页面报错:fail webview count limit exceed

    前言 小程序中涉及跳转页面报错 fail webview count limit exceed 目录 报错信息 报错原因 官方介绍navigateTo 解决方法 官方介绍redirectTo 报错信息 报错原因 官方介绍navigateTo
  • 一图看懂 openai 模块:ChatGPT的API python库, 资料整理+笔记(大全)

    本文由 大侠 AhcaoZhu 原创 转载请声明 链接 https blog csdn net Ahcao2008 一图看懂 openai 模块 ChatGPT的API python库 资料整理 笔记 大全 摘要 模块图 类关系图 结束 摘
  • WebRTC 开发实践:为什么你需要 SFU 服务器

    转自 https blog 51cto com ticktick 2349113 当你入门 WebRTC 之后 很快就会接触到一个名词 叫做 SFU 你可能很容易就在网上寻找到很多 SFU 的开源实现 并并兴致勃勃地开始编译 部署和测试这些