Skip to content

WebRTC

一、WebRTC 是什么

1.1 定义

WebRTC 是一个支持浏览器进行实时音视频通信的API和技术框架,基于HTML5标准,旨在让开发者通过简单的JavaScript实现丰富的实时多媒体应用。它的核心目标是: - 提供浏览器原生的实时通信能力,无需额外插件。 - 实现跨平台的音视频采集、编解码、传输和显示。 - 建立浏览器间健壮的P2P通信平台,形成开发者与浏览器厂商的良好生态。

1.2 核心特性

  • 跨平台支持:支持Windows、Linux、Mac、Android、iOS等。
  • 安全性:采用SRTP(安全实时传输协议)对RTP数据加密,提供消息认证、完整性保护和防重放攻击。
  • 开源免费:基于BSD许可证,开发者可免费获取源代码、规范和工具。
  • 模块化架构:核心层代码高品质、内聚,易于移植到非Web平台。

1.3 核心架构

WebRTC的架构分为以下四层: 1. WebRTC C++ API(PeerConnection): - 提供P2P连接功能,封装音视频采集、传输、质量统计等接口。 2. 会话管理(Session Management): - 管理音视频及数据传输的会话逻辑。 3. 核心引擎层: - 包含音频引擎(Voice Engine)、视频引擎(Video Engine)和传输模块(Transport)。 4. 硬件适配层: - 处理音频采集/渲染、视频捕获和网络I/O,支持跨平台实现。

1.4 核心模块

WebRTC的三大核心模块是: 1. 音频引擎(Voice Engine): - 编解码:支持Opus、iSAC、iLBC、G.711等,Opus为主要音频编解码器。 - NetEQ:音频抖动缓冲,优化网络适配,减少抖动和丢包影响。 - 回音消除与降噪:提供成熟的回音消除(AEC)、噪声抑制(NS)算法。 2. 视频引擎(Video Engine): - 编解码:支持VP8、VP9、H.264(需自行集成OpenH264)。 - 视频抖动缓冲:防止视频抖动,提升流畅性。 - 图像增强:提供图像处理接口,支持美颜、滤镜等扩展。 3. 传输模块(Transport): - 基于UDP协议,支持SRTP(加密RTP)、RTCP(流控)、ICE(NAT穿透)、STUN/TURN(P2P连接)。 - 实现带宽估计、丢包恢复、流控等功能,支持非音视频数据传输(如文件、文本)。


二、WebRTC 能做什么

WebRTC的主要功能包括: 1. 实时音视频通信:支持浏览器间的语音通话、视频会议、直播等。 2. 数据通道:通过SCTP协议支持P2P数据传输(如文件、文本)。 3. 跨平台开发:提供Web API和Native C++ API,适用于Web、移动端和桌面应用。 4. 标准化的实时通信:基于WHATWG协议,简化开发者工作,无需深入数字信号处理。


三、WebRTC 的工作原理

3.1 基本架构

WebRTC的典型架构是一个三角形架构: - 两个浏览器(如手机上的“浏览器M”和笔记本上的“浏览器L”)通过Web服务器连接。 - 工作流程: 1. 浏览器从Web服务器下载WebRTC程序(HTML5/JavaScript)。 2. 通过Web服务器交换信令(控制信息),协商媒体功能。 3. 建立P2P音视频和数据通道,直接通信。

3.2 P2P架构

WebRTC使用P2P媒体流,但NAT和防火墙增加了连接难度。为此,WebRTC采用以下技术: - ICE(交互式连接建立):通过STUN和TURN协议实现NAT穿透。 - STUN:获取公网IP地址,检测NAT类型。 - TURN:在P2P失败时中继媒体流。 - SDP(会话描述协议):交换媒体能力信息。 - Trickle ICE:优化ICE候选收集,加快连接建立。

简化ICE流程: 1. 浏览器通过STUN服务器获取公网IP。 2. 通过信令交换ICE候选(公网IP地址)。 3. 执行连接检查(ICE打洞),确认P2P可行。 4. 建立P2P媒体会话;若失败,则通过TURN服务器中继。


四、WebRTC 所需的后端服务器

WebRTC并非完全无服务器的P2P通信,通常需要以下后端支持: 1. 信令服务器: - 协商会话,交换SDP和ICE候选。 - 可使用SIP、XMPP或自定义协议,常见实现包括WebSocket。 2. STUN/TURN服务器: - STUN:帮助浏览器发现公网IP和NAT类型。 - TURN:在P2P失败时中继媒体流(约10%的情况需要)。 3. 媒体服务器(可选): - 用于多方会议、录制、协议网关等场景。 - 常见媒体服务器包括Kurento、Jitsi、Janus等。


五、WebRTC 协议栈

WebRTC的协议栈分为会话层传输层,主要协议包括: - 会话层: - 信令协议:未标准化,开发者可自定义(如SIP over WebSocket)。 - SDP:描述媒体能力。 - 传输层: - RTP/SRTP:实时传输音视频,SRTP提供加密。 - RTCP:监控和控制媒体流,提供丢包、抖动等统计。 - ICE/STUN/TURN:实现P2P连接和NAT穿透。 - SCTP:支持数据通道传输。

协议栈示意图(参考WebRTC官网): - 应用层:HTML5/JavaScript调用WebRTC API。 - 核心层:封装RTP、SRTP、ICE等协议。 - 底层:UDP传输,硬件适配。


六、WebRTC 源码结构

WebRTC源码作为Chromium的一部分,更新频繁,支持C++11/14/17新特性。源码结构分为以下层次: 1. OS适配层:跨平台网络、音频/视频设备封装,第三方库(如OpenSSL、libvpx)。 2. 网络传输层:STUN/TURN、DTLS、RTP/SCTP实现。 3. 通道层:BaseChannel(对接PeerConnection)、MediaChannel(对接音视频引擎)。 4. 音视频引擎:音频/视频处理、编解码。 5. PeerConnection:实现JSEP协议,管理会话和媒体流。

核心模块: - PeerConnection:实现RTCPeerConnection、SDP处理、RtpTransceiver等。 - Modules:音视频设备、编解码、流控等独立模块。 - libjingle:重用网络和传输组件。


七、实时传输协议(RTP)详解

7.1 什么是RTP

RTP(Real-time Transport Protocol)是为实时多媒体通信设计的协议(RFC 3550),支持VoIP、视频会议、直播等场景。特点: - 提供源标识、负载类型、流同步、丢包恢复、媒体监控。 - 搭配RTCP报告媒体流性能。

7.2 RTP 数据包格式

  • 报头:包含序列号、时间戳、同步源标识(SSRC)等。
  • 负载:编码后的音视频数据。

7.3 RTCP 报告

  • 发送端报告:同步时间戳和分组速率。
  • 接收端报告:报告丢包率、最高序列号、往返时间。
  • 扩展报告:提供抖动、延迟、丢包等详细指标。

7.4 负载格式

  • 编解码器专用:如H.264、Opus。
  • 通用:支持FEC(前向纠错)、NACK(否定确认)等。
  • 聚合/碎片规则:处理小帧聚合或大帧分片。

7.5 报头扩展

  • 携带独立于媒体的信息,如发送时间戳、音频级别。
  • 向后兼容,支持快速反馈(如NACK)。

7.6 RTCP 报告间隔

  • 占用会话带宽的5%,由同步源数量和带宽决定。
  • 最小间隔推荐5秒,双向会话可减至360/带宽秒。
  • 支持快速反馈扩展,优化拥塞控制和错误恢复。

八、如何使用 WebRTC 开发

8.1 Web API

WebRTC提供以下三类JavaScript API: 1. Network Stream API:处理音视频流。 2. RTCPeerConnection:管理P2P连接、信令交换。 3. Peer-to-peer Data API:支持数据通道传输。

开发步骤: 1. 获取用户媒体(getUserMedia)。 2. 创建RTCPeerConnection,交换SDP和ICE候选。 3. 建立音视频或数据通道,处理媒体流。

8.2 Native C++ API

  • 面向浏览器厂商,抽象数字信号处理。
  • 用于实现Web API或开发非Web应用。