webrtc基础知识点二
WebRTC的实现原理
- WebRTC的音视频通信是基于P2P,P2P的连接恰恰数据通道一旦形成,中间是不经过服务端的,数据直接从一个客户端流向另一个客户端:客户端A⇋客户端B ... 客户端A⇋客户端C ...(可以无数个客户端之间互联)。
WebRTC的服务器与信令
WebRTC提供了浏览器到浏览器(点对点)之间的通信,但并不意味着WebRTC不需要服务器。暂且不说基于服务器的一些扩展业务,WebRTC至少有两件事必须要用到服务器
-
浏览器之间交换建立通信的
元数据(信令)必须通过服务器。-
我们在A和B需要建立P2P连接的时候,至少要服务器来协调,来控制连接开始建立。而连接断开的时候,也需要服务器来告知另一端P2P连接已断开。这些我们用来
控制连接的状态的数据称之为信令,而这个与服务端连接的通道,对于WebRTC而言就是信令通道。 -
# 信令能做的事还有很多,这里大概列了一下: 1、用来控制通信开启或者关闭的连接控制消息 2、发生错误时用来彼此告知的消息 3、媒体流元数据,比如像解码器、解码器的配置、带宽、媒体类型等等 4、用来建立安全连接的关键数据 5、外界所看到的的网络上的数据,比如IP地址、端口等
-
WebRTC的API
WebRTC主要实现了三个API,分别是:
MediaStream:通过MediaStream的API能够通过设备的摄像头及话筒获得视频、音频的同步流RTCPeerConnection:RTCPeerConnection是WebRTC用于构建点对点之间稳定、高效的流传输的组件RTCDataChannel:RTCDataChannel使得浏览器之间(点对点)建立一个高吞吐量、低延时的信道,用于传输任意数据。
其中RTCPeerConnection是我们WebRTC的核心组件。
WebRTC建立点对点连接的流程:
-
A和B连接上服务端,建立一个TCP长连接(任意协议都可以,WebSocket/MQTT/Socket原生/XMPP),我们这里为了省事,直接采用
WebSocket,这样一个信令通道就有了。 -
A从
ice server(STUN Server)获取ice candidate并发送给Socket服务端,并生成包含session description(SDP)的offer,发送给Socket服务端。 -
Socket服务端把A的offer和
ice candidate转发给B,B会保存下A这些信息。 -
然后B发送包含自己
session description的answer(因为它收到的是offer,所以返回的是answer,但是内容都是SDP)和ice candidate给Socket服务端。 -
Socket服务端把B的
answer和ice candidate给A,A保存下B的这些信息。至此A与B建立起了一个P2P连接。
用户操作
以使用WebSocket为例,上面用户操作的流程可以进行以下修改:
- 客户端与服务器建立WebSocket连接
- 发送一个加入聊天室的信令(join),信令中需要包含用户所进入的聊天室名称
- 服务器根据用户所加入的房间,发送一个其他用户信令(peers),信令中包含聊天室中其他用户的信息,客户端根据信息来逐个构建与其他用户的点对点连接
- 若有用户离开,服务器发送一个用户离开信令(remove_peer),信令中包含离开的用户的信息,客户端根据信息关闭与离开用户的信息,并作相应的清除操作
- 若有新用户加入,服务器发送一个用户加入信令(new_peer),信令中包含新加入的用户的信息,客户端根据信息来建立与这个新用户的点对点连接
- 用户离开页面,关闭WebSocket连接