前言
在前面《WebRTC之服務(wù)器搭建》 我們已經(jīng)搭建好了WebRTC所需的服務(wù)器環(huán)境,主要是三個(gè)服務(wù)器:
房間服務(wù)器、信令服務(wù)器以及TURN穿透服務(wù)器。
下面我們就使用搭建好的服務(wù)器來(lái)使用WebRTC實(shí)現(xiàn)Android端的1對(duì)1實(shí)時(shí)通話。
WebRTC通信流程

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

獲取完整源碼
因?yàn)榇a有點(diǎn)多,所以筆者在這里就不貼了,如果感興趣的童鞋可以在公號(hào)發(fā)送WebRTC通話demo獲取。
遇到的問(wèn)題
1、使用okhttp鏈接webSocket時(shí)報(bào)wss 403的錯(cuò)誤
在請(qǐng)求參數(shù)中添加一個(gè)請(qǐng)求頭key為"Origin" value為"http://*******"即可。
2、調(diào)用PeerConnection.setLocalDescription時(shí)崩潰的問(wèn)題
這是因?yàn)槿鄙贆?quán)限:android.permission.ACCESS_NETWORK_STATE導(dǎo)致的。
關(guān)注我,一起進(jìn)步,人生不止coding?。?!