RTC
RTC(Real-time Communications)实时通信,是实时音视频的一个简称。
WebRTC 是什么
WebRTC (Web Real-Time Communications) 是 RTC 的一部分,是一项实时通信技术,它容许网络应用或者站点,在不借助两头媒介的状况下,建设浏览器之间点对点(Peer-to-Peer)的关联,实现视频流/音频流或者应用数据的传输。
使用场景
- 音视频通话
- 视频/电话会议
- 近程拜访主机
- 在线教育(直播连麦,屏幕录制,共享远程桌面
WebRTC架构
WebAPI
提供给WEB使用的java接口。
C++ API
跨平台的C++接口。
会话管理
WebRTC在两个Peer之间通信之前需要创建一个Session。这一层就负责session的创建、管理。
音频引擎
音频引擎(VoiceEngine)负责WebRTC的音频采集、编解码、传输控制和音频信号处理。音频编解码部分支持iSAC和iLBC,语音信号处理部分支持回声消除(AcousticEchoCancceler,AEC)和降噪(NoiseReduction,NR)。
视频引擎
视频引擎(VideoEngine)负责WebRTC的视频采集、编解码、流控和图像信号处理。视频图像编解码部分支持VP8、H264(默认是VP8)。视频图像处理部分是对采集到的图像进行颜色增强、降噪等处理来提升图像清晰度,流控部分是使用jetter buffer和FEC来减小网络抖动和丢包带来的影响。
网络传输
网络传输负责音视频数据和应用数据的传输,在应用层媒体数据(音频、视频等)使用 Secure Real-time Transport Protocol (SRTP) 传输,而非媒体数据(文字、图片等)使用Stream Control Transmission Protocol (SCTP)传输。在传输层使用UDP协议。而在应用层和传输层之间,WebRTC使用DTLS(Datagram Transport Layer Security) 解决UDP网络传输的安全机制。另外还通过整合了STUN和TURN的ICE协议来实现NAT转换和公网穿透。
代码结构
基本概念
媒体协商
每个客户端的多媒体能力不同,因此两个客户端想要通信就需要先了解相互的多媒体能力,协商出大家都支持的能力集,然后才能通信。WebRTC使用SDP协议来协商音视频能力。
offer 和 answer
发动端发送的 SDP 称为 Offer,接收端发送的 SDP 称为 Answer。
ICE
当媒体协商完成后,WebRTC 就开始建设网络连接,其过程称为 ICE(Interactive Connectivity Establishment)交互式连贯建设。
ICE 在调用 setLocalDescription() 后就开始了,其操作过程如下:
- 收集 Candidate;
- 替换 Candidate;
- 按优先级尝试建立关联。
Candidate
和对端建立连接前,需要获取对端的一些基本信息,如 IP 地址、端口号、传输协议、加密算法等。而 Candidate 正是 WebRTC 用来形容它能够关联的远端的基本信息,因而 Candidate 是包含 IP 地址、端口号、协议的一个信息集。
在 WebRTC 中有三种类型的 ICE 候选者(Candidate):
- 主机候选者:示意网卡本人的 IP 地址及端口。通过设施网卡获取,优先级最高。在 WebRTC 底层首先会尝试本地局域网内建设连贯。
- 反射候选者:示意通过 NAT 之后的外网 IP 地址和端口,由 ICE(STUN)服务器获取,依据服务器的返回状况,来综合判断并晓得本身在公网中的地址。其优先级低于主机候选者,当 WebRTC 尝试本地连接不通时,会尝试通过反射候选者取得的 IP 地址和端口进行连贯。
- 中继候选者:示意的是中继(TURN)服务器的转发 IP 地址与端口,由 ICE 中继服务器提供。优先级最低,前两个都不行则会按该种形式。
在新建RTCPeerConnection
时可在构造函数指定 ICE 服务器地址,没有指定的话则意味着这个关联只能在内网进行。
CandidatePair
WebRTC 收集好 Candidate 后,会通过信令将它们发送给对端。对端接收到这些 Candidate 后,会与本地的 Candidate 组成 CandidatePair(即候选者配对)。有了 CandidatePair,WebRTC 就能够开始尝试建立连接了。这里须要留神的是,Candidate 的发送不是等所有 Candidate 收集好后才进行的,而是收集到一个就发送。
CandidatePair,候选者配对,即一个本地 Candidate,一个远端 Candidate
当 WebRTC 造成 CandidatePair 后,便开始尝试进行关联。一旦 WebRTC 发现其中有一个能够连通的 CandidatePair 时,它就不再进行关联尝试了,但发现新的 Candidate 时依然会发送给对端。
关联
TCP是面向连接的,一个连接只涉及两个IP地址间的通信,而SCTP是面向关联的,关联是指两个端点之间的一次通信,因此可以涉及不止两个IP地址,当然也就可以有多个连接。