架构总览
模块划分
媒体采集模块
- 使用浏览器 API:
getUserMedia()
。 - 采集摄像头(video)、麦克风(audio)。
- 通过
MediaStreamTrack
管理单轨道。
媒体处理与编解码
- 编码器(发送端):
- 音频:Opus、G.711。
- 视频:VP8、VP9、H.264、AV1。
- 解码器(接收端):
- 支持上述编解码格式。
- 其他处理:
- AEC(回声消除)、AGC(自动增益)、NS(降噪)等。
RTCPeerConnection 连接管理
核心对象:RTCPeerConnection
- 管理媒体轨道、协商 SDP、控制网络连接。
- 与远端建立加密媒体通道。
- 支持
addTrack()
/addTransceiver()
管理轨道。
传输与安全模块
协议栈(底层网络):
协议 | 作用 |
---|---|
ICE | NAT 穿透候选路径收集和选择 |
STUN | 获取公网地址,打洞 |
TURN | 中继服务器 |
DTLS | 建立加密通道 |
SRTP | 安全传输媒体流 |
SCTP | 数据通道的基础协议 |
媒体传输:
- 使用 RTP/RTCP 发送音视频流。
- 支持 NACK、PLI、FEC、REMB、TCC 等反馈机制提升媒体质量。
数据通道(RTCDataChannel)
- 基于 SCTP over DTLS over ICE 实现。
- 用于传输非媒体数据,类似 WebSocket,但具备 P2P 优势。
信令机制(自定义实现)
WebRTC 不定义信令协议,常用方案:
- WebSocket
- HTTP POST/REST
- MQTT
信令交换内容包括:
- SDP(Session Description Protocol):音视频能力协商。
- ICE Candidate:网络地址候选信息。
+----------------------+
| JavaScript 应用层 |
+----------------------+
| | |
+----------+ | +------------------+
| | |
+------------------+ +----------------+ +------------------+
| getUserMedia() | | PeerConnection | <-----> | DataChannel |
+------------------+ +----------------+ +------------------+
| |
+------+-------------------+-------+
| | | |
+-------------+ +----------------+ +--------------+
| 音视频采集 | | 编码/解码 | | 传输协议栈 |
+-------------+ +----------------+ +--------------+
| STUN/TURN/ICE |
| DTLS/SRTP/SCTP|
通信流程
[用户A] [用户B]
| |
| getUserMedia() |
| 采集本地音视频 |
| |
| createOffer() |
| setLocalDescription(offer) |
|------------------> 信令服务器 ------------------->|
| setRemoteDescription(offer)
| createAnswer()
| setLocalDescription(answer)
|<------------------ 信令服务器 <-------------------|
| setRemoteDescription(answer) |
| |
| ICE candidate gathering and exchange |
|<------------------->(STUN/TURN)<------------------>|
| |
| DTLS 握手,SRTP 密钥协商 |
| |
| 媒体传输(RTP)+ 控制(RTCP) |
|<=========================================>|
服务端组件架构
虽然 WebRTC 是 P2P,但实际场景常常需要以下服务器支撑:
组件 | 作用 | 常见实现 |
---|---|---|
Signaling Server | 交换 SDP 和 ICE 信息 | Node.js + WebSocket、Socket.io |
STUN Server | 提供公网地址探测 | Google STUN、Coturn |
TURN Server | 中继数据(P2P 失败时) | Coturn |
SFU(选择转发) | 多人通话中只转发媒体流 | mediasoup、Janus、Jitsi |
MCU(混合转发) | 多人通话中混合为一路流 | Kurento、Jitsi MCU |