WebRTC学习进阶之路系列总目录:https://blog.csdn.net/xiaomucgwlmx/article/details/103204274
本文我们来看WebRTC的核心通信模块PeerConnection,来看下酒精是如何为通信多方建立连接,提供通信机制的。
一、核心类整体介绍
看过前边文章的应该都已经知道,WebRTC的源码中api中的都是给应用层提供的内容,具体的实现都会放到内部的各个模块中去,PC的整个设计亦是如此:
api/peer_connection_interface.h | |
PeerConnectionInterface | PC对外提供的所有方法。使用时应用层都是通过创建该对象然后进行各个方法的应用。 |
PeerConnectionFactoryInterface | PeerConnectionFactoryInterface是用于创建PeerConnection,MediaStream和MediaStreamTrack对象的工厂接口。通过CreatePeerConnection()创建PeerConnectionInterface。 |
pc/peer_connection_factory.h | |
PeerConnectionFactory | PeerConnectionFactory类提供了用于创建PeerConnection,MediaStream和MediaStreamTrack对象的工厂方法。PeerConnectionFactory继承于PeerConnectionFactoryInterface,做具体实现。 |
pc/peer_connection.h | |
PeerConnection | PeerConnection是PeerConnectionInterface API表面定义的PeerConnection对象的实现 |
二、建立连接的过程
WebRTC Peerconnection通信过程中的四种角色:
- Signaling Server
- ICE/TURN/STUN Server
- Remote Peer
- Local Peer
通信过程中的基本概念:
- Room:Signaling Server使用Room的概念对同一组通信的peers进行配对管理,一个room中包含有1个或者多个peers。当没有peers存在时room销毁;当第一个peer连接到signaling server时执行create room动作,此时因为没有其他peers,建立room的这个peer不与其他节点建立P2P通信;其他peers随后加入room,加入room后会主动与room已经存在的peer建立连接;
- Offer:主动与其他peer建立P2P链接的peer把自己的SDP信息整理好,通过signaling server转发给room里面的其他peer,这个SDP信息包就是Offer;
- Answer:被动连接的Peer在收到signaling server转发的其他peer的offer信息以后,也把自己的SDP信息整理好,同样通过signaling server转发给主动连接它的peer,他自己的SDP信息包就是Answer;
- IceCandidate:Peer与ICE/TURN/STUN Server直接建立连接,获取自己的NAT类型以及外网IP和端口,这些ICE/TURN/STUN Server返回的消息就是IceCandidate或者直接简称Candidate;
PeerConnection连接建立流程图:
对于上图中描述的PeerConnection建立的完整流程进行以下说明(上图是以ClientA主动向ClientB发起连接为例):
- 首先ClientA和ClientB均通过双向通信方式如WebSocket连接到Signaling Server上;
- ClientA在本地首先通GetMedia访问本地的media接口和数据,并创建PeerConnection对象,调用其AddStream方法把本地的Media添加到PeerConnection对象中。对于ClientA而言,既可以在与Signaling Server建立连接之前就创建并初始化PeerConnection如阶段1,也可以在建立Signaling Server连接之后创建并初始化PeerConnection如阶段2;ClientB既可以在上图的1阶段也可以在2阶段做同样的事情,访问自己的本地接口并创建自己的PeerConnection对象。
- 通信由ClientA发起,所以