WebRTC手記之初探

轉載請註明出處:http://www.cnblogs.com/fangkm/p/4364553.html html

WebRTC是HTML5支持的重要特性之一,有了它,再也不須要藉助音視頻相關的客戶端,直接經過瀏覽器的Web頁面就能夠實現音視頻對聊功能。並且WebRTC項目是開源的,咱們能夠藉助WebRTC源碼快速構建本身的音視頻對聊功能。不管是使用前端JS的WebRTC API接口,仍是在WebRTC源碼上構建本身的對聊框架,都須要遵循如下執行流程:前端

 

上述序列中,WebRTC並不提供Stun服務器和Signal服務器,服務器端須要本身實現。Stun服務器能夠用google提供的實現stun協議的測試服務器(stun:stun.l.google.com:19302),Signal服務器則徹底須要本身實現了,它須要在ClientA和ClientB之間傳送彼此的SDP信息和candidate信息,ClientA和ClientB經過這些信息創建P2P鏈接來傳送音視頻數據。因爲網絡環境的複雜性,並非全部的客戶端之間都可以創建P2P鏈接,這種狀況下就須要有個relay服務器作音視頻數據的中轉,本文本着源碼剖析的態度,這種狀況就不考慮了。這裏說明一下, stun/turn、relay服務器的實如今WebRTC源碼中都有示例,真是個名副其實的大寶庫。瀏覽器

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

  • ClientA首先建立PeerConnection對象,而後打開本地音視頻設備,將音視頻數據封裝成MediaStream添加到PeerConnection中。
  • ClientA調用PeerConnection的CreateOffer方法建立一個用於offer的SDP對象,SDP對象中保存當前音視頻的相關參數。ClientA經過PeerConnection的SetLocalDescription方法將該SDP對象保存起來,並經過Signal服務器發送給ClientB。
  • ClientB接收到ClientA發送過的offer SDP對象,經過PeerConnection的SetRemoteDescription方法將其保存起來,並調用PeerConnection的CreateAnswer方法建立一個應答的SDP對象,經過PeerConnection的SetLocalDescription的方法保存該應答SDP對象並將它經過Signal服務器發送給ClientA。
  • ClientA接收到ClientB發送過來的應答SDP對象,將其經過PeerConnection的SetRemoteDescription方法保存起來。
  • 在SDP信息的offer/answer流程中,ClientA和ClientB已經根據SDP信息建立好相應的音頻Channel和視頻Channel並開啓Candidate數據的收集,Candidate數據能夠簡單地理解成Client端的IP地址信息(本地IP地址、公網IP地址、Relay服務端分配的地址)。
  • 當ClientA收集到Candidate信息後,PeerConnection會經過OnIceCandidate接口給ClientA發送通知,ClientA將收到的Candidate信息經過Signal服務器發送給ClientB,ClientB經過PeerConnection的AddIceCandidate方法保存起來。一樣的操做ClientB對ClientA再來一次。
  • 這樣ClientA和ClientB就已經創建了音視頻傳輸的P2P通道,ClientB接收到ClientA傳送過來的音視頻流,會經過PeerConnection的OnAddStream回調接口返回一個標識ClientA端音視頻流的MediaStream對象,在ClientB端渲染出來便可。一樣操做也適應ClientB到ClientA的音視頻流的傳輸。

這裏的流程僅僅是從使用層面上描述了一下,具體內部都作了什麼、怎麼作的,之後的文章中會慢慢細扒,萬事開頭難,自我鼓勵一下。網絡

相關文章
相關標籤/搜索