当前的音视频聊天功能很普通,社会对这方面的需求也很高,疫情期间的在线问诊模式解决类大量急需就医问诊患者的燃眉之急,我们需要了解WebRTC实现实时音视频聊天功能是如何操作的。
什么是WebRTC?WebRTC是 Google 在 2010 年以 6820 万美元收购 VoIP 软件开发商 Global IP Solutions 的 GIPS 引擎,并改名为“WebRTC”于 2011 年将其开源的旨在建立一个互联网浏览器之间的音视频和数据实时通信的平台。它提供了实时音视频的核心技术,包含音视频的采集、编解码、网络传输、显示等功能。
社交软件中的音视频聊天功能,医疗领域的在线问诊、远程会诊的功能,视频互动直播、在线教育等。
紫色部分是Web开发者API层
蓝色实线部分是面向浏览器厂商的API层
蓝色虚线部分浏览器厂商可以自定义实现
架构组件介绍:
1.Your Web App
Web开发者开发的程序,Web开发者可以基于WebRTC的浏览器提供的Web API开发基于音视频的实时通信应用。
2.Web API
面向第三方开发者的WebRTC标准API,使开发者能够简单的开发出类似网络视频聊天的web应用。
3.WebRTC Native C++ API
本地C++ API层,使浏览器厂商容易实现WebRTC标准的WebAPI,抽象对数字信号过程进行处理。
4.Transport/Session
传输/会话层:会话层组件采用 了libjingle库的部分组件实现,无须使用xmpp/jingle协议。
5.VoiceEngine
音频引擎是包含一系列音频多媒体处理的框架,包括从音频采集到网络传输的整个解决方案。
6.VideoEngine
VideoEngine是包含一系列视频处理的整体框架,从摄像头采集视频到视频信息网络传输再到视频显示整个完整过程的解决方案。
P2P通信就是点对点通信。
1.如何发现对方?在P2P通信过程中,双方需要交换一些元数据比如媒体信息、网络数据等信息,我们通常称这个过程叫做“信令”,对应的服务器就是“信令服务器”,通常也有人称为“房间服务器”,因为它不仅可以交换彼此的媒体信息和网络信息也可以管理房间信息。
2.彼此的音视频编解码能力如何沟通?不同浏览器对于音视频编解码能力是不同的,在WebRTC中有一个专门的协议称为SDP,可以用于描述上述信息,参与音视频通信的双方想要了解对方支持的媒体格式,必须交换SDP信息,交换SDP的过程,通常称为媒体协商。
3.音视频如何传输,让对方看到自己?基于网络安全和IPV4地址不够的考虑,我们的电脑和电脑之间或多或少都在某个局域网内,需要NAT(网络地址转换),在WebRTC中我们使用ICE机制建立网络连接。
什么是ICE?
ICE (Interactive Connecctivity Establishment, 交互式连接建立),ICE 不是一种协议,而是整合了 STUN 和 TURN 两种协议的框架。
其中:STUN(Sesssion Traversal Utilities for NAT, NAT 会话穿越应用程序),它允许位于 NAT(或多重 NAT)后的客户端找出自己对应的公网 IP 地址和端口,也就是俗称的P2P“打洞”。
但是:如果 NAT 类型是对称型的话,那么就无法打洞成功。这时候 TURN 就派上用场了,TURN(Traversal USing Replays around NAT)是 STUN/RFC5389 的一个拓展协议在其基础上添加了 Replay(中继)功能。
简单来说:其目的就是解决对称 NAT 无法穿越的问题,在 STUN 分配公网 IP 失败后,可以通过 TURN 服务器请求公网 IP 地址作为中继地址。
在 WebRTC 中有三种类型的 ICE 候选者,它们分别是:
1.主机候选者:表示的是本地局域网内的IP地址和端口,它是三个候选者中优先级最高的,也就是说在WebRTC底层,首先会尝试本地局域网内建立连接。
2.反射候选者:表示的是获取NAT内主机的外网IP地址和端口,它的优先级低于主机候选者,也就是说当WebRTC尝试本地连接不通时,会尝试通过反射候选者获取IP地址和端口进行连接。
3.中继候选者:表示的是中继服务器的IP地址和端口,就是通过服务器中转媒体数据,当WebRTC客户端通信双方无法穿越P2PNAT时,为了保证双方可以正常通讯,此时只能通过服务器中转来保证服务质量了。
在非本地局域网内WebRTC通过STUN server获得自己的外网IP和端口,然后通过信令服务器与远端的WebRTC交换网络信息,之后双方就可以尝试建立P2P连接类,当NAT穿越不成功时,则会通过Relay server中转。
简单来说就是通过WebRTC提供的API获取各端的媒体信息SDP和网络信息candidate,并通过信令服务器交换,进而建立两端的连接通道完成实现音视频通信。
1.音视频采集API
音视频采集 API,即 MediaDevices.getUserMedia()。
2.获取音视频设备输入输出列表
获取音视频设备输入输出列表API,即 MediaDevices.enumerateDevices()。
3.RTCPeerConnection
RTCPeerConnection作为创建点对点连接的API,是我们实现音视频实时通信的关键。
在本文的实践章节中,主要运用到了以下方法。
媒体协商方法:
createOffer
createAnswer
localDesccription
remoteDesccription
重要事件:
onicecandidate
onaddstream
在呼叫端和接收端都调用setLocalDescription同时开始收集各端自己的网络信息(candidate),然后各端通过监听事件onicecandidate收集到各自的candidate并通过信令服务器传送给对方,进而打通P2P通信的网络通道,并通过监听onaddstream事件拿到对方的视频流进而完成整个视频通话过程。