一、基础概念
定义与优势
- WebRTC(Web Real-Time Communication)是一套支持浏览器间实时音视频通话和数据传输的开源技术,无需安装插件或第三方软件。
- 核心能力包括点对点(P2P)连接、低延迟传输、支持音视频编解码及网络穿透技术(如NAT)。
- 支持语言
浏览器端开发:优先使用 JavaScript。
移动端原生开发:选择 Java(Android)或 Objective-C++(iOS)。
底层协议扩展/服务器开发:推荐 C++ 或 Rust。 应用场景
- 音视频通话、视频会议、屏幕共享、实时直播等,适用于医疗、教育、社交等领域。
二、核心技术
信令(Signaling)
- 作用:协调通信双方交换会话控制信息(如SDP、ICE候选地址),需开发者自行实现,常用WebSocket或HTTP协议传输。
- 流程:通过信令服务器传递
offer
和answer
,完成媒体协商。
网络穿透与连接(ICE/STUN/TURN)
- ICE(Interactive Connectivity Establishment):整合STUN/TURN服务,探测最佳通信路径。
- STUN:获取设备的公网地址,解决NAT映射问题。
- TURN:当P2P直连失败时,通过中继服务器转发数据。
媒体处理
- 使用
navigator.mediaDevices.getUserMedia
捕获音视频流,并通过RTCPeerConnection
建立传输通道。 - SDP(Session Description Protocol):描述媒体格式、编解码等参数,用于端到端协商。
- 使用
三、开发流程
开发流程
开发的典型流程图,分为 信令阶段 和 媒体传输阶段,适用于 C++ 或其他语言的实现。
详细步骤说明
1. 初始化阶段
创建核心对象:
PeerConnectionFactory
:管理音视频设备、编解码器、线程等。PeerConnection
:核心连接对象。
2. 信令阶段(需自定义实现)
创建 Offer
调用
PeerConnection::CreateOffer()
生成 SDP Offer。通过信令服务器(如 WebSocket)发送给对端。
交换 ICE Candidate
收集本地网络候选地址(
onicecandidate
回调)。通过信令服务器交换 ICE Candidate。
处理 Answer
对端收到 Offer 后生成 Answer(
CreateAnswer
)。本端设置 Answer(
SetRemoteDescription
)。
3. 媒体传输阶段(自动由 WebRTC 处理)
ICE 连接建立
STUN/TURN 服务器协助完成 NAT 穿透。
建立 P2P 连接后触发
onconnectionstatechange
(状态变为connected
)。
音视频流传输
通过 SRTP/SRTCP 加密传输音视频数据。
支持动态码率调整(基于网络状况)。
数据通道(可选)
使用
CreateDataChannel
创建可靠/不可靠的数据通道。
关键点说明
信令服务器:WebRTC 不限制信令协议(常用 WebSocket/SIP)。
ICE Candidate:需要交换所有候选地址(本地/反射/中继)。
SDP 协商:描述媒体格式、编解码器、网络信息。
NAT 穿透:依赖 STUN(轻量穿透)和 TURN(中继备选)。
故障排查方向
信令失败:检查 SDP/ICE 是否完整交换。
媒体不通:确认防火墙开放 UDP 端口,或启用 TURN。
延迟/卡顿:检查网络带宽和编解码器配置。
四、WebRTC 开发指南 (C++)
1. 获取 WebRTC 源代码
首先需要获取 WebRTC 的源代码:
# 安装 depot_tools (Google 的代码管理工具)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$PATH:/path/to/depot_tools
# 获取 WebRTC 代码
mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc
gclient sync
2. 构建 WebRTC
# 生成构建文件 (以 Linux 为例)
gn gen out/Default --args='is_debug=false target_os="linux" target_cpu="x64"'
# 开始构建
ninja -C out/Default
国内源代码下载与编译可以参考下面链接:
3. 基本 WebRTC C++ 组件
WebRTC 的主要 C++ 组件包括:
PeerConnection: 核心连接管理
MediaStream: 媒体流处理
DataChannel: 数据传输通道
VideoCapture: 视频采集
AudioDevice: 音频设备接口
4. 简单示例:创建 PeerConnection
#include <api/create_peerconnection_factory.h>
#include <api/peer_connection_interface.h>
// 创建 PeerConnectionFactory
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
peer_connection_factory = webrtc::CreatePeerConnectionFactory(
nullptr /* network_thread */,
nullptr /* worker_thread */,
nullptr /* signaling_thread */,
nullptr /* default_adm */,
webrtc::CreateBuiltinAudioEncoderFactory(),
webrtc::CreateBuiltinAudioDecoderFactory(),
webrtc::CreateBuiltinVideoEncoderFactory(),
webrtc::CreateBuiltinVideoDecoderFactory(),
nullptr /* audio_mixer */,
nullptr /* audio_processing */);
// 配置 PeerConnection
webrtc::PeerConnectionInterface::RTCConfiguration config;
config.sdp_semantics