爲了讓初學者快速起步把 WebRTC demo 跑起來,我寫了一個極其簡單的 startup demo 項目,展示瞭如何基於 WebRTC API 實現一對一的視頻通話。該項目地址:https://github.com/Jhuster/RTCStartupDemo
本文則主要介紹如何從一對一通話升級到多人通話,即視頻會議,其中涉及到如下幾個問題:
多人會議,每個 Client 是創建多個 PeerConnection 還是隻有一個 PeerConnection ?
多人會議,誰來發起 OFFER,誰來作爲 ANSWER,如何把多個 Client 相互間的連接分別建立起來 ?
首先,我們用下面這一張圖來看看兩個 WebRTC Peer 之間是如何建立一對一通話鏈路的:
在一對一通話場景中,每個 Client 均創建有一個 PeerConnection 對象,由一方主動發 OFFER SDP,另一方則應答 ANSWER SDP,最後雙方交換 ICE Candidate 從而完成通話鏈路的建立。
如果要再加入一個人,其實也是一樣的流程,假設新加入的人是 C,那麼,只需要 C 分別跟 A 和 B 交換 SDP 和 Candidate 即可建立新的通話鏈路。C 加入後,誰來主動發送 OFFER 呢 ?常用的策略有 2 種:
每當有新的成員加入到房間後,房間內的每個人主動給新成員發 OFFER,並等待他回覆 ANSWER 建立新的 PeerConnection 連接
每當有新的成員加入到房間後,新成員主動給房間的每個人發 OFFER,並等待 ANSWER 建立新的 PeerConnection 連接
當然,還有其他的策略,無非就是誰主動扮演 OFFER 發起者的角色觸發整個建聯過程而已。
如圖所示,3 人會議,則每個人都會創建 2 個 PeerConnection 分別與其他兩個人建立通話連接。
我這裏實現了一套 Web 端 3 人連麥會議的 demo 代碼,完整地復現了上述場景和邏輯,大家有興趣可以看一看:
https://github.com/Jhuster/RTCStartupDemo/tree/master/RTCClientDemo/Web/multiple
本文一直描述的是通過多 PeerConnection 的方案來實現多人會議,那麼,是否也可以僅僅使用單個 PeerConnection 呢 ?答案是肯定的,不過這需要服務器端的參與,讓多路流通過一個 PeerConnection 連接端口進行傳輸,到端上再利用 ***c 等信息提取和分離出來,整體來說要複雜很多,但是也是有不少好處的。
有一篇文章關於單 PeerConnection 和多 PeerConnection 的優劣分析,有興趣的小夥伴可以看看,鏈接如下:
《WebRTC RTCPeerConnection. One to rule them all, or one per stream?》
簡單來說,多 PeerConnection 會導致連接到 SFU 服務器的連接數量超多,對服務端的壓力是比較大的;另外,多 PeerConnection 也比單 PeerConnection 要消耗更多的資源。而單 PeerConnection 雖然整個邏輯複雜,但是在上述這兩點上還是有一些不錯的優化的。
關於 WebRTC 如何從一對一通話到多人會議,就分享到這裏了,如有疑問的小夥伴歡迎來信 [email protected] 交流。另外,也歡迎大家關注我的新浪微博 @盧_俊 或者 微信公衆號 @Jhuster 獲取最新的文章和資訊。