搭建webrtc視頻通訊要知道的事兒

背景介紹

?????WebRTC——“網(wǎng)絡(luò)實(shí)時(shí)通信”(Web Real-Time Communications),是瀏覽器增加的新功能,旨在將實(shí)時(shí)通信功能引入到所有的瀏覽器中,并通過(guò)HTML5標(biāo)簽和JavascriptAPI使該功能可為Web開(kāi)發(fā)者所用。WebRTC提供類似Skype、GoogleMail刨晴、WeChat的功能,但不必安裝任何軟件或是插件垛玻,在PC端或移動(dòng)端都可使用割捅。由于移動(dòng)通信的發(fā)展,比如WeChat通話的出現(xiàn)帚桩,使得日人均通話達(dá)到2.05次亿驾,月人均通話時(shí)長(zhǎng)達(dá)到139分鐘,這些都潛移默化地改變?nèi)藗兊耐ㄐ欧绞秸撕浚嵏擦藗鹘y(tǒng)的電話通信莫瞬。相信WebRTC的到來(lái)也即將掀起另外一次互聯(lián)網(wǎng)通信革新的浪潮。這項(xiàng)技術(shù)與瀏覽器的其他技術(shù)可能徹底改變我們?cè)谒饺撕蜕虡I(yè)領(lǐng)域溝通方式郭蕉,比如在網(wǎng)絡(luò)視頻教學(xué)疼邀,線上就醫(yī)問(wèn)診,互動(dòng)直播等等領(lǐng)域召锈。

????目前旁振,WebRTC所需要的標(biāo)準(zhǔn)和協(xié)議仍在開(kāi)發(fā)中,該項(xiàng)任務(wù)由萬(wàn)維網(wǎng)聯(lián)盟W3C(World Wide WebConosortium)和互聯(lián)網(wǎng)工程任務(wù)組IETF(Internet Engineering Task Force)聯(lián)合負(fù)責(zé)涨岁,但是兩個(gè)組織負(fù)責(zé)獨(dú)立的工作拐袜。W3C負(fù)責(zé)編寫用于WebRTC的標(biāo)準(zhǔn)API,IETF負(fù)責(zé)制定WebRTC的標(biāo)準(zhǔn)協(xié)議梢薪。在2017年11月蹬铺,經(jīng)歷了6年的修訂之后,WebRTC1.0草案定稿秉撇,還有很多API在持續(xù)地編寫和完善之中甜攀,可以在公開(kāi)草案查看最新公布的標(biāo)準(zhǔn)和正在制定的草稿秋泄。

????WebRTC開(kāi)創(chuàng)性地使得瀏覽器能夠直接與其他瀏覽器交互,瀏覽器廠商也開(kāi)始漸漸地支持該功能规阀。各大瀏覽器已經(jīng)不同程度地使用WebRTC API和協(xié)議恒序,具體支持情況變化很快,要經(jīng)常翻閱官方文檔來(lái)確認(rèn)對(duì)WebRTC的支持版本情況和支持的API的數(shù)量谁撼。主流瀏覽器目前支持的核心API情況:

??Apple Safari11(仍處于開(kāi)發(fā)者預(yù)覽階段)

??GoogleChrome23

??Mozilla Firefox24 / Firefox OS

??Opera20

WebRTC原理

????一些大型應(yīng)用程序已經(jīng)開(kāi)始使用WebRTC進(jìn)行實(shí)時(shí)通信奸焙,包括谷歌Hangouts和Facebook Messenger。那么我們就來(lái)看看WebRTC到底是怎么工作的彤敛。完成一個(gè)WebRTC項(xiàng)目必須包含標(biāo)準(zhǔn)API、信令和NAT(Network Address Translation)了赌。

WebRTC確定的標(biāo)準(zhǔn)中三個(gè)主要的API:

????●?getUserMedia獲取音頻和視頻媒體(訪問(wèn)設(shè)備的麥克風(fēng)墨榄、前后置攝像頭、網(wǎng)絡(luò)攝像頭等媒體設(shè)備)勿她。

????●?RTCPeerConnection實(shí)現(xiàn)在兩個(gè)瀏覽器之間建立媒體連接路徑袄秩。它執(zhí)行信號(hào)處理,編解碼器處理逢并,點(diǎn)對(duì)點(diǎn)通信之剧,安全性和帶寬管理。(下文視頻通信實(shí)例要用到的主要API)

????●?RTCDataChannel允許在對(duì)等體(也稱端到端)之間進(jìn)行任意數(shù)據(jù)的雙向通信砍聊。(本文暫不介紹)

選擇信令

????信令的目的是為了實(shí)現(xiàn)對(duì)等體之間的建立連接背稼,它最重要的功能在于,在參與對(duì)等連接的兩個(gè)瀏覽器之間交換會(huì)話描述協(xié)議SDP(Session Description Protocal)對(duì)象中包含的信息玻蝌。此外蟹肘,建立的信令通道還用于交換候選IP地址,以便進(jìn)行ICE(Interactive Connectivity Establishment)打洞俯树。??

????WebRTC中信令發(fā)揮著舉足輕重的作用帘腹,但由于沒(méi)有把信令當(dāng)作標(biāo)準(zhǔn)話工作的內(nèi)容,WebRTC開(kāi)發(fā)人員可自由選擇任意信令方案许饿⊙粲基于WebRTC的實(shí)時(shí)語(yǔ)音+視頻通話功能,需要建立及時(shí)的雙向的連接陋率,用戶可選擇全雙工的通信協(xié)議到達(dá)實(shí)時(shí)通訊的效果球化,例如SIP、XMPP翘贮、WebSocket等赊窥,對(duì)前端開(kāi)發(fā)比較友好的是基于node的Socket.io,他是一個(gè)WebSocket庫(kù)狸页,支持及時(shí)锨能、雙向與基于事件的交流(下文案例就是使用此庫(kù))扯再。

????下圖解釋了一旦信令服務(wù)建立好了連接,兩個(gè)客戶端理論上可以進(jìn)行端到端的連接:

信令服務(wù)

ICE框架

????在真實(shí)的網(wǎng)絡(luò)中址遇,瀏覽器端之間建立連接可能會(huì)更為復(fù)雜熄阻,由于NAT(Network Address Translation)和防火墻的存在增加了這一技術(shù)的實(shí)施難度,需要采用特殊的協(xié)議和過(guò)程才能實(shí)現(xiàn)倔约。為此秃殉,WebRTC采用ICE協(xié)議,他是一種標(biāo)準(zhǔn)穿透協(xié)議浸剩,它整合了STUN(Session Traversal Utilities for NAT)和TURN(Traversal Using Relay around NAT)钾军。

????會(huì)話發(fā)起方瀏覽器需要知道目的瀏覽器的IP地址來(lái)進(jìn)行數(shù)據(jù)包的傳輸,就需要使用STUN服務(wù)器獲取盡可能多的訪問(wèn)對(duì)方潛在IP地址绢要。若是NAT或是防火墻限制非常嚴(yán)格的情況下吏恭,無(wú)法直接建立連接,這時(shí)TURN服務(wù)器作為中繼服務(wù)器重罪,它提供公共的IP地址用于轉(zhuǎn)發(fā)從設(shè)置中繼地址的瀏覽器接收到的數(shù)據(jù)包樱哼,以防對(duì)等連接失敗。

????如下圖是在上圖信令連接的基礎(chǔ)上是添加了 ICE之后的網(wǎng)絡(luò)連接

ICE框架

搭建多人視頻

????在了解WebRTC的原理過(guò)程中剿配,查閱了很多網(wǎng)站提供的demo大多都是雙人的視頻通訊搅幅,設(shè)想并嘗試搭建多人視頻通訊。本例是從codelab的step05雙人視頻案例改造而來(lái)呼胚。采取“全網(wǎng)狀”的體系結(jié)構(gòu):雙人視頻是創(chuàng)建一個(gè)RTCPeerConnection實(shí)現(xiàn)端到端的連接茄唐,多人視頻就創(chuàng)建RTCPeerConnection端到端的連接,即每個(gè)瀏覽器均與其他瀏覽器建立全網(wǎng)狀的對(duì)等連接蝇更。理論上在不考慮帶寬和CPU的情況下可以想創(chuàng)建無(wú)數(shù)個(gè)琢融。部分代碼修改的地方:

????Step1、服務(wù)端sever.js去掉numclients===1的限制簿寂,允許添加多個(gè)視頻參與者

sever.js

????Step2漾抬、頁(yè)面index.html文件去掉寫死的video

index.html

????Step3、創(chuàng)建對(duì)等對(duì)象進(jìn)行聯(lián)通offer 和answer端常遂,每?jī)蓚€(gè)用戶間創(chuàng)建一次聯(lián)通纳令,多個(gè)用戶之間都需要?jiǎng)?chuàng)建相互的鏈接。每新增一次用戶信令服務(wù)器會(huì)發(fā)送廣播通知其他每個(gè)用戶發(fā)起新連接克胳。onaddstream監(jiān)聽(tīng)到SDP連通后添加新的媒體流到本地:

main.js

????效果如下平绩,圖為我在同一個(gè)電腦的chrome瀏覽器添加三個(gè)視頻通訊的畫面

視頻畫面

? ? 調(diào)用瀏覽器自帶的API就可以實(shí)現(xiàn)視頻通信,而且具有跨平臺(tái)的優(yōu)勢(shì)漠另,WebRTC勢(shì)必會(huì)替代傳統(tǒng)web多媒體捏雌,成為新的解決方案。期待WebRTC標(biāo)準(zhǔn)越來(lái)越完善笆搓,促進(jìn)瀏覽器兼容也指日可待性湿。

參考鏈接

● https://webrtc.org/

●?https://www.html5rocks.com/en/tutorials/webrtc/basics/

●?http://io13webrtc.appspot.com/#1

●?https://zh.wikipedia.org/wiki/WebRTC

●?https://codelabs.developers.google.com/codelabs/webrtc-web/#0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纬傲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肤频,更是在濱河造成了極大的恐慌叹括,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宵荒,死亡現(xiàn)場(chǎng)離奇詭異汁雷,居然都是意外死亡报咳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門暑刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人稍走,你說(shuō)我怎么就攤上這事〔竦祝” “怎么了婿脸?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)柄驻。 經(jīng)常有香客問(wèn)我狐树,道長(zhǎng),這世上最難降的妖魔是什么鸿脓? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任抑钟,我火速辦了婚禮,結(jié)果婚禮上野哭,老公的妹妹穿的比我還像新娘在塔。我一直安慰自己,他們只是感情好拨黔,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布蛔溃。 她就那樣靜靜地躺著,像睡著了一般篱蝇。 火紅的嫁衣襯著肌膚如雪贺待。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天零截,我揣著相機(jī)與錄音麸塞,去河邊找鬼。 笑死涧衙,一個(gè)胖子當(dāng)著我的面吹牛哪工,可吹牛的內(nèi)容都是我干的奥此。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼正勒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼得院!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起章贞,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祥绞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鸭限,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜕径,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年败京,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兜喻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赡麦,死狀恐怖朴皆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泛粹,我是刑警寧澤遂铡,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站晶姊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏们衙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一宗侦、第九天 我趴在偏房一處隱蔽的房頂上張望忆蚀。 院中可真熱鬧,春花似錦蜓谋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)让网。三九已至呀忧,卻和暖如春而账,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泞辐。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工竞滓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人商佑。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肌幽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喂急,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容