核心組成
- GetUserMedia:獲取本地音視頻設備(攝像頭、麥克風)數據流。
- RTCPeerConnection:實現點對點的媒體流傳輸和網絡連接管理。
- RTCDataChannel:點對點的任意數據通道(除音視頻外傳輸數據)。
運行流程
信令協商(建立連接前的協商階段)
WebRTC 本身不規定信令方式,通常通過 WebSocket、HTTP、SIP、XMPP 等信令服務器完成:
- 雙方交換網絡信息(IP、端口等),叫做 ICE Candidate。
- 雙方交換媒體協商信息,叫做 SDP(Session Description Protocol),包括音視頻編碼格式、分辨率、碼率等。
信令通道是 WebRTC 連接建立的必要前提,但它本身不包含在 WebRTC 標準內。
NAT穿越和網絡連接建立
- WebRTC 使用 ICE(Interactive Connectivity Establishment) 協議。
- ICE 會收集所有可能的網絡候選地址(本地 IP、STUN 服務器分配的公網 IP、中繼服務器 TURN 分配的地址)。
- 雙方互相嘗試連接這些地址,最終確定一條可用的點對點路徑。
媒體流捕獲和編碼
- 通過
getUserMedia
獲取本地攝像頭和麥克風流。 - 媒體數據經瀏覽器內置編碼器壓縮,支持 VP8/VP9/H.264(視頻),Opus/G.711(音頻)等編碼格式。
點對點媒體流傳輸
- 利用
RTCPeerConnection
,雙方建立點對點的連接。 - 媒體流(音頻、視頻)和數據流通過這個連接實時雙向傳輸。
- 支持加密傳輸(DTLS-SRTP),確保通信安全。
RTCPeerConnection調用過程:
調用時序圖:
數據通道通信
RTCDataChannel
允許點對點傳輸任意數據,如文字聊天、文件傳輸、游戲數據等。- 基于 SCTP 協議,支持可靠和不可靠數據傳輸。
連接維護和狀態更新
- WebRTC 會實時監控網絡狀態,自動調整連接路徑。
- 支持動態帶寬調節、碼率控制和丟包恢復機制,確保流暢通信。
總結
+-----------------------+ +-----------------------+
| 瀏覽器A | | 瀏覽器B |
+-----------------------+ +-----------------------+| || 1. 獲取本地媒體流 (getUserMedia) ||------------------------------------------------------>|| ||<------------------------------------------------------|| || 2. 創建 RTCPeerConnection 對象 || || 3. 創建 Offer SDP(Session Description) ||------------------------------------------------------>|| || | 4. 接收 Offer SDP| | 5. 創建 RTCPeerConnection| | 6. 創建 Answer SDP| |------------------------------------------------------>|| || 7. 接收 Answer SDP ||<------------------------------------------------------|| || 8. 雙方開始交換 ICE Candidates(網絡候選) ||<-------------------------> (通過信令服務器傳遞) || || 9. ICE 協議測試所有候選路徑,選出最佳連接路徑 || || 10. 建立 DTLS-SRTP 加密的點對點連接 || || 11. 雙方通過 RTCPeerConnection 發送音視頻流 ||<---------------------------> || || 12. RTCDataChannel 傳輸任意數據(如文本、文件等) ||<---------------------------> || || 13. 連接維護與狀態更新(動態調節碼率、重連等) || |
-
獲取本地媒體流
-
通過調用
navigator.mediaDevices.getUserMedia()
獲取攝像頭和麥克風的音視頻流。 -
用戶瀏覽器彈出授權提示,用戶允許后返回本地流。
-
-
創建 RTCPeerConnection 對象
- 新建一個連接對象,負責管理媒體流和數據通道。
-
創建 Offer SDP
- 發送方創建會話描述(SDP),告知自己支持的音視頻格式、網絡信息等。
-
信令交換
-
發送方將 Offer SDP 發送給接收方。
-
接收方收到后,創建自己的 RTCPeerConnection。
-
接收方創建 Answer SDP 并返回發送方。
-
雙方確認彼此能力和參數。
-
-
ICE Candidate 交換
-
雙方通過信令服務器互相發送所有可用的網絡候選地址(IP + 端口)。
-
這些地址包括本地網絡地址、STUN 獲取的公網地址、TURN 中繼地址。
-
-
ICE 連接檢測
-
雙方嘗試所有候選路徑,逐個測試連接性。
-
選擇最佳路徑(最快、最穩定的點對點連接)。
-
-
建立安全連接
-
通過 DTLS(Datagram Transport Layer Security)加密握手,建立加密的傳輸通道。
-
媒體通過 SRTP(Secure Real-time Transport Protocol)安全傳輸。
-
-
媒體流傳輸
-
雙方開始點對點實時傳輸視頻和音頻流。
-
支持視頻、音頻的編碼解碼和同步。
-
-
數據通道傳輸
- 通過
RTCDataChannel
發送非音視頻數據,如文本消息、文件數據、游戲狀態等。
- 通過
-
連接維護和狀態更新
-
WebRTC 會自動監測連接狀態,處理網絡變化。
-
實時調整碼率,保證音視頻質量。
-
出現連接問題時,自動嘗試重新建立連接。
-