流媒体 - webrtc基础知识点二

857 阅读3分钟

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能够通过设备的摄像头及话筒获得视频、音频的同步流
  • RTCPeerConnectionRTCPeerConnection是WebRTC用于构建点对点之间稳定、高效的流传输的组件
  • RTCDataChannelRTCDataChannel使得浏览器之间(点对点)建立一个高吞吐量、低延时的信道,用于传输任意数据。

其中RTCPeerConnection是我们WebRTC的核心组件。

WebRTC建立点对点连接的流程:

Alt text

  • 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 descriptionanswer(因为它收到的是offer,所以返回的是answer,但是内容都是SDP)和ice candidate给Socket服务端。

  • Socket服务端把B的answerice candidate给A,A保存下B的这些信息。

    至此A与B建立起了一个P2P连接。

用户操作

以使用WebSocket为例,上面用户操作的流程可以进行以下修改:

  • 客户端与服务器建立WebSocket连接
  • 发送一个加入聊天室的信令(join),信令中需要包含用户所进入的聊天室名称
  • 服务器根据用户所加入的房间,发送一个其他用户信令(peers),信令中包含聊天室中其他用户的信息,客户端根据信息来逐个构建与其他用户的点对点连接
  • 若有用户离开,服务器发送一个用户离开信令(remove_peer),信令中包含离开的用户的信息,客户端根据信息关闭与离开用户的信息,并作相应的清除操作
  • 若有新用户加入,服务器发送一个用户加入信令(new_peer),信令中包含新加入的用户的信息,客户端根据信息来建立与这个新用户的点对点连接
  • 用户离开页面,关闭WebSocket连接