为了让初学者快速起步把 WebRTC demo 跑起来,我写了一个极其简单的 startup demo 项目,展现了如何基于 WebRTC API 实现一对一的视频通话。该项目地址:https://github.com/Jhuster/RTCStartupDemogit
本文则主要介绍如何从一对一通话升级到多人通话,即视频会议,其中涉及到以下几个问题:github
多人会议,每一个 Client 是建立多个 PeerConnection 仍是只有一个 PeerConnection ?web
多人会议,谁来发起 OFFER,谁来做为 ANSWER,如何把多个 Client 相互间的链接分别创建起来 ?服务器
首先,咱们用下面这一张图来看看两个 WebRTC Peer 之间是如何创建一对一通话链路的:微信
在一对一通话场景中,每一个 Client 均建立有一个 PeerConnection 对象,由一方主动发 OFFER SDP,另外一方则应答 ANSWER SDP,最后双方交换 ICE Candidate 从而完成通话链路的创建。tcp
若是要再加入一我的,其实也是同样的流程,假设新加入的人是 C,那么,只须要 C 分别跟 A 和 B 交换 SDP 和 Candidate 便可创建新的通话链路。C 加入后,谁来主动发送 OFFER 呢 ?经常使用的策略有 2 种:ide
每当有新的成员加入到房间后,房间内的每一个人主动给新成员发 OFFER,并等待他回复 ANSWER 创建新的 PeerConnection 链接优化
每当有新的成员加入到房间后,新成员主动给房间的每一个人发 OFFER,并等待 ANSWER 创建新的 PeerConnection 链接视频
固然,还有其余的策略,无非就是谁主动扮演 OFFER 发起者的角色触发整个建联过程而已。对象
如图所示,3 人会议,则每一个人都会建立 2 个 PeerConnection 分别与其余两我的创建通话链接。
我这里实现了一套 Web 端 3 人连麦会议的 demo 代码,完整地复现了上述场景和逻辑,你们有兴趣能够看一看:
https://github.com/Jhuster/RTCStartupDemo/tree/master/RTCClientDemo/Web/multiple
本文一直描述的是经过多 PeerConnection 的方案来实现多人会议,那么,是否也能够仅仅使用单个 PeerConnection 呢 ?答案是确定的,不过这须要服务器端的参与,让多路流经过一个 PeerConnection 链接端口进行传输,到端上再利用 ***c 等信息提取和分离出来,总体来讲要复杂不少,可是也是有很多好处的。
有一篇文章关于单 PeerConnection 和多 PeerConnection 的优劣分析,有兴趣的小伙伴能够看看,连接以下:
《WebRTC RTCPeerConnection. One to rule them all, or one per stream?》
简单来讲,多 PeerConnection 会致使链接到 SFU 服务器的链接数量超多,对服务端的压力是比较大的;另外,多 PeerConnection 也比单 PeerConnection 要消耗更多的资源。而单 PeerConnection 虽然整个逻辑复杂,可是在上述这两点上仍是有一些不错的优化的。
关于 WebRTC 如何从一对一通话到多人会议,就分享到这里了,若有疑问的小伙伴欢迎来信 lujun.hust@gmail.com 交流。另外,也欢迎你们关注个人新浪微博 @卢_俊 或者 微信公众号 @Jhuster 获取最新的文章和资讯。