iOS下WebRTC音視訊通話(一)

哈雷哈雷_Wong發表於2019-07-11

在iOS下做IM功能時,難免都會涉及到音訊通話和視訊通話。QQ中的QQ電話和視訊通話效果就非常好,但是如果你沒有非常深厚的技術,也沒有那麼大的團隊,很難做到QQ那麼快速和穩定的通話效果。

但是利用WebRTC技術,即使一個人也能夠實現效果不錯的音視訊通話。本篇介紹WebRTC的基礎概念。

WebRTC介紹

WebRTC,名稱源自網頁實時通訊(Web Real-Time Communication)的縮寫,是一個支援網頁瀏覽器進行實時語音對話或視訊對話的技術,是谷歌2010年以6820萬美元收購Global IP Solutions公司而獲得的一項技術。

WebRTC(Web Real-Time Communication)專案的最終目的主要是讓Web開發者能夠基於瀏覽器(Chrome\FireFox...)輕易快捷開發出豐富的實時多媒體應用,而無需下載安裝任何外掛,Web開發者也無需關注多媒體的數字訊號處理過程,只需編寫簡單的Javascript程式即可實現。但是經過多年的打磨,WebRTC現在已經可以在windows,linux,mac,android,iOS等多個平臺中使用。

WebRTC除了可以用來做音訊通話、視訊通話,還可以用來做視訊會議。

其他關於WebRTC的介紹可以參考:百度百科-WebRTC 以及 WebRTC官網

WebRTC 過程

WebRTC 利用RTCPeerConnection可以建立點對點高效、穩定的音訊、視訊流傳輸。但是在進行點對點的流傳輸之前,它依然還需要利用伺服器來做一些準備工作。而準備工作需要用到的東西就比較多了,比如STUN伺服器、TURN伺服器、ICE(NAT和防火牆穿透)、信令傳輸,相互之間的信令交換完畢,就會傳送實時音視訊留給對方。

進行音視訊通話的完整過程:

  • 1、首先設定好STUN伺服器、和TURN伺服器,然後將STUN伺服器和TURN伺服器包裝成RTCICEServer物件,儲存進陣列備用。
  • 2、利用上一步的陣列建立RTCPeerConnection連線。
  • 3、為RTCPeerConnection新增RTCMediaStream,而RTCMediaStream內包含視訊和音訊軌跡,只是做一些配置,然後WebRTC內部按照你的配置做音訊、視訊的採集。如果你只為RTCMediaStream新增音軌,就是做音訊通話;同時新增音軌和視訊軌跡,則是做視訊通話;只新增視訊軌跡,則只能看到視訊畫面,沒有聲音。(這些都是在採集端設定)
  • 4、為視訊軌跡設定渲染的容器,便於開始音視訊通話後,將實時視訊畫面渲染到檢視上。(如果是音訊通話則沒有視訊軌跡,就不需要渲染)
  • 5、發起方建立Offer,建立完成後會返回一個本地SessisonDescription(簡稱sdp,其實就是一些媒體和網路相關的後設資料資訊),然後為RTCPeerConnection設定本地sdp(RTCPeerConnection需要設定遠端sdp和本地sdp完成後才能進行點對點的流傳輸)。
  • 6、將本地sdp資訊設定完成後,將本地sdp傳送給對方(這個過程就是將本地offer信令傳送給對方)。
  • 7、接收方收到offer信令之後,重複上面的1、2、3、4,然後將接收到的offer sdp設定為自己的遠端sdp,然後再建立一個Answer。同樣的建立完成後會返回一個SessisonDescription,將這個sdp設定為RTCPeerConnection的本地sdp,設定完成後再將answer傳送給發起方。
  • 8、發起方收到answer後,將answer sdp設定為RTCPeerConnection的遠端sdp。
  • 9、然後雙方就開始互相傳送多媒體流資料,整個音視訊通話就完成了。

說明 STUN伺服器、TURN伺服器地址其實就是個url而已:stun:stun.l.google.com:19302turn:numb.viagenie.ca,其中STUN伺服器和TURN伺服器可以在自家的服務上建立,STUN、TURN伺服器可以有多個,做備用。

ICE,本端會生成所有網路介面對應不同協議的Candidate。 每一個Candidate實際上描述了和自己的通訊方式。比如一個STUN型別的Candidate會包含本端在防火牆外的IP和埠型別。本端會通過信令協議(sip/xmpp/http)將自己的所有的Candidate傳送給對端。對方接收到後,會嘗試連線, 並找到一個最好的連線方式建立和本端的連線,之後的流媒體資料將通過此連線傳輸。

關於Candidate,是對本端網路通訊能力的一種描述。對於UDP/STUN協議,Candidate僅包含IP及埠資訊,對於TURN,包含TURN server的IP,埠,以及使用者名稱密碼等。Candidate由本端程式碼生成,生成後通過信令傳送給對端。對端會在本端所有的candidate中選擇一個最好的建立與本端的連線。

除了上面那些伺服器外,還需要一些額外的伺服器用來發現使用者,比如XMPP服務,主要是為了維護使用者的關係以及保持其線上、離線等狀態。

WebRTC框架內不提供信令服務,因此信令資訊的傳送和接收處理需要我們自己去處理。處理的方式也有很多種,比如利用XMPP的的傳送和接收訊息的機制,將信令資訊傳送給對方;也可以用Http網路將信令訊息傳送給對方;還可以利用WebSocket將資訊傳送給對方。

先大致瞭解WebRTC互動的過程,便於後面理解程式碼。

下一篇我會編寫一個在同路由器 的區域網內進行視訊通話的Demo。

關於WebRTC概念性的理解下面有幾篇文章,文章內也有一些連結都是很好的資料:

使用WebRTC搭建前端視訊聊天室——入門篇

使用WebRTC搭建前端視訊聊天室——信令篇

WebRTC的RTCDataChannel

雖然以上三篇主要是講Web前端的WebRTC使用,但是過程和概念歸納的非常好,可以多讀幾遍。

WebRTC and the Early API

WebRTC代理中的各種列舉狀態

P2P傳輸,其中Candidate的作用以及P2P連線的過程介紹的對理解非常有幫助。

WebRTC中文網 其實iOS 中WebRTC的處理過程與Web端的處理過程除了API命名不同,過程基本是一致的。

重要的是通過編寫程式碼,然後對照程式碼的每一步去思考它這樣做是為了幹啥。

Have Fun!

相關文章