WebRTC之端對(duì)端通話

前言

在前面《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通信流程

一對(duì)一音視頻通話步驟

通過(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)行成功截圖

獲取完整源碼

因?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?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容