WebRTC是Web Real-Time Communication(网页实时通信)
先定一个目标,创建一个视频通话。然后需要明确几个问题~
- 获取视频音频数据流?
- 如何创建点对点的数据通道?
- 什么是信令服务器?
视频数据流
这步最简单 一行代码~
navigator.mediaDevices.getUserMedia({})
数据通道
有了数据流(stream)我们就开始传输了,一般情况是 客户端》服务器》客户端,
而webrtc要做的是 p-to-p;
-
RTCPeerConnection:传输音视频流(通道)
-
RTCDataChannel: 用来上传音视频二进制数据(传输媒介)
信令服务器
虽然webrtc可以实现p2p,但由于流数据传输需要一条信道,而这个信道则是由信令服务器提供的。
也就是协调通讯的过程,为了建立一个webRTC的通讯过程,客户端需要交换回话信息,元数据,网络信息等等,而在webRTC中并没有这一过程,所以需要我们手动建立信号的传递和交涉过程;(SDP交互的过程)
通俗得讲,就是一个相亲的过程,双方方见面前,需要一个介绍人引荐一下~
WebRTC
- RTCPeerConnection:核心对象,每一个连接对象都需要新建该对象
- SDP(Session Description Protocol,会话描述协议):包含建立连接的一些必要信息,比如IP地址等,sdp由RTCPeerConnection对象方法创建,我们目前不需要知道该对象中的具体内容,使用黑盒传输即可
- ICE(Interactive Connectivity Establishment,交互式连接建立技术):用户之间建立连接的方式,用来选取用户之间最佳的连接协议
https配置
getUserMedia本地测试获取视频需要https才可以~
// 创建服务器和客户端的私钥
$ openssl genrsa -out server.key 1024
$ openssl genrsa -out client.key 1024
// 创建服务器和客户端的公钥
$ openssl rsa -in server.key -pubout -out server.pem
$ openssl rsa -in client.key -pubout -out client.pem
// 生成 365 天的临时证书
// 创建过程有很多填写项,我都随便写和回车,但是有个Common Name (e.g., YOUR name) 这一项需要填写完整的域名(不过本地也无所谓,ip访问就好)
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
// 创建一个CA来自签名的数字证书(本地就不用了)
$ openssl genrsa -out ca.key 1024
$ openssl req -new -key ca.key -out ca.csr
$ openssl x509 req -in ca.csr -signkey ca.key -out ca.crt
通信的过程
通信的过程有两个基本的概念,offer,answer
- offer: 发起端向其他用户提供 请求流的基本信息
- answer: 接受端反馈给发起端,应答信息
- 通过 createOffer 生成 SDP 描述
- 过 setLocalDescription,设置本地的描述信息
- offer SDP 发送给接受端
- 过 setRemoteDescription,设置远端的描述信息
- 过 createAnswer 创建出自己的 SDP 描述
- 过 setLocalDescription,设置本地的描述信息
- anwser SDP 发送给发起端
- 过 setRemoteDescription,设置远端的描述信息。
而上述中的 sdp需要服务器传输,建立通信
对比
RTMP
RTMP 是基于 TCP 的标准协议,与 CDN 架构兼容,对客户来说在现有单向直播架构上,接入成本比较低,但是缺点也很明显:
- 传输控制协议,是一种面向连接的协议,类似打电话
- 在通信的整个过程中保持连接
- 服务器压力比较大,资源消耗比较快,发送数据效率比较低,传输延时较大
- 点对点的传输协议
- 保证了数据传递的可靠性和有序性
- 交互过程 会分别推送两个流到服务器,导致带宽、流量消耗过大,并且两路视频流解码播放,耗费CPU等资源也非常多。
UDP
- 用户数据报协议,是一种非面向连接的协议,类似写信
- 在通信的整个过程中不需要保持连接
- 不保证数据传输的可靠性和有序性
- 是一种双全工的数据报通信方式
- 服务器压力比较小,资源比较低,发送效率比较高
- 可以一对一、一对多、多对一、多对多
webrtc
WebRTC 的好处在于用户体验好,不需要安装东西,分享一个链接就可以看
- 方便。
- 免费
- 强大的打洞能力。WebRTC技术包含了使用STUN、ICE、TURN、RTP-over-TCP的关键NAT和防火墙穿透技术,并支持代理
- 传输质量难以保证