摘要:雖然是點(diǎn)對(duì)點(diǎn)通信,但還是需要服務(wù)器來(lái)初始化連接,并傳遞一些信息。服務(wù)器實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信的關(guān)鍵在于兩個(gè)瀏覽器之間能直接發(fā)送和接收數(shù)據(jù)包,但一般情況下,瀏覽器或手機(jī)都是通過(guò)路由器訪問(wèn),所以存在網(wǎng)絡(luò)地址轉(zhuǎn)換。
WebRTC
瀏覽器本身不支持相互之間直接建立信道進(jìn)行通信,都是通過(guò)服務(wù)器進(jìn)行中轉(zhuǎn)。比如現(xiàn)在有兩個(gè)客戶(hù)端,甲和乙,他們倆想要通信,首先需要甲和服務(wù)器、乙和服務(wù)器之間建立信道。甲給乙發(fā)送消息時(shí),甲先將消息發(fā)送到服務(wù)器上,服務(wù)器對(duì)甲的消息進(jìn)行中轉(zhuǎn),發(fā)送到乙處,反過(guò)來(lái)也是一樣。這樣甲與乙之間的一次消息要通過(guò)兩段信道,通信的效率同時(shí)受制于這兩段信道的帶寬。同時(shí)這樣的信道并不適合數(shù)據(jù)流的傳輸,如何建立瀏覽器之間的點(diǎn)對(duì)點(diǎn)傳輸,一直困擾著開(kāi)發(fā)者。
WebRTC 是一個(gè)開(kāi)源項(xiàng)目,旨在使得瀏覽器能為實(shí)時(shí)通信(RTC)提供簡(jiǎn)單的 JavaScript 接口。WebRTC 不僅可傳輸視頻,也可以傳輸其他數(shù)據(jù)例如文本、圖片等。需要注意的是,WebRTC 并不是瀏覽器的一個(gè)子集,瀏覽器只是根據(jù) WebRTC 的標(biāo)準(zhǔn)協(xié)議實(shí)現(xiàn)了 WebRTC 的原生接口。Android 和 IOS 系統(tǒng)也支持 WebRTC 。
WebRTC 應(yīng)用包括下面四個(gè)主要的概念:
信令服務(wù)器(Signalling servers)
ICE 服務(wù)器(ICE servers)
媒體服務(wù)器 (Media servers)
JavaScript 接口 (JavaScript API)
信令服務(wù)器信令服務(wù)器主要用于在兩個(gè)用戶(hù)之間交換信息。雖然 WebRTC 是點(diǎn)對(duì)點(diǎn)通信,但還是需要服務(wù)器來(lái)初始化連接,并傳遞一些信息。
WebRTC 沒(méi)有定義用于建立信道的信令的協(xié)議,因此可以使用任意的傳輸方式,例如 WebSocket, XMPP, SIP, AJAX。
你可以使用實(shí)時(shí)的傳輸協(xié)議比如 WebSocket 來(lái)交換數(shù)據(jù),也可以使用簡(jiǎn)單的 GET/POST 方式輪詢(xún)服務(wù)器來(lái)獲取數(shù)據(jù)。
信令服務(wù)器傳送的數(shù)據(jù)有:
協(xié)商媒體功能和設(shè)置
標(biāo)識(shí)和驗(yàn)證會(huì)話參與者的身份
控制媒體會(huì)話、指示進(jìn)度、更改會(huì)話和終止會(huì)話
其中只有第一項(xiàng)的必備功能。其他都可以根據(jù)業(yè)務(wù)需求自由調(diào)整。
媒體協(xié)商最重要的功能在于,為參與點(diǎn)對(duì)點(diǎn)通信的兩個(gè)瀏覽器之間交換會(huì)話描述協(xié)議(SDP)。SDP 包含瀏覽器的 RTP 媒體棧配置所需的全部信息,包括媒體類(lèi)型(音頻、視頻、數(shù)據(jù))、所需的編解碼器,用于編解碼器的哥哥參數(shù)或設(shè)置,以及有關(guān)帶寬的信息。此外,信令通道還用于交換候選地址,以便進(jìn)行 ICE 打洞。
ICE 服務(wù)器實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信的關(guān)鍵在于兩個(gè)瀏覽器之間能直接發(fā)送和接收數(shù)據(jù)包,但一般情況下,瀏覽器或手機(jī)都是通過(guò)路由器訪問(wèn) Internet,所以存在網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)。位于 NAT 之內(nèi)的 IP 地址是私有地址,外部無(wú)法訪問(wèn)。分配給 NAT 的 IP 地址才是公共地址。NAT 每次從內(nèi)部到外部轉(zhuǎn)發(fā)數(shù)據(jù)包時(shí)都使用公共地址。
交互式建立連接(ICE)是一種標(biāo)準(zhǔn)穿透協(xié)議,它利用 STUN 和 TURN 服務(wù)器來(lái)建立連接。
STUN 服務(wù)器可以遍歷 NAT,獲取瀏覽器的候選地址,包括私有地址、外層 NAT 的公共 IP 地址等。通信信令通道可以交換候選地址,瀏覽器一旦發(fā)送并收到了候選項(xiàng),就會(huì)開(kāi)始進(jìn)行連接檢查,若檢查成功,便使用該候選項(xiàng)發(fā)送媒體。
在大多情況下,通過(guò)穿透可以建立直接對(duì)等連接。但是,若 NAT 或防火墻限制非常嚴(yán)格,無(wú)法建立連接,就只能通過(guò) TURN 服務(wù)器中繼媒體。
媒體服務(wù)器媒體服務(wù)器不是必須的,但在多方會(huì)話或需要對(duì)媒體做額外處理的情況下可以考慮加入。對(duì)于有多個(gè)瀏覽器參與的會(huì)議,可以采用一個(gè)集中式媒體服務(wù)器。在這種情況下,美國(guó)瀏覽器都只需與媒體服務(wù)器建立單個(gè)連接即可,這種結(jié)構(gòu)的優(yōu)勢(shì)是額能夠擴(kuò)展非常大的會(huì)話,同時(shí)可以在最大限度上減少當(dāng)有新加入者加入會(huì)話事美國(guó)瀏覽器所需的處理工作量。同時(shí),媒體服務(wù)器也可對(duì)媒體進(jìn)行分析、處理、保存等工作。
JavaScript 接口 getUserMedia通過(guò)調(diào)用 navigator.getUserMedia() 可以獲取視頻或音頻的數(shù)據(jù),constraints 參數(shù)可以選擇是否獲取視頻音頻。下面是一個(gè)簡(jiǎn)單的示例
var constraints = { audio: false, video: true }; var video = document.querySelector("video"); function successCallback(stream) { if (window.URL) { video.src = window.URL.createObjectURL(stream); } else { video.src = stream; } } function errorCallback(error) { console.log("navigator.getUserMedia error: ", error); } navigator.getUserMedia(constraints, successCallback, errorCallback);RTCPeerConnection
RTCPeerConnection 是 WebRTC 中最重要的一個(gè)接口,用于確定 ICE 服務(wù)器、交換 SDP。連接過(guò)程如下:
創(chuàng)建 RTCPeerConnection 對(duì)象
RTCPeerConnection 的參數(shù)用于確定 ICE 服務(wù)器,下面是使用了 google 開(kāi)放的 STUN 服務(wù)器
let iceServer = { "iceServers": [{ "url": "stun:stun.l.google.com:19302" }] }; let pc = new RTCPeerConnection(servers);
將媒體流放入 RTCPeerConnection 對(duì)象中
pc.addStream(localStream);
通過(guò) offer 和 answer 交換 SDP 描述符
甲和乙各自建立一個(gè)PC實(shí)例
甲通過(guò) PC 所提供的 createOffer() 方法建立一個(gè)包含甲的 SDP 描述符的 offer 信令
甲通過(guò) PC 所提供的 setLocalDescription() 方法,將甲的SDP描述符交給甲的 PC 實(shí)例
甲將 offer 信令通過(guò)服務(wù)器發(fā)送給乙
乙將甲的 offer 信令中所包含的的SDP描述符提取出來(lái),通過(guò)PC所提供的 setRemoteDescription() 方法交給乙的PC實(shí)例
乙通過(guò)PC所提供的 createAnswer() 方法建立一個(gè)包含乙的 SDP 描述符 answer 信令
乙通過(guò)PC所提供的 setLocalDescription() 方法,將乙的 SDP 描述符交給乙的PC實(shí)例
乙將answer信令通過(guò)服務(wù)器發(fā)送給甲
甲接收到乙的answer信令后,將其中乙的SDP描述符提取出來(lái),調(diào)用setRemoteDescripttion()方法交給甲自己的PC實(shí)例
ICE 打洞
當(dāng)網(wǎng)絡(luò)候選可用時(shí),通過(guò)信令服務(wù)器將其發(fā)送到對(duì)方瀏覽器
pc.onicecandidate = function(event) { if (event.candidate) { sendToServer(event.candidate) } };
當(dāng)接受到對(duì)方網(wǎng)絡(luò)候選時(shí),將其加入
let candidate = new RTCIceCandidate(candidate); pc.addIceCandidate(candidate);
監(jiān)聽(tīng)對(duì)方發(fā)送的媒體是否可用,并播放媒體
pc.onaddstream = event => { remoteVideo.src = window.URL.createObjectURL(event.stream); }RTCDataChannel
RTCDataChannel 是 RTCPeerConnection API 的一部分,只有在創(chuàng)建了 RTCPeerConnection 實(shí)例后才能創(chuàng)建數(shù)據(jù)通道。數(shù)據(jù)通道可以用于發(fā)送文本或是文件。
pc = new RTCPeerConnection(); dc = pc.createDataChannel("dc"); dc.onmessage = event => console.log(event.data); dc.send("text"); dc.sed(new arraybuffer(32))
在另一端可以使用 ondatachannel 獲得 RTCDataChannel 對(duì)象
pc.ondatachannel = event => dc = event.channel;參考資料
https://codelabs.developers.g...
https://webrtc.org/
https://segmentfault.com/a/11...
http://www.muazkhan.com/2013/...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/83486.html
摘要:如果要多人會(huì)話,就要單對(duì)單建立多個(gè)連接。同樣的步驟執(zhí)行多次就可以了客戶(hù)端代碼開(kāi)始結(jié)束發(fā)送打開(kāi)頁(yè)面即開(kāi)啟等待模式服務(wù)端代碼 webRTC介紹 webRTC是英文Web Real-Time Communication的縮寫(xiě),中文翻譯網(wǎng)頁(yè)實(shí)時(shí)通信,是瀏覽器不需要服務(wù)器的中轉(zhuǎn),可以直接通信的技術(shù) webRTC 應(yīng)用 網(wǎng)上的很多教程都會(huì)包含實(shí)時(shí)視頻的介紹,不過(guò)我感覺(jué)視頻看起來(lái)很酷,不過(guò)卻不是we...
摘要:前言本項(xiàng)目旨在從零到壹,制作一款界面精美的聊天軟件。因?yàn)楸救耸情_(kāi)發(fā),設(shè)計(jì)功底欠缺,所以軟件設(shè)計(jì)的有點(diǎn)丑,如果有大神有更好的,歡迎。 Hola 前言 本項(xiàng)目旨在從零到壹,制作一款界面精美的聊天軟件。 Github 地址因?yàn)橐压ぷ?,所以可能沒(méi)有多少時(shí)間來(lái)繼續(xù)跟進(jìn)這個(gè)項(xiàng)目了,項(xiàng)目可優(yōu)化的點(diǎn)已在下文列出,歡迎大家 Fork 或 Star。 ps: 征 logo 一枚。因?yàn)楸救耸情_(kāi)發(fā),設(shè)計(jì)功底...
摘要:下面我們就看一下具體如何申請(qǐng)權(quán)限靜態(tài)權(quán)限申請(qǐng)?jiān)陧?xiàng)目中的中增加以下代碼動(dòng)態(tài)權(quán)限申請(qǐng)隨著的發(fā)展,對(duì)安全性要求越來(lái)越高。其定義如下通過(guò)上面的代碼我們就將顯示視頻的定義好了。當(dāng)發(fā)送消息,并收到服務(wù)端的后,其狀態(tài)變?yōu)椤?作者:李超,如遇到相關(guān)問(wèn)題,可以點(diǎn)擊這里與作者直接交流。 前言 在學(xué)習(xí) WebRTC 的過(guò)程中,學(xué)習(xí)的一個(gè)基本步驟是先通過(guò) JS 學(xué)習(xí) WebRTC的整體流程,在熟悉了整體流程之后,...
摘要:本質(zhì)上允許網(wǎng)頁(yè)程序創(chuàng)建點(diǎn)對(duì)點(diǎn)通信,我們將會(huì)在隨后的章節(jié)中進(jìn)行介紹。信令涉及網(wǎng)絡(luò)檢索和穿透,會(huì)話創(chuàng)建及管理,通信安全,媒體功能元數(shù)據(jù)和調(diào)制及錯(cuò)誤處理。這樣就會(huì)完全建立及激活節(jié)點(diǎn)間的網(wǎng)絡(luò)套接字會(huì)話。 原文請(qǐng)查閱這里,略有刪減,本文采用知識(shí)共享署名 4.0 國(guó)際許可協(xié)議共享,BY Troland。 這是 JavaScript 工作原理第十八章。 概述 何為 WebRTC ?首先,字面上已經(jīng)...
閱讀 2404·2021-10-09 09:41
閱讀 1805·2019-08-30 15:53
閱讀 1055·2019-08-30 15:52
閱讀 3521·2019-08-30 11:26
閱讀 830·2019-08-29 16:09
閱讀 3505·2019-08-29 13:25
閱讀 2327·2019-08-26 16:45
閱讀 1993·2019-08-26 11:51