架構總覽
模塊劃分
媒體采集模塊
- 使用瀏覽器 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 |