Openvidu Server 的WebRTC通讯实现 I

Kurento 是一个不错的基于webRTC的音视频媒体服务器。 Openvidu在kurento的基础上实现了音视频会议的功能。我们部署了Openvidu的社区版,在单机上实现了webRTC音视频会议的搭建。为了更进一步了解openvidu,我们有必要花些时间看看openvidu做了什么和怎么实现webRTC通信的。

  1. WebRTC 模型
    WebRTC(Web Real-Time Communication)目的主要是让Web开发者能够基于浏览器轻易快捷开发出丰富的实时多媒体应用,而无需下载安装任何插件.
    webRTC由浏览器提供底层的音视频编码和通讯功能,通过方便的web接口提供给用户快速实现端到端的音视频功能。虽然浏览器封装了很多底层功能,但是对于基于webRTC的应用开发,仍需要了解多个概念。

image.png

上图是一个webRTC的通讯模型,ICE([Interactive Connectivity Establishment ]) 是一个框架,允许两个浏览器建立端到端的连接。
现在,我们大多数用户的PC都位于NAT网关的后面。要实现两个浏览器的通讯,通常需要NAT的穿透,这个在ICE框架里是通过STUN和TURN来实现的。
Peer A 想和Peer B通信, 首先需要知道Peer A自己的IP(外网IP)和PeerB的IP,然后两者才能交换信息来建立连接,获取自己的网络信息的机制称为STURN(Session Traversal Utilities for NAT)
但有时后,由于NAT网关是Symmetric NAT(简单的理解无法用外网IP和端口确定对方),这时候需要TURN(Traversal Using Relays around NAT (TURN) server作为中继, 两者不直接通信。
浏览器实现了ICE的框架,我们在搭建WebRTC时需要自己搭建STUN 和 TURN 服务器,它们现在有很多的开源实现。

有了ICE的帮助, 浏览器可以知道自己的外网IP和映射端口等信息,但是在建立webRTC连接前,仍需要互相交换各自的信息, 这个过程并没有在WebRTC框架里定义,所以需要自己来实现。webrtc规范制定组认为,信息的交换应该支持任意方式。这些需要交换的信息被称为signal,而实现signal交换就要借助signaling server. 下面是一个更全的webRTC通信模型。


image.png

-- PeerB 想和PeerA通信, 首先他需要告诉B,我想和你通信,所以PeerA 通过signal Server 发送给PeerB 一条自己要建立连接的音视频媒体信息(称为offer,包含webrtc建立需要的信息,但并不包含IP和端口等连接信息).
Notes:这里的offer只包含媒体信息,不包含通信连接信息(IP, 端口等)
-- peer B 收到A 的offer后,保存在本地,并生成自己的offfer返回给A(成为answer offer).
-- PeeA 与PeerB 告诉浏览器开始连接, 浏览器通过ICE框架,不断的发送给可能建立连接的IP和端口。他们封装为candidate,通过 Signal Server发送给彼此。
--- 收到对方的candidate后,PeerA ,peer B开始尝试建立连接。
---双方最终完成连接的建立,开始音视频通信。
上面就是一个基本的WebRTC的通信模型。可以看到需要通信,需要STUN Server, TURN Server, 还有signal server.

  1. Openvidu 于 kurento server的通信
    回到openvidu和kurento,如下图,openvidu实际就是Signal Server, 而kurento其充当的是音视频代理的做用。也就是peerA于peerB并不是直接相连的,PeerA与Kurento直接相连,peerB也与kurento直接相连。 然后kurento完成他们媒体的处理与交换。


    image.png

    kurento的这种连接模式称为SFU(Selective Forwarding Unit),它作为中间服务器,只做音视频数据的接收与转发,不进行解码或者重新编码,因此对服务器的压力比较小。
    另外kurento使用这种模式的一个重要原因是为了图像处理,在服务器端使用不同的filter可以实现特定的图像处理功能。
    使用SFU模式的特点是:每一个peer需要建立一个上行通道,用来发布自己的音视频数据;同时需要建立(N-1)个下行通道,用于订阅其它peers的音视频数据。
    通过了解webrtc,openvidu,kurento server的基本通信概念,我们可以得到下面的总结:
    A. Webrtc 使用端到端的连接方式,依赖ICE框架建立双方的连接。web浏览器实现了这个框架,但仍需我们自行搭建STURN和TURN服务器。
    B. Openvidu作为Signaling Server,用于个端点之间的信号信息通讯,它一方面连接端点,一方面连接kurento。
    C. Openvidu+ Kurento 采用的是SFU方式建立webrtc通讯, 每个pc端需要建立一个发布通道和(n-1)个订阅通道。

推荐阅读更多精彩内容