粗浅认识WebRTC

500 阅读4分钟

WebRTC是Web Real-Time Communication(网页实时通信)

先定一个目标,创建一个视频通话。然后需要明确几个问题~

  1. 获取视频音频数据流?
  2. 如何创建点对点的数据通道?
  3. 什么是信令服务器?

视频数据流

这步最简单 一行代码~

navigator.mediaDevices.getUserMedia({})

数据通道

有了数据流(stream)我们就开始传输了,一般情况是 客户端》服务器》客户端,

而webrtc要做的是 p-to-p;

  • RTCPeerConnection:传输音视频流(通道)

  • RTCDataChannel: 用来上传音视频二进制数据(传输媒介)

信令服务器

虽然webrtc可以实现p2p,但由于流数据传输需要一条信道,而这个信道则是由信令服务器提供的。

也就是协调通讯的过程,为了建立一个webRTC的通讯过程,客户端需要交换回话信息,元数据,网络信息等等,而在webRTC中并没有这一过程,所以需要我们手动建立信号的传递和交涉过程;(SDP交互的过程)

通俗得讲,就是一个相亲的过程,双方方见面前,需要一个介绍人引荐一下~

WebRTC

  1. RTCPeerConnection:核心对象,每一个连接对象都需要新建该对象
  2. SDP(Session Description Protocol,会话描述协议):包含建立连接的一些必要信息,比如IP地址等,sdp由RTCPeerConnection对象方法创建,我们目前不需要知道该对象中的具体内容,使用黑盒传输即可
  3. 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: 接受端反馈给发起端,应答信息
  1. 通过 createOffer 生成 SDP 描述
  2. 过 setLocalDescription,设置本地的描述信息
  3. offer SDP 发送给接受端
  4. 过 setRemoteDescription,设置远端的描述信息
  5. 过 createAnswer 创建出自己的 SDP 描述
  6. 过 setLocalDescription,设置本地的描述信息
  7. anwser SDP 发送给发起端
  8. 过 setRemoteDescription,设置远端的描述信息。

而上述中的 sdp需要服务器传输,建立通信

对比

RTMP

RTMP 是基于 TCP 的标准协议,与 CDN 架构兼容,对客户来说在现有单向直播架构上,接入成本比较低,但是缺点也很明显:

  • 传输控制协议,是一种面向连接的协议,类似打电话
  • 在通信的整个过程中保持连接
  • 服务器压力比较大,资源消耗比较快,发送数据效率比较低,传输延时较大
  • 点对点的传输协议
  • 保证了数据传递的可靠性和有序性
  • 交互过程 会分别推送两个流到服务器,导致带宽、流量消耗过大,并且两路视频流解码播放,耗费CPU等资源也非常多。

UDP

  • 用户数据报协议,是一种非面向连接的协议,类似写信
  • 在通信的整个过程中不需要保持连接
  • 不保证数据传输的可靠性和有序性
  • 是一种双全工的数据报通信方式
  • 服务器压力比较小,资源比较低,发送效率比较高
  • 可以一对一、一对多、多对一、多对多

webrtc

WebRTC 的好处在于用户体验好,不需要安装东西,分享一个链接就可以看

  1. 方便。
  2. 免费
  3. 强大的打洞能力。WebRTC技术包含了使用STUN、ICE、TURN、RTP-over-TCP的关键NAT和防火墙穿透技术,并支持代理
  4. 传输质量难以保证