想象你经营着一家连锁餐厅的配送服务。顾客线上下单,后厨出餐,你需要把菜品送到顾客手中——有两条路线可选:一条是搭建“骑手中转站”,骑手从后厨取餐后原封不动地送到每一位顾客手里,点 A 套餐就送 A 套餐,点 B 套餐就送 B 套餐,中转站不拆包装、不改味道;另一条是开设“中央厨房”,把所有顾客的订单汇聚在一起,由大厨把食材混合、重新烹饪成一份统一的“合家欢套餐”,再按桌分发给所有人。前者轻快灵活,每多一位顾客只需多备一份配送;后者口味统一、出口整洁,但厨房的锅灶必须够大够快。WebRTC 的 SFU 与 MCU 架构之争,正是这场“中转配送 vs 中央厨房”的路线抉择。
掌握 SFU 与 MCU 的流量模型、服务器负载与拥塞控制差异,是实时音视频从业者做架构选型与容量规划的核心基本功——它决定了你的产品在多大规模下依然流畅、在多少成本预算内依然盈利。
目录
可视化演示
展示SFU选择性转发、MCU混流编解码、流量模型对比及GCC拥塞控制与Simulcast多码率切换,含星座网络背景和发光动画。
本节配有交互动效(进入视口后自动加载,约 3KB)。
架构总览:中转站与中央厨房
你开了一家外卖公司,需要把后厨做好的菜送到顾客手中,面前有两条路线:要么建一个骑手中转站,骑手取餐后原样送达,不拆封、不改味;要么建一个中央厨房,把大家点的菜汇到一起,由大厨重新烹饪成一桌统一的流水席再分送。WebRTC 的服务器架构也恰好分这两派,名字拗口,但本质就是“转”与“炒”的差别。
SFU(Selective Forwarding Unit,选择性转发单元)收到某位参会者的视频流后,不解码、不重编码,直接复制转发给其他所有参会者。MCU(Multipoint Control Unit,多点控制单元)则相反:先把所有人的视频都收进来,经过解码、画面拼合与混合布局,再重新编码成一路新的视频流,统一分发给每个人。两者的工作流程天然决定了后续的流量与算力分布:SFU 是“原样转手”,MCU 是“加工重组”。
理解了这两套“人力配置”的分野,后面所有的成本模型与选型逻辑都顺理成章:中转站的核心成本在配送通道,中央厨房的核心成本在灶台人力。
- SFU 的流出等于流入$S_{in}$ 是服务器收到的原始码流,$S_{out}$ 是转发出去的码流。等号表示内容不变,服务器只是复制并选择路径转发。
- MCU 的混合变换$M$ 是混合函数,输入是多路流 $S_{in}^{(1)}, S_{in}^{(2)}$ 等,输出是重新编码后的一路统一画面。
- 两种执行的代价差异SFU 的“不做”省下 CPU 但放大带宽;MCU 的“做”耗尽算力但压缩了出口流量。
流量模型:单份配送与平方爆炸
中转站每新增一位顾客,就意味着每道菜都要额外多送一份——送餐单量像滚雪球一样膨胀;中央厨房则不管外面有多少桌,后厨始终只出一份统一的“合家欢大拼盘”,只是按桌分份而已。这个直觉正是 SFU 与 MCU 流量模型的缩影。
假设会议有 $N$ 人参会,每路视频的上行码率为 $b$。SFU 模式下,每个人上行 1 路,服务器需要把这一路复制给其余 $N-1$ 人,所以服务器下行总量为 $N(N-1)b$,当 $N$ 较大时接近 $N^{2}b$——这便是常说的“平方爆炸”。MCU 模式下,每个人仍然上行 1 路,但服务器混合后只输出 1 路码流(码率记为 $b_{mix}$,通常约等于单路码率),下行总量为 $N \times b_{mix}$——线性温和地增长。
中转站每多一个顾客,骑手要额外多跑许多趟;中央厨房每多一桌,后厨只多分一份拼盘。搞清楚谁在按平方扩张,你就知道服务器带宽预算该按什么曲线采购。
- N 表示参会端点数量每个端点既是接收方也是潜在发送方,这决定了流量被复制的次数。
- b 是单路码率例如 720p 视频通话约 1~2Mbps,1080p 约 2~4Mbps,越清晰则 $b$ 越大。
- SFU 的下行推导每路源都要复制给其余 $N-1$ 个端点,共 $N$ 路源,故 $B_{SFU}=N(N-1)b \approx N^{2}b$。
- MCU 的下行推导混合后只有 1 路流,每个端点接收 1 份,故 $B_{MCU}=N \times b_{mix}$。
- 关键对比结论$N$ 越大,SFU 的平方项越失控,MCU 的优势越显著;但这份优势是用服务器的“炒菜算力”换来的。
服务器负载:骑手与厨师的成本
中转站省钱省在“没有厨房”,但仓库的货架(带宽出口)需要堆满同样规格的餐盒;中央厨房省在“不用重复送餐”,但厨师团队(CPU/GPU)必须一刻不停地颠勺。到了服务器侧,两种架构的资源账单截然不同。
SFU 不转码,CPU 主要用于 RTP 包的转发、路由、统计与 NAT 穿透辅助,每个转发链路的开销很小;MCU 则每路流都要解码、参与混合布局、再重新编码,每一步都是重度计算。结果就是:MCU 的计算成本与参会人数 $N$ 线性相关,但系数极大;SFU 的计算成本同样随 $N$ 增长,但系数的量级远小于编解码。
预算有限时,开中央厨房要把钱花在雇更多厨师(算力),开中转站要把钱花在租更大的冷库与配送通道(带宽)。看懂这张账单,才知道钱该往哪边倾斜。
- c_dec 与 c_enc解码一路视频和编码一路视频所需的计算量,通常用 CPU 占用率或 GPU 负载衡量。
- MCU 的 N 倍重开销$N$ 路输入要解码 $N$ 次,混合后还要编码,故 $C_{MCU}$ 等于 $N$ 乘以单路编解码开销之和。
- SFU 的轻量转发$c_{fwd}$ 只是包级复制与路由的成本,比编解码小一到两个数量级。
- 部署含义MCU 要买高配 CPU/GPU 机器,SFU 要买高带宽出口机器;同样预算下,两者能支撑的并发人数天差地别。
拥塞控制:谁在喊停车
雨天路滑,外卖车队遇上了堵车。中转站的做法是让每个骑手自己观察路况、自行减速;中央厨房的做法则是调度台统一发布指令:所有车降速、统一重新规划路线。WebRTC 的拥塞控制,也分这两种哲学。
在实际信道中,丢包率 $p_{loss}$ 是衡量拥塞的核心信号。发送端通过 RTCP 反馈(REMB / TWCC)感知丢包与延迟变化,并据此调整发送码率。SFU 架构下,服务器只做转发,带宽探测与码率决策基本发生在端侧:每个发送端根据接收端反馈的丢包率自行降速,反应快但不一定协调。MCU 架构下,服务器掌握全局接收情况,可在混合前统一决定“全员降码率”或“只保留音频”,集中调度一致性更强,但多了一道决策延迟。
中转站的路况由每个骑手自行判断,反应快但步调不一;中央厨房由调度台统一指挥,整齐划一但多了一层指挥延迟。拥塞控制的设计取舍,本质就是“分散自治”与“集中调度”的权衡。
- R_send 是实际发送码率发送端编码器真正采用的视频码率,决定了当前画面的清晰度。
- R_target 是目标码率由分辨率、帧率、画面复杂度共同决定的理想码率。
- p_loss 是丢包率由接收端统计并反馈给发送端,反映网络拥塞程度。
- 调整动作丢包率越高,发送码率下降越多,用画质换流畅;SFU 中该决策由各发送端独立执行,MCU 中可由服务器统一收放。
选型决策:开站还是开厨房
开店之前先看客流量:如果每天只有三五桌客人,开中央厨房显然是浪费,一个小档口加几个骑手足矣;如果要做千人大食堂,就必须建中央厨房统一出餐,或者设计“多窗口 + 统一打菜”的混合动线。SFU 与 MCU 的选型,同样取决于规模、网络与预算三个变量。
小型固定会议(如 4~10 人)对统一画质、录制与管控有较高要求,MCU 的“一份拼盘”模式简单可靠。中大型会议一旦超过某个临界规模,$N^{2}$ 的带宽压力会迅速击穿机房预算,SFU 成为事实主流。更常见的工程实践是混合架构:主讲人上行给 SFU,观众只收不发,再通过“N 选 1 转推 CDN”把主流推到海量观众,从而把服务器出口从平方级降到线性级。
小馆子请一位大厨兼前台绰绰有余,万人食堂必须让大部分客流走“只看一份菜单”的快餐线。选型没有绝对优劣,只有客流量(规模)、路况(网络)与预算(成本)的匹配。
- N_th 是经验阈值业界实践表明 8~20 人是两种架构成本曲线的交叉区间。
- 小于阈值选 MCU小规模下 MCU 的算力成本可接受,换取统一画质与集中管控。
- 大于阈值选 SFU超过阈值后平方级带宽不可承受,SFU 的线性算力增长更划算。
- 混合方案用“发言者数量 $N_{speaker}$”替换“全员数量 $N$”,出口带宽从 $N^{2}$ 降为 $N_{speaker} \times N_{viewer}$。
实践参考:市面上的外卖平台与中央厨房
想省心省力,可以直接租用别人建好的中转站(开源 SFU)或中央厨房(云厂商 MCU),不必从零砌灶台。工程团队的核心任务,是判断哪种“配送体系”适合自己。
mediasoup 是 Node.js 生态的 SFU 核心库,灵活嵌入自研服务,适合有定制需求的团队;Jitsi Videobridge 是久经考验的 SFU 实现,自带完整会议套件,生产可用性高;LiveKit 提供云原生 SFU 平台,REST API 与客户端 SDK 齐全,是快速上车的选择。云厂商(腾讯云、声网等)内部常为 SFU/MCU 混合架构,对外提供“单流上行 + 转推 CDN”的能力,把超大规模分发的成本转移给 CDN 流量包。
多数团队不会真的自建骑手军团或中央厨房——他们会把部分路段包给外卖平台(CDN),把部分菜品外包给云厂商(云 MCU)。理解了 SFU 与 MCU 的流量与算力本质,你才能理性评估:自己该租哪条配送线路、该租多少容量。
- N_speaker 是发言者人数真正开麦/开摄像头、需要被所有人看到的人。
- N_viewer 是观众人数只收不发(或仅少量上行信令)的观看端数量。
- 混合架构的出口观众下行只需要 $N_{speaker}$ 路转发,而非全员 $N$ 路。
- CDN 卸载若把观众流量转推 CDN,CDN 侧的带宽费用通常远低于自建机房出口专线费用。
AI 应用场景
远程医疗多学科会诊(MCU 典型场景)
阶段:需求分析与架构选型
解决的问题:多科室专家会诊是典型的小规模固定会议(5~10 人),要求统一画面、稳定画质与强管控。如果采用纯 SFU,每路下行要复制多份,专家画面质量参差,录制与专家席展示也难统一;MCU 把多路视频混合为一路广播流,画面一致、录播简单、运维可控。
具体案例:某三甲医院远程会诊平台,专家端通过 WebRTC 接入,MCU 将 CT 影像共享流与两位主诊医生画面混合编码,输出 1080p 高清合流到各科室会诊室。整个平台仅需 2 台高配服务器即可支撑日均 40 场会诊。
万人直播互动课(SFU + CDN 混合场景)
阶段:容量规划与部署实施
解决的问题:大班直播课动辄上万观众,若人人可上行,SFU 的 $N^{2}$ 出口模型会瞬间击穿机房带宽。通过“主讲人单路上行 + SFU 转发 + 转推 CDN”的组合,把观众流量卸载到 CDN,服务器出口从 $N^{2}$ 降为 $N_{speaker} \times N_{viewer}$ 的线性可控水平。
具体案例:某在线教育公司用 mediasoup 搭建 SFU 集群,主讲端 2Mbps 上行,服务器转推 CDN 后,10 万学员通过 WebRTC/HLS 观看,对比纯 SFU 方案整体带宽成本下降约 90%,互动区延迟控制在 500ms 内。
混合架构支撑“大课+小组讨论”
阶段:技术选型与架构演进
解决的问题:一个平台既要承载千人主会场,也要支撑 6~8 人的小组讨论。单一架构无法两全:主会场用 SFU 保大规模,小组讨论用小规模 MCU 保证统一画质与低管理成本,两者通过信令层路由互通。
具体案例:某独角兽企业将 mediasoup 用作主会场 SFU,同时架设一组小型 MCU 节点处理小组讨论流,两组音视频通过 SFU 网关桥接。上线后单场活动支撑 5000 人主会场 + 200 个并行讨论组,服务器成本仅为纯 SFU 方案的 1/3。
Python 演示
"""SFU vs MCU 带宽与成本模拟器""" def sfu_traffic(n, b): """SFU 流量模型:每路上行1份,服务器下行转发N-1份""" up = n * b down = n * (n - 1) * b return up, down, up + down def mcu_traffic(n, b, b_mix): """MCU 流量模型:每路上行1份,混合后下行统一1份""" up = n * b down = n * b_mix return up, down, up + down def main(): print("人数 SFU总流量 MCU总流量 MCU省流量") for n in [4, 8, 16, 32, 64]: b = 1.0 b_mix = 1.0 _, _, sfu_total = sfu_traffic(n, b) _, _, mcu_total = mcu_traffic(n, b, b_mix) saving = (1 - mcu_total / sfu_total) * 100 print(f"{n:>4} {sfu_total:>9.1f} {mcu_total:>10.1f} {saving:>9.1f}%") if __name__ == "__main__": main()
def sfu_traffic(n, b):定义 SFU 流量模型函数,输入人数与单路码率。down = n * (n - 1) * bSFU 下行核心公式:每路源被复制给其余 N-1 人,这是平方爆炸的根源。def mcu_traffic(n, b, b_mix):定义 MCU 流量模型函数,混合码率通常取单路码率。down = n * b_mixMCU 下行线性公式:只有一路混合流,按人数线性分發。saving = (1 - mcu_total / sfu_total) * 100计算 MCU 相对 SFU 节省的带宽百分比。for n in [4, 8, 16, 32, 64]:从 4 人到 64 人逐步放大规模,观察节省比例趋近 100%。
常见误区
误区网上都说 SFU 不用转码、只转发,那它应该不吃 CPU,服务器随便买台便宜的就行。
正解SFU 虽然不做编解码,但仍有 RTP 包路由、网络地址转换辅助、丢包统计、带宽探测、连接状态维护等任务。在高并发下,包级处理同样会消耗不少 CPU,只是系数远小于 MCU 的编解码开销。把它理解为“骑手虽然不炒菜,但取餐、认路、爬楼都要花力气”更准确。
为何常见:“SFU 不转码”被媒体反复强调,初学者容易把“不做某件事”等同于“什么都不做”。
误区SFU 给每人发 N-1 路,MCU 给每人发 1 路,都是下发给 N 个人,感觉差不多。
正解关键差别不在“份数”而在“每一份的大小”。SFU 的每份是原始单路码率 $b$,且每人要收 $N-1$ 份,总量是 $N(N-1)b$ 的数量级;MCU 的每份是混合后的统一码率 $b_{mix}$,通常约等于单路码率,总量只有 $N \times b_{mix}$。人数越大,两者差距越悬殊。
为何常见:只数了路径条数,没有把“每条路径承载的码率”和“复制次数”算进去。
误区SFU 只转发,路径短;MCU 要解码混合再编码,肯定是 MCU 更慢。
正解MCU 确实多了编解码处理延迟,但它拥有全局视角,能在服务器侧统一做抖动缓冲与码率调度,端到端的音画同步往往更平滑。SFU 虽转发快,但接收端要同时解码多路流并做播放同步,在弱网下可能产生更大的端到端延迟。延迟高低取决于整体设计,而非单看混合工序。
为何常见:把“多一道工序”直观等同于“一定更慢”,忽略了系统级的调度收益。
误区SFU 省 CPU,那一直加带宽就能无限支撑更多人,不需要考虑别的。
正解SFU 的出口带宽随参会人数平方增长,而单台服务器的物理网卡带宽是有限的;即使横向扩容,也还需要考虑客户端下行带宽上限、接收端多路解码能力与路由节点转发性能。实践中必须用“观众只收不发”“转推 CDN”“N 选 1”等手段把 $N^{2}$ 降下来。
为何常见:“加带宽”听起来是万能解,忘掉了真实世界的物理上限与成本曲线。
面试题
Q1. SFU 的中文全称是什么?
- A.选择性转发单元← 正确答案
- B.多点控制单元
- C.混合拼接单元
- D.分级缓存单元
答案:A。SFU(Selective Forwarding Unit)的核心动作是“选择性转发”——把码流原样复制给需要的人;B 是 MCU,C 和 D 是干扰项。记住“只转不炒”就能选对。
Q2. MCU 服务器的核心动作是?
- A.原封不动转发RTP包
- B.解码混合后重编码← 正确答案
- C.只做信令消息透传
- D.缓存并延迟发送
答案:B。MCU 把多路输入流解码、拼合画面、再编码成一路输出流,因此选 B;A 描述的转发行为属于 SFU,C/D 都不是 MCU 的核心职责。
Q3. 4 人参会、单路码率 1Mbps 时,SFU 服务器出口下行带宽约为?
- A.4Mbps
- B.6Mbps
- C.12Mbps← 正确答案
- D.16Mbps
答案:C。SFU 下行总量为 $N(N-1)b=4 \times 3 \times 1=12$Mbps。4Mbps 是上行总量,16Mbps 是混淆了 $N^{2}b$ 的错误算法,6Mbps 无对应模型。
Q4. 同为 4 人参会、混合后码率 1Mbps 时,MCU 服务器出口下行带宽约为?
- A.3Mbps
- B.4Mbps← 正确答案
- C.12Mbps
- D.16Mbps
答案:B。MCU 下行总量为 $N \times b_{mix}=4 \times 1=4$Mbps。12Mbps 是 SFU 同场景的结果,3Mbps 少算了一路,16Mbps 是 $N^{2}$ 的错误外推。
Q5. 以下哪些属于 SFU 架构的特点?
- A.服务器无需视频转码← 正确答案
- B.出口带宽随人数平方增长← 正确答案
- C.所有客户端画面强制一样
- D.适合大规模直播型场景← 正确答案
答案:ABD。SFU 不转码、出口按 $N^{2}$ 增长,且观众只收不发时适合大规模直播,故选 A/B/D。C 是 MCU 的特点——混合后画面统一;SFU 下每个客户端可自由切换看谁的画面。
Q6. 64 人全员开麦的会议中,为控制 SFU 架构的成本,最有效的结构性措施是?
- A.限制观众上行权限← 正确答案
- B.给服务器扩容到万兆
- C.采用MCU全量混合
- D.强制全员开启摄像头
答案:A。限制观众只收不发,可把出口从 $N^{2}$ 降为 $N_{speaker} \times N_{viewer}$,是结构性降本;扩容万兆是被动堆资源,MCU 全量混合会引入巨大转码成本,强制开摄像头反而恶化问题。
Q7. 以下哪些场景更适合选择 MCU 架构?
- A.十人内小型固定会议← 正确答案
- B.数千人公开直播课堂
- C.需统一画质的制作直播← 正确答案
- D.超大规模秀场直播
答案:AC。小规模固定会议与制作级直播追求统一画面与集中管控,MCU 的混合输出更合适;数千人公开课与超大规模秀场直播的核心矛盾是带宽成本,应选 SFU 或 SFU+CDN。
Q8. SFU 架构中,主要由谁决定是否降低视频发送码率?
- A.服务器根据全局带宽决策
- B.客户端基于丢包反馈决策← 正确答案
- C.MCU中心控制器决策
- D.CDN边缘节点缓存决策
答案:B。SFU 服务器只转发不干预,发送端客户端根据接收端反馈的丢包率与延迟自行调整码率;A/C 描述的是 MCU 的集中决策方式,D 与码率决策无关。
Q9. 以下哪些是常见的开源或云原生 SFU 实现?
- A.mediasoup库← 正确答案
- B.Jitsi服务端← 正确答案
- C.LiveKit平台← 正确答案
- D.Nginx代理
答案:ABC。mediasoup、Jitsi Videobridge、LiveKit 都是主流 SFU 实现;Nginx 是通用 Web 服务器/反向代理,不承担 WebRTC 媒体转发职责。
Q10. “SFU + N 选 1 转推 CDN”的混合架构主要解决什么问题?
- A.大规模观看时的分发成本← 正确答案
- B.客户端无需任何解码能力
- C.消除所有转码延迟开销
- D.服务器无需任何网络带宽
答案:A。混合架构把观众流量从服务器卸载到 CDN,解决大规模观看时的分发成本问题;B 是纯 MCU 才能实现的特性,C 过于绝对,D 不现实——服务器仍需要承载发言者上行与转发链路。