博客 / 詳情

返回

webrtc信令交互流程

無論是使用前端JS的WebRTC API接口,還是在WebRTC源碼上構建自己的對聊框架,都需要遵循以下執行流程:
image.png

上述序列中,WebRTC並不提供Stun服務器和Signal服務器,服務器端需要自己實現。Stun服務器可以用google提供的實現stun協議的測試服務器(stun:stun.l.google.com:19302),Signal服務器則完全需要自己實現了,它需要在ClientA和ClientB之間傳送彼此的SDP信息和candidate信息,ClientA和ClientB通過這些信息建立P2P連接來傳送音視頻數據。 stun/turn、relay服務器的實現在WebRTC源碼中都有示例。

上述序列中,標註的場景是ClientA向ClientB發起對聊請求,調用描述如下:

  1. ClientA首先創建PeerConnection對象,然後打開本地音視頻設備,將音視頻數據封裝成MediaStream添加到PeerConnection中。
  2. ClientA調用PeerConnection的CreateOffer方法創建一個用於offer的SDP對象,SDP對象中保存當前音視頻的相關參數。ClientA通過PeerConnection的SetLocalDescription方法將該SDP對象保存起來,並通過Signal服務器發送給ClientB。
  3. ClientB接收到ClientA發送過的offer SDP對象,通過PeerConnection的SetRemoteDescription方法將其保存起來,並調用PeerConnection的CreateAnswer方法創建一個應答的SDP對象,通過PeerConnection的SetLocalDescription的方法保存該應答SDP對象並將它通過Signal服務器發送給ClientA。
  4. ClientA接收到ClientB發送過來的應答SDP對象,將其通過PeerConnection的SetRemoteDescription方法保存起來。
  5. 在SDP信息的offer/answer流程中,ClientA和ClientB已經根據SDP信息創建好相應的音頻Channel和視頻Channel並開啓Candidate數據的收集,Candidate數據可以簡單地理解成Client端的IP地址信息(本地IP地址、公網IP地址、Relay服務端分配的地址)。
  6. 當ClientA收集到Candidate信息後,PeerConnection會通過OnIceCandidate接口給ClientA發送通知,ClientA將收到的Candidate信息通過Signal服務器發送給ClientB,ClientB通過PeerConnection的AddIceCandidate方法保存起來。同樣的操作ClientB對ClientA再來一次。
  7. 這樣ClientA和ClientB就已經建立了音視頻傳輸的P2P通道,ClientB接收到ClientA傳送過來的音視頻流,會通過PeerConnection的OnAddStream回調接口返回一個標識ClientA端音視頻流的MediaStream對象,在ClientB端渲染出來即可。同樣操作也適應ClientB到ClientA的音視頻流的傳輸。
user avatar luguolangren 頭像 yih1ko 頭像 zeebj 頭像 gzming 頭像 damonxiaozhi 頭像
5 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.