浅谈WebRTC
什么是webRTC
维基百科是这样定义的:WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。简单来说就是网页用来音视频通话的。
完成音视频需要4个模块:
本地媒体流的采集
getUserMedia
使用navigator.mediaDevices.getUserMedia( constraints );
获取本地的媒体流。constraints指定了请求的媒体类型和参数
属性 | 含义 |
---|---|
width | 视频宽 |
height | 视频高 |
facingMode(user,environment) | 镜像模式 |
aspectRatio | 比例 |
frameRate | 帧率 |
resizeMode | 大小模式 |
像width/height等可以用普通的关键字也可以用ideal,min,max,exact修饰,其中exact表示的是很确认的即一定意思。
STUN/TURN 服务器
ICE集成了多种NAT(网络地址转化)穿越技术比如STUN、TURN。
在介绍STUN/TURN之前先说下NAT
NAT常常部署在私网到公网的路由出口,死亡设备通过NAT将内网转化为公网加入互联网
STUN允许唯一NAT的客户端找出自己的公网地址。
STUN是C/S模式的协议,客户端发送STUN请求,STUN服务响应告知由NAT分配给主机的IP地址和端口号。所以就需要先在公网上架设一台STUN服务器,像STUN服务器发送请求就能拿到公网IP
TURN是一种数据传输协议。允许通过TCP或UDP方式穿透NAT或防火墙。
STUN和TRURN都是通过公网IP地址达到NAT穿透
信令服务器
因为WebRTC的SDP和和ICE要通过服务器来传到另一个客户端上,因为SDP和ICE这些东西我们将他叫做信令,所以传输信令的服务器我们就将其称作是信令服务器了,一般利用WebSocket的实时通信能力搭建信令服务器。
SDP(Session Description Protocol)会话描述协议:包括浏览器所支持的编码格式以及ICE代理、MediaStreamTrack等信息
SPD协议结构 : <type> = <value>
端与端之间P2P连接
创建了本地的媒体流怎么把本地的媒体流和另一个客户端上的媒体流连接起来呢?
所以WebRTC的灵魂就是这个了peerConnection。记住了P2P全靠它
pc = new RTCPeerConnection(pcConfig)
,好了有pc了,怎么连接呢?
分两步:
- 发送端先调用createOffer创建(SDP Offer)
- 通过setLocalDescription将(SDP Offer)加入到pc中:将会话信息传递到CIE曾
addIceCandidate添加ICE代理
其实我这里大概写了一下创建P2P信息的基本流程,但是写的不清不楚,所以我先总结一下到了最后再详细的写一下创建链接的步骤。
总体来说:A端将自己的candidate offer 存到了B端的PC中,B端也将自己的candidate,answer存到了A端的PC中,交换完成之后AB中都有了双方SDP,这样他们可以选择他们相同的编码等,收集的ICE完成连通性检测后,P2P链接就建立成功了。
P2P建立链接过程
-
AB 创建本地媒体流 (假设 A 是发送方,B 是接收方,客户端简称为 C 端,服务端简称为 S)
-
AB peer = new RTCPeerConnection
-
监听 peer 的事件
-
onicecandidate 如果本地代理 SDP Offer 并调用后,将 candidate 发送给对方
-
onaddstream 如果有视频流就拿到视频流
-
将本地视频流添加到 peer 中
-
A 创建 offerA 并加入到 peerA 里
-
AC setLocalDescription 后会触发 onicecandidate
-
AC 触发 onicecandidate S 就会收到来自 AC 的 candidate
-
S 将 AC 的 candidate 转发到 BC, BC 将 candidate 存入到 peerB 中
-
AC 将 OfferA 发送给 BC
-
BC 接收到 offerA 后,将 offerA 存入到 peerB 中
上面的过程后 AB 将会建立好连接,然后 A B 监听的 onaddstream 事件就会有 stream 流入