最近項目需要了解下webrtc,網上webrtc的資料層出不窮,大多都是過時的描述。個人在這方面也走了不少彎路,為了方便自己后續的工作,將自己閱讀代碼的所得進行了總結。鑒于個人水平有限,錯誤在所難免,敬請指正不甚感激!
webrtc是Web Real-Time Communication的縮寫,google收購Global ip Solutions公司而獲得的一項技術,用來實現瀏覽器與瀏覽器或者瀏覽器與本地應用的視頻通話標準,也可以用來實現文件共享等功能!后來谷歌推廣成了一套W3C標準,目前支持的瀏覽器有 Chrome、Firefox、Opera。有兩大使用比較廣泛的開源實現,一個是谷歌自己實現的webrtc另一套是愛立信實現的openwebrtc。webrtc源碼托管在谷歌源碼服務器,可以參考https://webrtc.org/中的文檔獲取源碼和編譯,由于國內被墻了,所以這個過程比較痛苦,后面抽時間專門針對這塊總結下。openwebrtc源碼托管在github上,參考https://github.com/EriCSSonResearch/openwebrtc!本系列文章都是針對的谷歌的源碼實現。
無論使用前端的WebRtc API接口,還是WebRtc源碼上構建自己的聊天框架,都需要遵循以下執行流程:  為了便于描述,只考慮ClientA鏈接上apPRtc服務器(谷歌實現的房間服務器和信令服務器),coturn服務器(ICE服務器),并將自己的condidate發送給信令apprtc服務器后,ClientB才開始鏈接,ClientA想ClientB發起對聊請求,調用描述如下: - ClientA鏈接上房間服務器后,房間服務器將信令服務器,ICE服務器的配置信息傳送給ClientA - ClientA拿到配置信息后,創建PeerConnection對象,新建本地的音視頻流并封裝在MediaStream對象中,并添加在創建的PeerConnection對象中 - ClientA通過creatOff創建本地SDP,創建成功后通過SDPObserver回調調用SetLocalDescription設置本地despription,設置成功后調用回調通過http協議將本地的SDP發送到遠程的房間服務器,接著通過ICE服務器查詢本機對外的接入端(Condidate),每發現新的condidate,ice服務器會通過異步的方式告知,本地則會調用相應的回調并將結果通過websocket發送給信令服務器
 為了便于描述,只考慮ClientA鏈接上apPRtc服務器(谷歌實現的房間服務器和信令服務器),coturn服務器(ICE服務器),并將自己的condidate發送給信令apprtc服務器后,ClientB才開始鏈接,ClientA想ClientB發起對聊請求,調用描述如下: - ClientA鏈接上房間服務器后,房間服務器將信令服務器,ICE服務器的配置信息傳送給ClientA - ClientA拿到配置信息后,創建PeerConnection對象,新建本地的音視頻流并封裝在MediaStream對象中,并添加在創建的PeerConnection對象中 - ClientA通過creatOff創建本地SDP,創建成功后通過SDPObserver回調調用SetLocalDescription設置本地despription,設置成功后調用回調通過http協議將本地的SDP發送到遠程的房間服務器,接著通過ICE服務器查詢本機對外的接入端(Condidate),每發現新的condidate,ice服務器會通過異步的方式告知,本地則會調用相應的回調并將結果通過websocket發送給信令服務器
通過上述過程apprtc服務器保存有ClientA的SDP以及Condidate信息,給A B之間創建p2p鏈接創造了條件。
ClientB鏈接上房間服務器,房間服務器將信令服務器,ICE服務器的配置信息,已經ClientA的SDP,condidate信息全部返回給ClientB。ClientB創建PeerConnection對象,新建本地的音視頻流并封裝在MediaStream對象中,并添加在創建的PeerConnection對象中ClientB先將ClientA的SDP信息通過SetRemoteDescripton保存,通過CreatAnswer接口創建本地SDP,若創建成功通過SDPObserver回調調用SetLocalDescription設置本地description,設置成功后也會通過SDPObserve回調將SDP發送給信令服務器。在SetLocalDescription會根據房間服務器返回的ice配置信息鏈接ice服務器,開始查詢本地的condidate,每發現新的condidate,ice服務器會通過異步的方式告知,本地則會調用相應的回調并將結果通過websocket發送給信令服務器。接著會將房間服務器送回的ClientA condidate通過SetRemoteCondidate保存!信令服務器會將ClientB端的SDP condidate信息通過websocket發送給ClientA,ClientA通過SetRemoteDescripton保存ClientB的SDP信息,通過SetRemoteCondidate保存ClientB的condidate信息,至此兩端的p2p鏈接建立完畢!相關時序圖如下:  類圖如下:
 類圖如下: 
| 
 
 | 
新聞熱點
疑難解答