15、多人通话:SFU架构、MCU架构、Mesh架构对比
多人通话,说白了就是让三个以上的人同时在线聊天。你想想看,两个人通话已经够复杂了,三个人、十个人、一百个人呢?这里面的技术选型,直接决定了你的服务器成本、客户端性能,还有用户体验。
我最早做WebRTC项目时,第一个多人通话功能就是用的Mesh架构。当时觉得简单啊,不用服务器转发,客户端之间直接连。结果呢?会议室里一超过四个人,手机就开始发烫,画面卡成PPT。嗯,从那以后我才认真研究起SFU和MCU来。
今天咱们就把这三种架构掰开揉碎了讲清楚。我会结合自己踩过的坑,帮你理清什么时候该选哪种。
一、三种架构的核心区别
先给你一张总览图,心里有个谱:
说白了,这三种架构的区别就在于:谁来做音视频数据的转发和处理。Mesh让客户端自己搞定,MCU和SFU则交给服务器。但服务器做的事儿又不一样——MCU是"合流",SFU是"转发"。
二、Mesh架构:简单但有限
Mesh架构是最直观的方案。每个客户端都跟其他所有客户端建立P2P连接。4个人开会,每个人要跟另外3个人建立连接,总共6条连接。
核心特点:
- 不需要服务器转发,节省带宽成本
- 延迟最低,因为是直连
- 客户端上行带宽 = 1路 × N(N为人数)
- 客户端下行带宽 = (N-1)路
我刚开始做移动端开发时,觉得Mesh架构太香了。不用搭服务器,直接用WebRTC的RTCPeerConnection就能搞定。但实际跑起来才发现问题。
避坑指南:我曾经在一个项目中用Mesh架构支持6人会议,结果iPhone 8上行带宽被撑到8Mbps,手机直接过热降频。后来我们限制到最多4人,才勉强能用。
Mesh架构的瓶颈很明显:
- 上行带宽爆炸:每个人要上传1路视频给N-1个人,4个人还好,10个人就得上传9路
- CPU/GPU压力大:要同时编码N-1路视频,移动端根本扛不住
- NAT穿透困难:连接数越多,打洞失败的概率越高
适用场景:Mesh架构只适合2-4人的小规模会议。超过4人,我建议你直接放弃这个方案。
三、MCU架构:服务器做"合流"
MCU(Multipoint Control Unit)架构,服务器会接收所有人的音视频流,然后解码、合流、再编码成一路流,分发给每个客户端。
你想想看,客户端只需要收1路流,解码一次,画面上显示的是服务器已经拼好的"九宫格"或者"演讲者模式"。这对移动端来说,压力小太多了。
| 对比项 | MCU | SFU |
|---|---|---|
| 服务器工作 | 解码 + 合流 + 编码 | 只转发,不解码 |
| 客户端接收 | 1路流 | N-1路流 |
| 服务器CPU消耗 | 极高 | 低 |
| 灵活性 | 低(布局固定) | 高(可自由选择) |
| 延迟 | 较高(多一次编解码) | 低(只转发) |
我记得有一次做教育类App,客户要求支持50人同时在线。我们一开始选了MCU,结果服务器成本高得吓人。一台8核服务器只能支持20人左右。后来换成SFU,同样的服务器能支持100人以上。
我的建议:除非你的场景对客户端性能要求极其苛刻(比如低端Android机),否则尽量别用MCU。服务器成本太高,而且延迟也比SFU大。
四、SFU架构:当前的主流方案
SFU(Selective Forwarding Unit)架构,服务器只做一件事:转发。它不解码、不编码、不合流。每个客户端上传1路流到服务器,服务器把这路流复制N-1份,分发给其他所有人。
说白了,SFU就是个"智能路由器"。它知道谁在说话、谁在看谁,可以按需转发。比如你只看演讲者,那服务器就只给你转发演讲者的流,其他人的流可以暂停。
我现在的项目全部用SFU。为什么?
- 服务器成本低:只转发,不编解码,CPU消耗小
- 延迟低:少了一次编解码过程
- 灵活性高:客户端可以自由选择看谁、收谁的流
- 支持Simulcast:服务器可以根据客户端带宽,选择不同分辨率的流转发
Simulcast 是什么?简单说,就是发送端同时编码多路不同分辨率的视频流(比如720p、360p、180p)。SFU根据接收端的网络状况,选择合适的一路转发。这样手机端收小流,PC端收大流,体验更好。
SFU也有缺点。客户端要收N-1路流,解码N-1次。如果人数太多(比如50人),移动端还是扛不住。这时候就需要结合视频流订阅机制——只订阅当前活跃的几路流。
五、如何选择?我的实战经验
我做了这么多项目,总结下来就一句话:小规模用Mesh,中大规模用SFU,MCU尽量别碰。
具体来说:
- 2-4人:Mesh架构,简单直接,零服务器成本
- 5-20人:SFU架构,性价比最高
- 20人以上:SFU + 视频流订阅 + Simulcast
- 特殊场景:如果客户端全是低端设备,可以考虑MCU,但要做好服务器成本预算
嗯,这里要注意一点。选型不是一成不变的。我见过一个项目,初期用Mesh,用户量上来后无缝切换到SFU。关键是架构设计时要留好扩展性,别把自己写死了。
最后提醒:不管选哪种架构,移动端的发热和耗电都是大问题。建议开启Simulcast,让手机只编码1路流。同时做好带宽估计,动态调整分辨率。我曾经因为没做带宽自适应,导致用户在弱网下疯狂重连,体验极差。
好了,三种架构的对比就讲到这里。你心里应该有个谱了。下一节咱们会深入SFU的部署和优化,到时候我会分享更多实战中的坑和技巧。
公众号:蓝海资料掘金营,微信deep3321