2、WebRTC架构图
面向第三方开发者的WebRTC标准API(Javascript),使开发者能够容易地开发出类似于网络视频聊天的web应用,最新的标准化进程可以查看 这里 。
(3) WebRTC Native C++ API
本地C++ API层,使浏览器厂商容易实现WebRTC标准的Web API,抽象地对数字信号过程进行处理。
a. RTP Stack协议栈
Real Time Protocol
b. STUN/ICE
可以通过STUN和ICE组件来建立不同类型网络间的呼叫连接。
c. Session Management
一个抽象的会话层,提供会话建立和管理功能。该层协议留给应用开发者自定义实现。
音频引擎是包含一系列音频多媒体处理的框架,包括从视频采集卡到网络传输端等整个 解决方案。
PS:VoiceEngine是WebRTC极具价值的技术之一,是Google收购GIPS公司后开源的。在VoIP上,技术业界领先,后面的文章会详细了解
采样频率:16khz,24khz,32khz;(默认为16khz)
自适应速率为10kbit/s ~ 52kbit/;
自适应包大小:30~60ms;
算法延时:frame + 3ms
Internet Low Bitrate Codec
VoIP音频流的窄带语音编解码器
采样频率:8khz;
20ms帧比特率为15.2kbps
30ms帧比特率为13.33kbps
标准由IETF RFC3951和RFC3952定义
c. NetEQ for Voice
回声消除器是一个基于软件的信号处理元件,能实时的去除mic采集到的回声。
噪声抑制也是一个基于软件的信号处理元件,用于消除与相关VoIP的某些类型的背景噪声(嘶嘶声,风扇噪音等等… …)
WebRTC视频处理引擎
VideoEngine是包含一系列视频处理的整体框架,从摄像头采集视频到视频信息网络传输再到视频显示整个完整过程的解决方案。
视频图像编解码器,是WebRTC视频引擎的默认的编解码器
VP8适合实时通信应用场景,因为它主要是针对低延时而设计的编解码器。
PS:VPx编解码器是Google收购ON2公司后开源的,VPx现在是WebM项目的一部分,而WebM项目是Google致力于推动的HTML5标准之一
视频抖动缓冲器,可以降低由于视频抖动和视频信息包丢失带来的不良影响。
图像质量增强模块
对网络摄像头采集到的图像进行处理,包括明暗度检测、颜色增强、降噪处理等功能,用来提升视频质量。
底层架构
上图实为WebRTC的底层架构,可以其用到的技术非常多的,包括视频音频处理以及网络传输,防火墙穿越等技术。
WebRTC有三个模块,Voice Engine(音频引擎),Video Engine(视频引擎),Transport。Voice Engine包含iSAC/iLBC Codec(音频编解码器,前者是针对宽带和超宽带,后者是针对窄带),NetEQ for voice(处理网络抖动和语音包丢失),Echo Canceler(回声消除器),Noise Reduction(噪声抑制);Video Engine包含VP8 Codec(视频图像编解码器),Video jitter buffer(视频抖动缓冲器,处理视频抖动和视频信息包丢失),Image enhancements(图像质量增强)。Transport包含SRTP(安全的实时传输协议,用以音视频流传输),Multiplexing(多路复用),P2P,STUN+TURN+ICE(用于NAT网络和防火墙穿越的)。除此之外,安全传输可能还会用到DTLS(数据报安全传输),用于加密传输和密钥协商。整个WebRTC通信是基于UDP的
MediaStream获取音视频数据流
getUserMedia(constraints,successCallback,errCallback)
navigator上的方法,用于获取用户授权提供的音频视频数据流,三个参数分别为约束对象,成功的回调函数,发送错误的回调函数。
浏览器兼容性
|
|
上栗子:MediaStream和Canvas实现拍照功能
|
|
RTCPeerConnection实现P2P通信
P2P通信基于UDP传输协议,更加注重传输实时性。P2P建立过程是比较复杂的。主要是交换SDP和ICE信息。
上图所示为利用信令服务器实现P2P通信的流程图,其中还包含了STUN服务器(非WebRTC实现)
P2P通信建立过程
交换SDP
SDP是一种会话描述协议(Session Description Protocol),包含了一系列信息包括会话使用的媒体种类,双方ip和port,带宽,会话属性等。
SDP交换采用Offer/Answer形式。
- 首先Offer方通过new RTCPeerConnection(config)建立PeerConnection
- Offer方通过createOffer生成sessionDescription,设置localDescription,并通过信令服务器发送给Answer方
- Answer方收到offer,发现并没有与之对应的peerConnection,新建peerConnection,并设置remoteDescription
- Answer方通过createAnswer生成sessionDescripton,设置localDescription,并通过信令服务器发送answer
- Offer方收到answer,设置remoteDescription
- SDP交换结束
交换ICE
ICE是一种用于实现NAT/防火墙穿越的协议,可以实现:
- P2P直接通信
- 使用STUN服务器实现突破NAT的P2P通信
- 使用TURN中继服务器实现突破防火墙的中继通信
交换过程:
- 双方在new RTCPeerConnection(config)建立连接后,当网络候选者可用时,会触发icecandidate事件
- 在onicecandidate事件处理程序中将candidate通过信令服务器发送给对方
- 双方在接受到彼此的candidate后,通过addIceCandidate将对方的candidate加入到PeerConnection实例中。
在连接建立前或者建立后调用peerConnection.addStream()方法将本地视频/音频数据流加入到connection当中,当对方接受到视频流时会触发addStream事件,在其处理程序中我们可以接受数据流将其显示。
基于Socket.io和WebRTC的两人视频聊天室
上述过程的信令服务器可以使用WebSocket服务,而Node.js可以方便的实现ws服务,socket.io更是封装了一系列API,可以方便的实现多人视频聊天室,多人视频聊天室有需要注意一些其他诸如SDP冲突问题,这里先以两人通信为例来更深入理解整个过程。
|
|
NAT/防火墙穿越技术
之所以将NAT/防火墙单独出来,是因为NAT/防火墙问题是建立端对端通信的一个重要问题
NAT
NAT将连接到公网的全局ip转换为内网ip,实现多个终端通信,防止受到来自外网的攻击,有效节省IPV4数量。WebRTC必须穿越NAT进行通信。ICE可以通过STUN技术穿越NAT。
NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。目前用得比较多的就是端口多路复用。
STUN服务器可以是自己搭建的,也可以是直接使用现成的,比如谷歌的stun服务:stun:stun.l.google.com:19302
自己搭建STUN服务器比较简单,这里篇幅有限,省略
配置好STUN服务,以此建立RTCPeerConnection,配置方法就是上面的config对象:
|
|
防火墙
对于防火墙,需要依靠TURN服务器来进行通信。起一各TURN服务器监听在某个端口时,需要设置防火墙开发这个端口。搭建TURN服务器也比较简单,在这里也省略。
同样也要配置好config:
|
|
RTCDataChannel API
既然可以实现音频视频的实时通信,为何不可以实现文本,文件等数据的传输呢?RTCDataChannel API就提供了这个功能。它通过将数据直接从一个浏览器发送到另一个浏览器,不需要将数据通过服务器来进行中转发送,简化了过程,保证实时性,同时还确保数据的安全私密性。
RTCDataChannel 与RTCPeerConnection API相结合,使用SCTP(流控制传输协议)实现稳定有序的数据传递。其仍然需要信令服务器的参与。以及STUN和TURN服务器来穿越NAT/防火墙。
RTCDataChannel支持两种模式运行:不可信赖模式(类似UDP)和可信赖模式(类似于TCP)。
流程分析
- 通过config建立RTCPeerConnection
- 通过peerConnection.createDataChannel(label,dataChannelConfig)获取dataChannel对象
- 按照上述P2P建立流程完成SDP和ICE信息交换
- 调用send()方法发送消息
- 接收方监听message事件,获取数据
|
|
详细API可查看WebRTC官网
4、WebRTC核心模块API
(1)、网络传输模块:libjingle
(2)、音频、视频图像处理的主要数据结构
类、结构体、枚举常量 |
头文件 |
说明 |
Structures |
common_types.h |
Lists the structures common to the VoiceEngine & VideoEngine |
Enumerators |
common_types.h |
List the enumerators common to the VoiceEngine & VideoEngine |
Classes |
common_types.h |
List the classes common to VoiceEngine & VideoEngine |
class VoiceEngine |
voe_base.h |
How to allocate and release resources for the VoiceEngine using factory methods in the VoiceEngine class. It also lists the APIs which are required to enable file tracing and/or traces as callback messages |
class VideoEngine |
vie_base.h |
How to allocate and release resources for the VideoEngine using factory methods in the VideoEngine class. It also lists the APIs which are required to enable file tracing and/or traces as callback messages |
(3)、音频引擎(VoiceEngine)模块 APIs
sub-API | 头文件 |
说明 |
VoEAudioProcessing |
voe_audio_processing.h |
Adds support for Noise Suppression (NS), Automatic Gain Control (AGC) and Echo Control (EC). Receiving side VAD is also included. |
VoEBase |
voe_base.h |
Enables full duplex VoIP using G.711. |
VoECallReport |
voe_call_report.h |
Adds support for call reports which contains number of dead-or-alive detections, RTT measurements, and Echo metrics. |
VoECodec |
voe_codec.h |
Adds non-default codecs (e.g. iLBC, iSAC, G.722 etc.), Voice Activity Detection (VAD) support. |
VoEDTMF |
voe_dtmf.h |
Adds telephone event transmission, DTMF tone generation and telephone event detection. (Telephone events include DTMF.) |
VoEEncryption |
|