1. 程式人生 > >iOS下WebRTC音視訊通話(一)

iOS下WebRTC音視訊通話(一)

在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這個框架內部做了處理,只需要設定好打洞的服務以及一些回撥即可。
  • 除了上面那些伺服器外,還需要一些額外的伺服器用來發現使用者,比如XMPP服務,主要是為了維護使用者的關係以及保持其線上、離線等狀態。
  • WebRTC框架內不提供信令服務,因此信令資訊的傳送和接收處理需要我們自己去處理。處理的方式也有很多種,比如利用XMPP的的傳送和接收訊息的機制,將信令資訊傳送給對方;也可以用Http網路將信令訊息傳送給對方;還可以利用WebSocket將資訊傳送給對方。

先大致瞭解WebRTC互動的過程,便於後面理解程式碼。
下一篇我會編寫一個在同路由器 的區域網內進行視訊通話的Demo。

其實iOS 中WebRTC的處理過程與Web端的處理過程除了API命名不同,過程基本是一致的。
重要的是通過編寫程式碼,然後對照程式碼的每一步去思考它這樣做是為了幹啥。

Have Fun!