★本書深入淺出地對WebRTC技術(shù)進(jìn)行了系統(tǒng)講解,既有原理又有實(shí)戰(zhàn),從WebRTC是如何實(shí)現(xiàn)實(shí)時(shí)音視頻通信的,到如何應(yīng)用WebRTC庫實(shí)現(xiàn)音視頻通信,再到WebRTC源碼的剖析,逐步展開講解。此外,對WebRTC的傳輸系統(tǒng)進(jìn)行了重點(diǎn)分析,相信讀者通過本書可以一窺WebRTC傳輸?shù)膴W秘。
第1~3章介紹音視頻實(shí)時(shí)通信的由來,WebRTC做了什么,以及它要解決什么問題;
第4~10章是實(shí)戰(zhàn)部分,介紹如何使用WebRTC庫實(shí)現(xiàn)音視頻通信,并對其實(shí)現(xiàn)原理進(jìn)行講解;
第11~13章對WebRTC源碼進(jìn)行分析,讓讀者對WebRTC有更深層次的認(rèn)知。
想了解WebRTC實(shí)現(xiàn)的專業(yè)開發(fā)人員可以通過本書了解WebRTC運(yùn)轉(zhuǎn)機(jī)理;
學(xué)生、老師和音視頻愛好者可以通過本書了解WebRTC可以做什么,如何通過WebRTC實(shí)現(xiàn)音視頻的實(shí)時(shí)通信。
★本書是一本W(wǎng)ebRTC從入門到進(jìn)階的書籍,不僅對WebRTC的網(wǎng)絡(luò)傳輸做了細(xì)致、大量的分析,而且還向你詳細(xì)介紹了如何通過WebRTC實(shí)現(xiàn)Web端與Android和iOS端的互聯(lián)互通;后還對WebRTC的源碼進(jìn)行了剖析,使你不但可以知道如何使用WebRTC實(shí)現(xiàn)音視頻通信,還能讓你了解其中的原理,并知道WebRTC具體是如何做的。
★內(nèi)容詳實(shí)、深入淺出、案例豐富,是音視頻應(yīng)用開發(fā)工程師的參考資料,也可供相關(guān)專業(yè)的在校學(xué)生和入門者學(xué)習(xí)參考。 得到業(yè)內(nèi)多個(gè)行業(yè)專家聯(lián)袂推薦。
★關(guān)注華章計(jì)算機(jī),回復(fù)68501獲取本書配套代碼地址及后續(xù)例程的更新、通過RTC開發(fā)者社區(qū)本書專欄地址與作者互動交流。
【前言】
回想2020年,疫情的爆發(fā)使得世界經(jīng)濟(jì)陷入衰退,目前仍對我們的生活造成影響。
幸運(yùn)的是我們生活在一個(gè)好時(shí)代,科技在這幾十年中得到了迅猛發(fā)展。即使在疫情嚴(yán)重的時(shí)刻,我們?nèi)匀豢梢酝ㄟ^音視頻會議進(jìn)行遠(yuǎn)程辦公,通過在線教育系統(tǒng)進(jìn)行學(xué)習(xí),通過一些視頻軟件觀看直播。
從某個(gè)角度看,這次疫情雖然導(dǎo)致很多行業(yè)處于崩潰邊緣,但也迫使一些行業(yè)加速發(fā)展,其中音視頻會議、在線教育的重要性馬上體現(xiàn)了出來,新的溝通方式和教育方式被越來越多的人所認(rèn)知、接納。我們甚至可以推測,在線教育行業(yè)和音視頻會議行業(yè)會在今年崛起,并在未來十年得到迅猛發(fā)展。音視頻技術(shù)、傳輸技術(shù)(如5G)的飛速發(fā)展,以及因此激發(fā)出的人們對音視頻的需求,也為音視頻行業(yè)的發(fā)展提供了動力。
現(xiàn)在音視頻技術(shù)已經(jīng)非常成熟了,它被越來越廣泛地應(yīng)用于各行各業(yè),如抖音、微信短視頻、娛樂直播、教育直播、音視頻會議等。就連熱門的AI技術(shù)也與音視頻技術(shù)關(guān)系密切,如智能音箱、自動駕駛、人臉識別等都離不開音視頻技術(shù)。未來音視頻技術(shù)會有更好的前景,對音視頻人才的需求也必然會像當(dāng)年移動互聯(lián)網(wǎng)發(fā)展時(shí)一樣出現(xiàn)井噴現(xiàn)象。面對這樣的機(jī)遇,你若能掌握音視頻的核心技術(shù),一定可以在未來職場上獲得豐厚的回報(bào)和滿滿的成就感。所以,目前是學(xué)習(xí)音視頻的時(shí)機(jī),及早加入音視頻研發(fā)的隊(duì)伍,有助于你在未來的職場上更有作為。
說到音視頻技術(shù),就不得不說Google開源的WebRTC庫了。WebRTC庫如同音視頻技術(shù)的一頂王冠,上面鑲嵌了大大小小、各種各樣的寶石,如降噪、回音消除、自動增益、NetEQ、網(wǎng)絡(luò)擁塞控制······不勝枚舉!目前國內(nèi)無論是在線教育直播系統(tǒng),還是音視頻會議系統(tǒng),其底層幾乎無一例外都使用了WebRTC或從WebRTC中借鑒了不少有價(jià)值的模塊和思想。不僅如此,如果現(xiàn)在你去應(yīng)聘一線大廠的音視頻研發(fā)崗,可以發(fā)現(xiàn)崗位描述中都寫有熟悉WebRTC技術(shù)者優(yōu)先之類的要求,WebRTC的重要性由此可見一斑。因此,了解和學(xué)習(xí)WebRTC更顯得尤為重要。
自從2011年WebRTC推出之后,我就一直在追蹤其進(jìn)展。近幾年WebRTC的發(fā)展越來越快,服務(wù)質(zhì)量也越來越好,現(xiàn)在對于大多數(shù)公司來說,完全不必像我們當(dāng)年(2010年)那樣從0開始自研音視頻系統(tǒng)了。你可以在WebRTC的基礎(chǔ)上構(gòu)建系統(tǒng),這樣既省時(shí)又省力,質(zhì)量又能得到保障。
但學(xué)習(xí)WebRTC也并非易事,需要你有良好的基礎(chǔ),如熟練掌握C 、熟悉音視頻知識、了解網(wǎng)絡(luò)傳輸?shù),這顯然增加了學(xué)習(xí)WebRTC的成本。而我自從加入跟誰學(xué)團(tuán)隊(duì)后,不知怎的竟有了好為人師的沖動,一直在想是否可以對WebRTC做一個(gè)深入剖析,讓更多的人知道WebRTC能做什么,該如何更好地利用WebRTC。這種想法一直縈繞心頭,隨著時(shí)間的推移反而愈加強(qiáng)烈,后來竟成了我必須完成的使命!
因此,自2018年開始,我制定了WebRTC三部曲的計(jì)劃,即推出三門課,分別是WebRTC入門與實(shí)戰(zhàn)百萬級高并發(fā)WebRTC流媒體服務(wù)器的實(shí)現(xiàn)WebRTC源碼剖析。這三門課的前兩門我已經(jīng)在慕課網(wǎng)推出,受到了廣泛好評,而第三門則以圖書的形式推出,本書也就與大家見面了。當(dāng)然,WebRTC源碼十分龐雜,想通過一本書將其講清楚是不現(xiàn)實(shí)的,所以這本書的推出既是我制定的WebRTC三部曲計(jì)劃的終點(diǎn),也是后面深入分析WebRTC源碼的起點(diǎn),而我的終極目標(biāo)是將WebRTC剖析透徹,讓更多的人可以更好地利用WebRTC做出更優(yōu)秀的產(chǎn)品。
【本書分為三部分,共13章】
第①部分,第1~3章,主要介紹WebRTC的由來,為什么要選擇WebRTC,以及實(shí)時(shí)音視頻通信的本質(zhì)是什么。
其中第3章為關(guān)鍵,只有了解了音視頻實(shí)時(shí)通信的本質(zhì),你才能知道音視頻實(shí)時(shí)通信要解決什么問題,然后才能知道如何解決這些問題,從而理解WebRTC為什么要這樣做。
第②部分,第4~10章,循序漸進(jìn)地向你講解WebRTC的理論和實(shí)戰(zhàn)。
第4章介紹了一個(gè)簡單的WebRTC信令服務(wù)器該如何構(gòu)建,
第5章介紹了如何通過瀏覽器實(shí)現(xiàn)一對一通信,通過這兩章你就可以搭建出一個(gè)WebRTC一對一實(shí)時(shí)通信系統(tǒng)了。
第6章介紹了WebRTC底層是如何傳輸音視頻數(shù)據(jù)的,重點(diǎn)是如何進(jìn)行NAT穿越;
第7章詳述了WebRTC媒體協(xié)商使用的SDP各字段的含義。需要說明的是,SDP中的每個(gè)字段你都需要牢記在心,這樣才能為后續(xù)閱讀WebRTC代碼掃清障礙。
第8章介紹如何通過移動端(Android、iOS)Native的方式實(shí)現(xiàn)一對一通信,讀完本章內(nèi)容后,將能實(shí)現(xiàn)Web端與移動端的互聯(lián)互通;
第9章介紹了WebRTC底層的傳輸協(xié)議RTP/RTCP,這部分內(nèi)容是每個(gè)從事實(shí)時(shí)通信工作的讀者必須掌握的;
第10章介紹了WebRTC的兩種擁塞控制算法,詳細(xì)介紹了WebRTC為什么終選擇Transport-CC作為默認(rèn)擁塞控制算法。
第③部分,第11~13章。
第11章介紹了編譯WebRTC源碼庫的方法,對于大多數(shù)剛?cè)腴T的讀者來說,學(xué)習(xí)WebRTC的道門檻便是如何編譯WebRTC,通過對該章的學(xué)習(xí),相信你一定可以順利地將WebRTC庫編譯出來;
第12章對WebRTC的peerconnect_client例子做了深入剖析,這個(gè)例子可以說是我們學(xué)習(xí)WebRTC源碼的必經(jīng)之路,這一章你一定要多花些時(shí)間將其全部掌握;
第13章是對WebRTC源碼的整體架構(gòu)和運(yùn)轉(zhuǎn)流程的詳細(xì)分析,也是本書難的部分,將這章了解清楚后,你就知道WebRTC是如何運(yùn)轉(zhuǎn)的了。
【推薦序】
2021年1月29日,WebRTC正式成為W3C和IETF標(biāo)準(zhǔn)。自2011年Google宣布WebRTC開源,已經(jīng)十年了。記得2011年10月,我約了當(dāng)時(shí)還在VisualOn的劉華平和華平科技的劉睿在上海討論基于WebRTC創(chuàng)業(yè)計(jì)劃。
WebRTC的前身是GIPS(GlobalIPSolutions)。GIPS早全名叫作GlobalIPSound,是和SpritDSP一樣的終端語音通信解決方案。很多運(yùn)營商都使用了GIPS或SpritDSP的方案做3G的底層通話SDK。GIPS的突出特點(diǎn)是包括編解碼、回聲消除、降噪等3A算法。GIPS團(tuán)隊(duì)中也不乏大師,比如KenVos、BastiaanKleijn。KenVos(也是后來發(fā)明SILK的科學(xué)家)的iLBC和iSAC編碼器(2000年后基于FFT的語音編碼器)都開創(chuàng)了編解碼考慮網(wǎng)絡(luò)丟包影響的先河。發(fā)明回聲消除動態(tài)延時(shí)估計(jì)算法的BastiaanKleijn大師的論文一直被后來的工程師膜拜,它從根本上解決了延時(shí)估計(jì)的問題。GIPS后期開始做視頻通信SDK方案,所以也把全名由GlobalIPSound改成了GlobalIPSolutions。但星光閃耀的GIPS在商業(yè)上不算成功,后在2011年以不到7000萬美元的價(jià)格賣給了Google。而同年5月,微軟收購?fù)瑯蛹夹g(shù)領(lǐng)先的Skype時(shí)花費(fèi)了85億美元。
如果把端到端通信互動技術(shù)分解一下,會發(fā)現(xiàn)其中有幾個(gè)技術(shù)難點(diǎn):客戶端技術(shù)、服務(wù)器技術(shù)、全球設(shè)備網(wǎng)絡(luò)適配技術(shù)和通信互動質(zhì)量監(jiān)控與展示技術(shù)。在被收購時(shí),GIPS更像一個(gè)完整的客戶端解決方案。所以后期Google的開發(fā)者在里面增加了P2P通信技術(shù)和一些簡單的互聯(lián)互通協(xié)議,以及基于Web展示的質(zhì)量監(jiān)控,使整個(gè)方案逐漸完整起來。
李超先生擁有十多年的實(shí)時(shí)音視頻研發(fā)經(jīng)驗(yàn),曾帶領(lǐng)團(tuán)隊(duì)研發(fā)過多個(gè)直播平臺,先后任職滬江網(wǎng)高級架構(gòu)師、新東方音視頻技術(shù)專家。這本書從代碼出發(fā),詳細(xì)介紹了如何使用WebRTC搭建一對一通信服務(wù),并對內(nèi)部的協(xié)議、擁塞控制技術(shù)和交互邏輯也做了詳細(xì)的剖析,是一本難得的WebRTC開發(fā)書籍。
十年彈指一揮間,一本書囊括了李超先生多年的經(jīng)驗(yàn)總結(jié)。很榮幸能為李超先生的作品作序。
聲網(wǎng) Agora 技術(shù) VP & 合伙人,高澤華
★李超
北京音視跳動科技有限公司首席架構(gòu)師,曾先后擔(dān)任滬江網(wǎng)高級架構(gòu)師、新東方音視頻技術(shù)專家等,擁有十余年的音視頻實(shí)時(shí)互動直播研發(fā)經(jīng)驗(yàn)及多年團(tuán)隊(duì)管理經(jīng)驗(yàn),參與設(shè)計(jì)了多個(gè)高負(fù)載、高并發(fā)服務(wù)器架構(gòu)。曾在全時(shí)云會議擔(dān)任Tang平臺研發(fā)經(jīng)理,帶領(lǐng)團(tuán)隊(duì)研發(fā)自主知識產(chǎn)權(quán)的全時(shí)音視頻會議平臺該平臺可以同時(shí)并發(fā)10000場會議,每場可以支持超過1000人的實(shí)時(shí)互動。
●第1章音視頻直播的前世今生1
1.1音視頻的歷史1
1.2移動互聯(lián)網(wǎng)3
1.3音視頻直播的兩條技術(shù)路線3
1.4音視頻直播的現(xiàn)狀5
1.5音視頻直播的未來6
1.6小結(jié)7
●第2章為什么要使用WebRTC8
2.1自研直播客戶端架構(gòu)8
2.1.1拆分音視頻模塊9
2.1.2跨平臺10
2.1.3插件化管理11
2.1.4其他13
2.2WebRTC客戶端架構(gòu)14
2.3小結(jié)16
●第3章音視頻實(shí)時(shí)通信的本質(zhì)17
3.1兩種指標(biāo)18
3.1.1實(shí)時(shí)通信延遲指標(biāo)18
3.1.2音視頻服務(wù)質(zhì)量指標(biāo)19
3.2實(shí)時(shí)通信的主要矛盾20
3.2.1增加帶寬20
3.2.2減少數(shù)據(jù)量22
3.2.3適當(dāng)增加時(shí)延24
3.2.4提高網(wǎng)絡(luò)質(zhì)量24
3.2.5快速準(zhǔn)確地評估帶寬25
3.3小結(jié)25
●第4章構(gòu)建WebRTC一對一信令服務(wù)器27
4.1WebRTC一對一架構(gòu)27
4.2細(xì)化架構(gòu)28
4.3信令29
4.3.1信令定義29
4.3.2信令時(shí)序30
4.3.3信令傳輸協(xié)議的選擇31
4.4構(gòu)建信令服務(wù)器31
4.4.1信令服務(wù)器的實(shí)現(xiàn)方案32
4.4.2信令服務(wù)器的業(yè)務(wù)邏輯32
4.4.3信令服務(wù)器的實(shí)現(xiàn)33
4.4.4信令服務(wù)器的安裝與部署35
4.4.5信令服務(wù)器的完整代碼37
4.5小結(jié)40
●第5章WebRTC實(shí)現(xiàn)一對一通信41
5.1瀏覽器對WebRTC的支持41
5.2遍歷音視頻設(shè)備42
5.3采集音視頻數(shù)據(jù)44
5.4MediaStream與MediaStreamTrack47
5.5本地視頻預(yù)覽47
5.6信令狀態(tài)機(jī)49
5.7RTCPeerConnection52
5.7.1創(chuàng)建RTCPeerConnection對象52
5.7.2RTCPeerConnection與本地音視頻數(shù)據(jù)綁定53
5.7.3媒體協(xié)商54
5.7.4ICE55
5.7.5SDP與Candidate消息的交換57
5.7.6遠(yuǎn)端音視頻渲染58
5.7.7客戶端完整例子59
5.8小結(jié)82
●第6章WebRTC中的ICE實(shí)現(xiàn)83
6.1Candidate種類與優(yōu)先級83
6.2ICE策略85
6.3P2P連接87
6.3.1完全錐型NAT89
6.3.2IP限制錐型NAT90
6.3.3端口限制錐型NAT91
6.3.4對稱型NAT92
6.3.5NAT類型檢測93
6.3.6如何進(jìn)行NAT穿越97
6.4網(wǎng)絡(luò)中繼101
6.4.1TURN協(xié)議中轉(zhuǎn)數(shù)據(jù)101
6.4.2WebRTC使用TURN協(xié)議102
6.4.3STUN/TURN服務(wù)器的安裝與部署103
6.5小結(jié)105
●第7章WebRTC中的SDP106
7.1SDP標(biāo)準(zhǔn)規(guī)范106
7.2WebRTC中SDP的整體結(jié)構(gòu)108
7.3媒體信息110
7.3.1音頻媒體信息111
7.3.2視頻媒體信息112
7.3.3SSRC與CNAME114
7.4PlanB與UnifiedPlan115
7.5WebRTC如何保證數(shù)據(jù)安全117
7.6RTP擴(kuò)展頭119
7.7服務(wù)質(zhì)量120
7.8SDP詳解122
7.9ORTC131
7.10小結(jié)131
●第8章各端的互聯(lián)互通132
8.1WebRTCNative的核心132
8.2Android端的實(shí)現(xiàn)134
8.2.1申請權(quán)限134
8.2.2引入WebRTC庫136
8.2.3構(gòu)造PeerConnection-Factory138
8.2.4創(chuàng)建音視頻源138
8.2.5視頻采集139
8.2.6視頻渲染142
8.2.7創(chuàng)建PeerConnection144
8.2.8建立信令系統(tǒng)146
8.3iOS端的實(shí)現(xiàn)146
8.3.1申請權(quán)限146
8.3.2引入WebRTC庫147
8.3.3構(gòu)造RTCPeerConnection-Factory148
8.3.4創(chuàng)建音視頻源149
8.3.5視頻采集150
8.3.6本地視頻預(yù)覽151
8.3.7建立信令系統(tǒng)153
8.3.8創(chuàng)建RTCPeer-Connection155
8.3.9遠(yuǎn)端視頻渲染158
8.4PC端與Mac端的實(shí)現(xiàn)159
8.5小結(jié)159
●第9章網(wǎng)絡(luò)傳輸協(xié)議RTP與RTCP160
9.1如何選擇UDP與TCP160
9.2RTP162
9.2.1RTP協(xié)議頭163
9.2.2RTP的使用165
9.2.3RTP擴(kuò)展頭167
9.2.4RTP中的填充數(shù)據(jù)170
9.3RTCP171
9.3.1RTCP報(bào)文分類171
9.3.2RTCP協(xié)議頭172
9.3.3WebRTC的反饋報(bào)文173
9.4小結(jié)174
●第10章WebRTC擁塞控制175
10.1WebRTC的擁塞控制算法175
10.1.1Goog-REMB176
10.1.2Transport-CC181
10.1.3基于丟包的擁塞評估算法原理184
10.1.4WebRTC擁塞控制流程184
10.2擁塞控制算法比較185
10.2.1擁塞控制的準(zhǔn)確性186
10.2.2與TCP連接并存時(shí)的公平性187
10.2.3同種類型連接的公平性188
10.2.4擁塞控制算法在丟包情況下的表現(xiàn)189
10.3小結(jié)191
●第11章WebRTC源碼分析入門192
11.1WebRTC源碼的選擇193
11.2WebRTC開發(fā)環(huán)境的搭建193
11.2.1配置軟硬件環(huán)境194
11.2.2安裝依賴工具包195
11.2.3獲取并編譯WebRTC代碼195
11.3國內(nèi)WebRTC鏡像196
11.4WebRTC目錄結(jié)構(gòu)197
11.4.1WebRTC主目錄197
11.4.2modules目錄198
11.5小結(jié)200
●第12章分析WebRTC源碼的必經(jīng)之路201
12.1信令服務(wù)器實(shí)現(xiàn)分析201
12.1.1信令服務(wù)器的組成202
12.1.2信令服務(wù)器的工作流程203
12.2PeerConnection客戶端分析206
12.2.1運(yùn)行peerconnection_client206
12.2.2peerconnection_client的組成207
12.2.3界面的展示213
12.2.4視頻的渲染218
12.2.5WebRTC的使用220
12.2.6信令的處理225
12.3小結(jié)229
●第13章WebRTC源碼分析231
13.1WebRTC的數(shù)據(jù)流231
13.2WebRTC線程模型234
13.2.1WebRTC線程的創(chuàng)建與使用234
13.2.2線程切換236
13.3網(wǎng)絡(luò)傳輸250
13.3.1網(wǎng)絡(luò)接收與分發(fā)模塊類關(guān)系圖250
13.3.2網(wǎng)絡(luò)連接的建立251
13.4音視頻數(shù)據(jù)采集256
13.4.1音頻采集與播放256
13.4.2視頻采集與渲染258
13.5音視頻編解碼261
13.5.1音頻編碼261
13.5.2音頻解碼265
13.5.3視頻編碼267
13.5.4視頻解碼270
13.6小結(jié)272