这篇文章上次修改于 902 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输,支持网页浏览器进行实时语音对话或视频对话。

参考 https://github.com/bovinphang/WebRTC

1 WebRTC API

为了获取和传送流数据,WebRTC 应用需要实现以下 API:

  • MediaStream: 通过 MediaStream 的 API 能够通过设备的摄像头及话筒获得视频、音频的同步流
  • RTCPeerConnection:用来在浏览器之前高效的处理固定数据流的通道。该通道是点对点的,无需服务器中转。
    但在真实的应用场景中,往往需要服务器的配合才能完成数据交互,因此还需要如下几种服务器:

    • 用户发现以及通信
    • Signaling:信令传输,信令包括:
      会话控制消息用于打开或关闭通信
      错误消息
      媒体元数据,如编解码器和编解码器设置,带宽和媒体类型
      密钥数据,用于建立安全的连接
      网络数据,如:外界看到的主机 IP 地址和端口
    • STUN:NAT/防火墙穿透
    • TRUN:如果点对点通信建立失败,可以作为中转服务器
      ICE(Interactive Connectivity Establishment) 框架中整合了 STUN 和 TRUN 等服务

参考 http://www.aman.site/tags/#WebRTC

2 RTCPeerConnection 初始化

  • 确定本地媒体条件,如分辨率和编解码器功能,这是用于 offer 和 answer 机制的元数据。需要通 Signaling 服务器透传 SDP 信息。SDP 会话描述协议用于描述连接的多媒体内容(如分辨率,格式,编解码器,加密等)。
  • 获取应用程序主机的潜在网络地址,成为候选人(candidates)

详见 https://michaelyou.github.io/2018/08/01/%E7%9C%9F%E5%AE%9E%E4%B8%96%E7%95%8C%E4%B8%AD%E7%9A%84WebRTC/

3 多方通信 WebRTC 架构

  • Mesh:多个终端两两连接
  • MCU:由一个服务器和多个终端组成。各个终端将要共享的音视频流发送给服务器,服务器转发给各个终端。服务端需要将所有终端的音视频进行混合。
  • SFU:由一个服务器和多个终端组成。各个终端将要共享的音视频流发送给服务器,服务器转发给各个终端。服务端不用将所有终端的音视频进行混合。

参考 https://blog.csdn.net/weixin_40592935/article/details/104779851

4 Janus

WebRTC Server,主要由三部分组成:

  • Core:处理数据流的转发和各种协议的接入,包含了 ICE、SDP、RDP 等。
  • Plugin:实现了一般性的需求供客户端使用。
  • Transport:信令传输层,支持的协议包括 HTTP、Websocket 等。

详见 https://www.jianshu.com/p/78f2689158dd

使用 Janus 的 Plugin 提供的 API 进行通信:

  • 创建 Janus 客户端,需要填写 Signaling 服务器地址。
  • 调用客户端的 attach() 到 plugin 上。回调函数:

    • success() 可获取控制 stream 的 handler,比如可对 stream 进行 detach;
    • onmessage() 用来交换 SDP 信息;
    • onremotestream() 用来获取 stream,进而获得 stream 的跟踪信息,如 stream.getVideoTracks() 等。

资料

https://webrtc.org.cn/