前言
在前面《WebRTC之服務器搭建》 我們已經搭建好了WebRTC所需的服務器環境,主要是三個服務器:
房間服務器、信令服務器以及TURN穿透服務器,
下面我們就使用搭建好的服務器來使用WebRTC實作Android端的1對1實時通話,
WebRTC通信流程

通過上圖可以看出WebRTC的通信流程還是很繁瑣的,總結下來主要是三大步驟:信令服務注冊、SDP協商以及ICE交換三大程序,
下文的決議主要是針對該圖的決議,
信令服務注冊:
在整個 WebRTC 雙方互動的程序中,其業務邏輯的核心是信令, 所有的模塊都是通過信令串聯起來的,比喻在媒體協商,ICE交換的程序中就是
依靠信令完成的,
在本實踐中筆者使用了okHttp的WebSocket來完成信令通訊,主要做了以下幾件事情:
1、房間訊息通知,比如加入房間、離開房間等
2、發送offer資訊
3、接收answer資訊
4、發送交換ICE等相關資訊
注意:信令的交換程序不是WebRTC的規范標準,開發者只需要能夠完成相關資訊的及時交換即可,并非是一定要使用WebSocket
ICE交換:
更多關于ICE的相關知識可以查看筆者之前的文章:
《WebRTC之STUN、TURN以及ICE》
在ICE交換和SDP協商的程序中都使用到的一個重要的類就是PeerConnection,在創建PeerConnection的時候需要傳遞一個回呼引數PeerConnection.Observer,
我們只需要在回呼方法onIceCandidate方法中將IceCandidate資訊通過PeerConnection的addIceCandidate方法添加到PeerConnection中去,同時將IceCandidate資訊
發送給信令服務器,
信令服務器接收到IceCandidate資訊后將IceCandidate資訊下發到房間內的其他用戶終端,
其他用戶接收到信令服務器下發的IceCandidate資訊后通過PeerConnection的addIceCandidate方法添加到PeerConnection中去,至此雙方就完成了ICE的交換,
SDP協商:
為什么需要SDP,以及更多關于SDP的知識可以參考筆者之前的文章:《WebRTC之SDP協議》
SDP的互動程序主要是以下幾個步驟:
1、邀請者創建一個offer,也就是使用PeerConnection呼叫createOffer的API
2、在createOffer創建成功的回呼中設定本地SDP,也就是呼叫PeerConnection的setLocalDescription方法
3、在本地SDP設定成功的回呼中講offer資訊發送到信令服務器,讓信令服務器通知被邀請方
4、被邀請方通過信令拿到offer資訊后,通過PeerConnection的setRemoteDescription方法設定遠端SDP
5、在設定遠端SDP成功的回呼中通過PeerConnection的createAnswer方法創建一個answer,并且將answer設定為本地的SDP
6、被邀請方將創建成功的answer以信令的方式發送給邀請方,待邀請方接收到answer后通過PeerConnection的setRemoteDescription方法設定遠端SDP就完成了SDP的互動
至此雙方資訊交換完畢,如果順利就能進入P2P通話階段,
主要用到的依賴庫
// okhttp,主要使用它的webSocket
implementation("com.squareup.okhttp3:okhttp:4.9.0")
// WebRTC的依賴
implementation 'org.webrtc:google-webrtc:1.0.+'

獲取完整原始碼
因為代碼有點多,所以筆者在這里就不貼了,如果感興趣的童鞋可以在公號發送WebRTC通話demo獲取,
遇到的問題
1、使用okhttp鏈接webSocket時報wss 403的錯誤
在請求引數中添加一個請求頭key為"Origin" value為"http://*******"即可,
2、呼叫PeerConnection.setLocalDescription時崩潰的問題
這是因為缺少權限:android.permission.ACCESS_NETWORK_STATE導致的,
關注我,一起進步,人生不止coding!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289828.html
標籤:其他
