最近有幸看到Agora發(fā)布的RTC演講通知链瓦,參加了幾次云上講座租冠,由于本人之前一直從事通訊行業(yè),而且做過電信運營商的通訊設(shè)備的研發(fā)刁愿,對于RTC技術(shù)一直比較感興趣,在此分享一下我的理解到逊。
RTC-Real TimeCommunication铣口,實時通訊技術(shù)。提到實時通訊觉壶,大家最熟悉的就是大家打電話脑题,電信網(wǎng)當(dāng)然也經(jīng)歷了2G,3G铜靶,4G叔遂,5G,到了4G争剿,5G主要無線側(cè)和流量發(fā)展已艰,實時通訊其實并沒有特別大的變化,還是語音和視頻秒梅,這里就不再贅述了旗芬。
后來只是實時通訊滿足不了廣大人民群眾日益豐富的生活需求了,所以O(shè)TT蓬勃發(fā)展起來了捆蜀,像大家熟悉的微博、微信,因為大家很多事情并不需要實時的高速某個人辆它,比如只是曬一下自己當(dāng)下的心情/美食/有趣的段子誊薄,并不需要對方秒回或者立馬給出響應(yīng)的表達(dá)。
當(dāng)然實時通訊還是有眾多需要使用的場景锰茉,像疫情期間因遠(yuǎn)程辦公暴增的語音/視頻會議呢蔫,這兩年火到不行的直播帶貨,實時通訊再一次進(jìn)入了人們關(guān)注的視線飒筑;但是如果這些都基于運營商現(xiàn)有的實時通訊機(jī)制片吊,很難滿足日益豐富/變化的廣大人民群眾的需求,并且資費也會是很大的問題协屡,畢竟電話通訊比流量還是要貴很多的俏脊,因此基于非運營商通訊網(wǎng)的實時通訊技術(shù)得到了很大的發(fā)展。
很多公司看到了這類需求肤晓,其中最著名的就是Google推出的WebRTC技術(shù)爷贫,以及國內(nèi)做的最好的Agora聲網(wǎng)。WebRTC其實擴(kuò)展了RTC的發(fā)展領(lǐng)域补憾,本身是一個由Google發(fā)起的實時通訊解決方案漫萄,基于系統(tǒng)原生自帶的瀏覽器,開發(fā)者就可以快速地構(gòu)建出一個音視頻通訊應(yīng)用盈匾,并且該項目是完全開源的腾务。
在Google推出了WebRTC之后,W3C標(biāo)準(zhǔn)組織和IEFT組織迅速建立了標(biāo)準(zhǔn)組削饵,完善整個的技術(shù)標(biāo)準(zhǔn)體系岩瘦,這也使得WebRTC的通用化提供了比較好的基礎(chǔ),WebRTC事實上也成為了一種通訊標(biāo)準(zhǔn)葵孤。
WebRTC的整體架構(gòu)思路和流程如下圖担钮,WebRTC對于媒體處理做了很好的封裝
但是在最初的WebRTC里是沒有定義信令(Signaling)協(xié)議的,開發(fā)者可以自由發(fā)揮尤仍,事實上也確實很多不同協(xié)議的信令處理誕生箫津,HTTP Restful,Json over websocket, sip over http或者sip plugin都可以宰啦。一般來說需要有一個雙方都能訪問的中心端服務(wù)器來存儲通訊雙方(Caller和Callee)的信息苏遥,同時中心端服務(wù)器來幫助他們交換連接所需要的信息信令協(xié)議的目的是為了媒體通訊的雙方能夠獲取的通訊對端的存在(包括媒體通訊的IP地址,端口赡模,音視頻編解碼格式協(xié)商等),這樣主叫Caller和被叫Callee就可以相互發(fā)送媒體數(shù)據(jù)了田炭。
(圖里的例子是Browser之間P2P直接媒體互通的,這種情況在沒有對稱NAT情況下是可以漓柑,有NAT情況就需要用到STUN/TURN技術(shù)教硫,這里不再詳細(xì)描述了)
當(dāng)然還有一種媒體互通的方式叨吮,就是信令和媒體都走中心端,中心端都具備公網(wǎng)IP瞬矩,這樣就可以避免穿NAT的問題(Agora聲網(wǎng)的處理就是使用的這種方式)茶鉴。
當(dāng)然通過講座了解到,發(fā)展到當(dāng)前景用,Agora已經(jīng)超越了瀏覽器以及WebRTC的范疇涵叮,擴(kuò)展到了移動端Android以及IOS,Windows APP伞插,以及嵌入端Linux APP割粮;(當(dāng)然支持不同的瀏覽器本身也就實現(xiàn)了安卓和IOS端,但是畢竟移動端和嵌入式端使用網(wǎng)頁還是比較少媚污,使用APP比較多)舀瓢。
好了,言歸正傳杠步,上面說了這么多氢伟,其實是想講一下真正打通一個點對點通話,流程是如何的幽歼,這樣對于下面做SDK集成開發(fā)個人覺得會比較有幫助朵锣,不然只是打通,并不知道其中有哪些技術(shù)路徑需要理解和掌握甸私。
我這次用的是IOT的SDK-RTSA-lite诚些;首先到Github上下載RTSA的源碼,因為只是做驗證皇型,所以我用了Ubuntu的虛擬機(jī)來進(jìn)行編譯和運行诬烹。編譯的設(shè)備不管是虛擬機(jī)還是物理設(shè)備,最好都是可以連接互聯(lián)網(wǎng)的弃鸦,編譯里有很多依賴的音視頻代碼或者庫需要下載绞吁,不然就需要自己手工下載上傳去部署。
(https://github.com/AgoraIO/Basic-RTSA)
下載后唬格,進(jìn)入RTSA-lite目錄下家破,可以看到目錄分布,cross_compile.zh.md是做交叉編譯的說明购岗,后續(xù)如果移植到樹莓派編譯的話汰聋,再參考這個;agora_sdk放置的是so動態(tài)庫喊积,提供對開發(fā)者的API接口烹困;third_party中是http,json,media的解析庫,應(yīng)該是信令協(xié)商用到的庫乾吻;
最后是example髓梅,進(jìn)到目錄下進(jìn)行編譯拟蜻,編譯很快,秒完
在執(zhí)行example之前女淑,需要激活license瞭郑,這個需要在agora官網(wǎng)創(chuàng)建賬號和project辜御,大家直接去官網(wǎng)操作即可鸭你,唯一的是大家當(dāng)前申請License的時候最好加一下Agora的研發(fā)交流群,遇到的問題可以在里面快速得到解答擒权,這里絕不是廣告袱巨,因為我在申請License的時候就遇到了綁定project的問題。按照README.md的步驟修改license.cfg碳抄,激活愉老,就可以運行了。不過例子程序只有發(fā)送視頻和音頻剖效,當(dāng)然API提供了接收操作的API嫉入,大家在agora_rtc_api.h里就可以找到了(如下圖),仿照例子寫一個就可以璧尸,這里就不貼代碼了咒林。
在講座中,我也問到了爷光,SDK也提供了數(shù)據(jù)通道(datachannel)垫竞,這個在嵌入式端是非常有用的,除了實時通訊外蛀序,可能需要相互傳遞一些指令或者文件或者圖片等欢瞪,都可以通過數(shù)據(jù)通道傳輸盯腌,我曾經(jīng)在巴展上看過愛立信的使用案例割岛,使用WebRTC的DataChannel遠(yuǎn)程控制挖掘機(jī)進(jìn)行挖掘作業(yè),后續(xù)會嘗試使用數(shù)據(jù)通道完成一些應(yīng)用骨田,完成后再分享重贺。
寫在最后骑祟,Agora的SDK還是比較簡單易集成的,隨著需求和技術(shù)的發(fā)展檬姥,實時通訊我個人認(rèn)為會作為一種基本能力出現(xiàn)在各個應(yīng)用場景曾我,比如網(wǎng)絡(luò)游戲,語音客服健民,機(jī)器人控制抒巢,視頻監(jiān)控,辦公會議等等更不必說秉犹,況且今年Google的WebRTC開放了很多API能力蛉谜,以便可以和AR稚晚,聲音模擬等場景進(jìn)行結(jié)合和創(chuàng)新,感謝在這塊的技術(shù)發(fā)展還是大有可為的型诚。其實關(guān)于實時通訊客燕,除了端側(cè)簡單易集成之外,通訊質(zhì)量也是需要保證的狰贯,這里了解到聲網(wǎng)已經(jīng)部署了想躲規(guī)模的服務(wù)器也搓,使用了SD-RTN技術(shù)(之前有幸也做過短時間的技術(shù)分析和研究)進(jìn)行傳輸路徑優(yōu)化,確保通訊質(zhì)量涵紊。后續(xù)大家如果只是打個電話傍妒,可能使用免費微信的通話就可以了,但是如果需要在自己的應(yīng)用中添加實時通訊能力摸柄,大家還是需要對RTC技術(shù)的原理和發(fā)展進(jìn)行了解的颤练。
本文為個人原創(chuàng),首發(fā)于 聲網(wǎng)開發(fā)者社區(qū)https://rtcdeveloper.com/t/topic/20051