★本書深入淺出地對WebRTC技術(shù)進行了系統(tǒng)講解,既有原理又有實戰(zhàn),從WebRTC是如何實現(xiàn)實時音視頻通信的,到如何應用WebRTC庫實現(xiàn)音視頻通信,再到WebRTC源碼的剖析,逐步展開講解。此外,對WebRTC的傳輸系統(tǒng)進行了重點分析,相信讀者通過本書可以一窺WebRTC傳輸?shù)膴W秘。
第1~3章介紹音視頻實時通信的由來,WebRTC做了什么,以及它要解決什么問題;
第4~10章是實戰(zhàn)部分,介紹如何使用WebRTC庫實現(xiàn)音視頻通信,并對其實現(xiàn)原理進行講解;
第11~13章對WebRTC源碼進行分析,讓讀者對WebRTC有更深層次的認知。
想了解WebRTC實現(xiàn)的專業(yè)開發(fā)人員可以通過本書了解WebRTC運轉(zhuǎn)機理;
學生、老師和音視頻愛好者可以通過本書了解WebRTC可以做什么,如何通過WebRTC實現(xiàn)音視頻的實時通信。
★本書是一本W(wǎng)ebRTC從入門到進階的書籍,不僅對WebRTC的網(wǎng)絡傳輸做了細致、大量的分析,而且還向你詳細介紹了如何通過WebRTC實現(xiàn)Web端與Android和iOS端的互聯(lián)互通;后還對WebRTC的源碼進行了剖析,使你不但可以知道如何使用WebRTC實現(xiàn)音視頻通信,還能讓你了解其中的原理,并知道WebRTC具體是如何做的。
★內(nèi)容詳實、深入淺出、案例豐富,是音視頻應用開發(fā)工程師的參考資料,也可供相關專業(yè)的在校學生和入門者學習參考。 得到業(yè)內(nèi)多個行業(yè)專家聯(lián)袂推薦。
★關注華章計算機,回復68501獲取本書配套代碼地址及后續(xù)例程的更新、通過RTC開發(fā)者社區(qū)本書專欄地址與作者互動交流。
【前言】
回想2020年,疫情的爆發(fā)使得世界經(jīng)濟陷入衰退,目前仍對我們的生活造成影響。
幸運的是我們生活在一個好時代,科技在這幾十年中得到了迅猛發(fā)展。即使在疫情嚴重的時刻,我們?nèi)匀豢梢酝ㄟ^音視頻會議進行遠程辦公,通過在線教育系統(tǒng)進行學習,通過一些視頻軟件觀看直播。
從某個角度看,這次疫情雖然導致很多行業(yè)處于崩潰邊緣,但也迫使一些行業(yè)加速發(fā)展,其中音視頻會議、在線教育的重要性馬上體現(xiàn)了出來,新的溝通方式和教育方式被越來越多的人所認知、接納。我們甚至可以推測,在線教育行業(yè)和音視頻會議行業(yè)會在今年崛起,并在未來十年得到迅猛發(fā)展。音視頻技術(shù)、傳輸技術(shù)(如5G)的飛速發(fā)展,以及因此激發(fā)出的人們對音視頻的需求,也為音視頻行業(yè)的發(fā)展提供了動力。
現(xiàn)在音視頻技術(shù)已經(jīng)非常成熟了,它被越來越廣泛地應用于各行各業(yè),如抖音、微信短視頻、娛樂直播、教育直播、音視頻會議等。就連熱門的AI技術(shù)也與音視頻技術(shù)關系密切,如智能音箱、自動駕駛、人臉識別等都離不開音視頻技術(shù)。未來音視頻技術(shù)會有更好的前景,對音視頻人才的需求也必然會像當年移動互聯(lián)網(wǎng)發(fā)展時一樣出現(xiàn)井噴現(xiàn)象。面對這樣的機遇,你若能掌握音視頻的核心技術(shù),一定可以在未來職場上獲得豐厚的回報和滿滿的成就感。所以,目前是學習音視頻的時機,及早加入音視頻研發(fā)的隊伍,有助于你在未來的職場上更有作為。
說到音視頻技術(shù),就不得不說Google開源的WebRTC庫了。WebRTC庫如同音視頻技術(shù)的一頂王冠,上面鑲嵌了大大小小、各種各樣的寶石,如降噪、回音消除、自動增益、NetEQ、網(wǎng)絡擁塞控制······不勝枚舉!目前國內(nèi)無論是在線教育直播系統(tǒng),還是音視頻會議系統(tǒng),其底層幾乎無一例外都使用了WebRTC或從WebRTC中借鑒了不少有價值的模塊和思想。不僅如此,如果現(xiàn)在你去應聘一線大廠的音視頻研發(fā)崗,可以發(fā)現(xiàn)崗位描述中都寫有熟悉WebRTC技術(shù)者優(yōu)先之類的要求,WebRTC的重要性由此可見一斑。因此,了解和學習WebRTC更顯得尤為重要。
自從2011年WebRTC推出之后,我就一直在追蹤其進展。近幾年WebRTC的發(fā)展越來越快,服務質(zhì)量也越來越好,現(xiàn)在對于大多數(shù)公司來說,完全不必像我們當年(2010年)那樣從0開始自研音視頻系統(tǒng)了。你可以在WebRTC的基礎上構(gòu)建系統(tǒng),這樣既省時又省力,質(zhì)量又能得到保障。
但學習WebRTC也并非易事,需要你有良好的基礎,如熟練掌握C 、熟悉音視頻知識、了解網(wǎng)絡傳輸?shù)龋@顯然增加了學習WebRTC的成本。而我自從加入跟誰學團隊后,不知怎的竟有了好為人師的沖動,一直在想是否可以對WebRTC做一個深入剖析,讓更多的人知道WebRTC能做什么,該如何更好地利用WebRTC。這種想法一直縈繞心頭,隨著時間的推移反而愈加強烈,后來竟成了我必須完成的使命!
因此,自2018年開始,我制定了WebRTC三部曲的計劃,即推出三門課,分別是WebRTC入門與實戰(zhàn)百萬級高并發(fā)WebRTC流媒體服務器的實現(xiàn)WebRTC源碼剖析。這三門課的前兩門我已經(jīng)在慕課網(wǎng)推出,受到了廣泛好評,而第三門則以圖書的形式推出,本書也就與大家見面了。當然,WebRTC源碼十分龐雜,想通過一本書將其講清楚是不現(xiàn)實的,所以這本書的推出既是我制定的WebRTC三部曲計劃的終點,也是后面深入分析WebRTC源碼的起點,而我的終極目標是將WebRTC剖析透徹,讓更多的人可以更好地利用WebRTC做出更優(yōu)秀的產(chǎn)品。
【本書分為三部分,共13章】
第①部分,第1~3章,主要介紹WebRTC的由來,為什么要選擇WebRTC,以及實時音視頻通信的本質(zhì)是什么。
其中第3章為關鍵,只有了解了音視頻實時通信的本質(zhì),你才能知道音視頻實時通信要解決什么問題,然后才能知道如何解決這些問題,從而理解WebRTC為什么要這樣做。
第②部分,第4~10章,循序漸進地向你講解WebRTC的理論和實戰(zhàn)。
第4章介紹了一個簡單的WebRTC信令服務器該如何構(gòu)建,
第5章介紹了如何通過瀏覽器實現(xiàn)一對一通信,通過這兩章你就可以搭建出一個WebRTC一對一實時通信系統(tǒng)了。
第6章介紹了WebRTC底層是如何傳輸音視頻數(shù)據(jù)的,重點是如何進行NAT穿越;
第7章詳述了WebRTC媒體協(xié)商使用的SDP各字段的含義。需要說明的是,SDP中的每個字段你都需要牢記在心,這樣才能為后續(xù)閱讀WebRTC代碼掃清障礙。
第8章介紹如何通過移動端(Android、iOS)Native的方式實現(xiàn)一對一通信,讀完本章內(nèi)容后,將能實現(xiàn)Web端與移動端的互聯(lián)互通;
第9章介紹了WebRTC底層的傳輸協(xié)議RTP/RTCP,這部分內(nèi)容是每個從事實時通信工作的讀者必須掌握的;
第10章介紹了WebRTC的兩種擁塞控制算法,詳細介紹了WebRTC為什么終選擇Transport-CC作為默認擁塞控制算法。
第③部分,第11~13章。
第11章介紹了編譯WebRTC源碼庫的方法,對于大多數(shù)剛?cè)腴T的讀者來說,學習WebRTC的道門檻便是如何編譯WebRTC,通過對該章的學習,相信你一定可以順利地將WebRTC庫編譯出來;
第12章對WebRTC的peerconnect_client例子做了深入剖析,這個例子可以說是我們學習WebRTC源碼的必經(jīng)之路,這一章你一定要多花些時間將其全部掌握;
第13章是對WebRTC源碼的整體架構(gòu)和運轉(zhuǎn)流程的詳細分析,也是本書難的部分,將這章了解清楚后,你就知道WebRTC是如何運轉(zhuǎn)的了。
【推薦序】
2021年1月29日,WebRTC正式成為W3C和IETF標準。自2011年Google宣布WebRTC開源,已經(jīng)十年了。記得2011年10月,我約了當時還在VisualOn的劉華平和華平科技的劉睿在上海討論基于WebRTC創(chuàng)業(yè)計劃。
WebRTC的前身是GIPS(GlobalIPSolutions)。GIPS早全名叫作GlobalIPSound,是和SpritDSP一樣的終端語音通信解決方案。很多運營商都使用了GIPS或SpritDSP的方案做3G的底層通話SDK。GIPS的突出特點是包括編解碼、回聲消除、降噪等3A算法。GIPS團隊中也不乏大師,比如KenVos、BastiaanKleijn。KenVos(也是后來發(fā)明SILK的科學家)的iLBC和iSAC編碼器(2000年后基于FFT的語音編碼器)都開創(chuàng)了編解碼考慮網(wǎng)絡丟包影響的先河。發(fā)明回聲消除動態(tài)延時估計算法的BastiaanKleijn大師的論文一直被后來的工程師膜拜,它從根本上解決了延時估計的問題。GIPS后期開始做視頻通信SDK方案,所以也把全名由GlobalIPSound改成了GlobalIPSolutions。但星光閃耀的GIPS在商業(yè)上不算成功,后在2011年以不到7000萬美元的價格賣給了Google。而同年5月,微軟收購同樣技術(shù)領先的Skype時花費了85億美元。
如果把端到端通信互動技術(shù)分解一下,會發(fā)現(xiàn)其中有幾個技術(shù)難點:客戶端技術(shù)、服務器技術(shù)、全球設備網(wǎng)絡適配技術(shù)和通信互動質(zhì)量監(jiān)控與展示技術(shù)。在被收購時,GIPS更像一個完整的客戶端解決方案。所以后期Google的開發(fā)者在里面增加了P2P通信技術(shù)和一些簡單的互聯(lián)互通協(xié)議,以及基于Web展示的質(zhì)量監(jiān)控,使整個方案逐漸完整起來。
李超先生擁有十多年的實時音視頻研發(fā)經(jīng)驗,曾帶領團隊研發(fā)過多個直播平臺,先后任職滬江網(wǎng)高級架構(gòu)師、新東方音視頻技術(shù)專家。這本書從代碼出發(fā),詳細介紹了如何使用WebRTC搭建一對一通信服務,并對內(nèi)部的協(xié)議、擁塞控制技術(shù)和交互邏輯也做了詳細的剖析,是一本難得的WebRTC開發(fā)書籍。
十年彈指一揮間,一本書囊括了李超先生多年的經(jīng)驗總結(jié)。很榮幸能為李超先生的作品作序。
聲網(wǎng) Agora 技術(shù) VP & 合伙人,高澤華
★李超
北京音視跳動科技有限公司首席架構(gòu)師,曾先后擔任滬江網(wǎng)高級架構(gòu)師、新東方音視頻技術(shù)專家等,擁有十余年的音視頻實時互動直播研發(fā)經(jīng)驗及多年團隊管理經(jīng)驗,參與設計了多個高負載、高并發(fā)服務器架構(gòu)。曾在全時云會議擔任Tang平臺研發(fā)經(jīng)理,帶領團隊研發(fā)自主知識產(chǎn)權(quán)的全時音視頻會議平臺該平臺可以同時并發(fā)10000場會議,每場可以支持超過1000人的實時互動。
●第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章音視頻實時通信的本質(zhì)17
3.1兩種指標18
3.1.1實時通信延遲指標18
3.1.2音視頻服務質(zhì)量指標19
3.2實時通信的主要矛盾20
3.2.1增加帶寬20
3.2.2減少數(shù)據(jù)量22
3.2.3適當增加時延24
3.2.4提高網(wǎng)絡質(zhì)量24
3.2.5快速準確地評估帶寬25
3.3小結(jié)25
●第4章構(gòu)建WebRTC一對一信令服務器27
4.1WebRTC一對一架構(gòu)27
4.2細化架構(gòu)28
4.3信令29
4.3.1信令定義29
4.3.2信令時序30
4.3.3信令傳輸協(xié)議的選擇31
4.4構(gòu)建信令服務器31
4.4.1信令服務器的實現(xiàn)方案32
4.4.2信令服務器的業(yè)務邏輯32
4.4.3信令服務器的實現(xiàn)33
4.4.4信令服務器的安裝與部署35
4.4.5信令服務器的完整代碼37
4.5小結(jié)40
●第5章WebRTC實現(xiàn)一對一通信41
5.1瀏覽器對WebRTC的支持41
5.2遍歷音視頻設備42
5.3采集音視頻數(shù)據(jù)44
5.4MediaStream與MediaStreamTrack47
5.5本地視頻預覽47
5.6信令狀態(tài)機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遠端音視頻渲染58
5.7.7客戶端完整例子59
5.8小結(jié)82
●第6章WebRTC中的ICE實現(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如何進行NAT穿越97
6.4網(wǎng)絡中繼101
6.4.1TURN協(xié)議中轉(zhuǎn)數(shù)據(jù)101
6.4.2WebRTC使用TURN協(xié)議102
6.4.3STUN/TURN服務器的安裝與部署103
6.5小結(jié)105
●第7章WebRTC中的SDP106
7.1SDP標準規(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擴展頭119
7.7服務質(zhì)量120
7.8SDP詳解122
7.9ORTC131
7.10小結(jié)131
●第8章各端的互聯(lián)互通132
8.1WebRTCNative的核心132
8.2Android端的實現(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端的實現(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本地視頻預覽151
8.3.7建立信令系統(tǒng)153
8.3.8創(chuàng)建RTCPeer-Connection155
8.3.9遠端視頻渲染158
8.4PC端與Mac端的實現(xiàn)159
8.5小結(jié)159
●第9章網(wǎng)絡傳輸協(xié)議RTP與RTCP160
9.1如何選擇UDP與TCP160
9.2RTP162
9.2.1RTP協(xié)議頭163
9.2.2RTP的使用165
9.2.3RTP擴展頭167
9.2.4RTP中的填充數(shù)據(jù)170
9.3RTCP171
9.3.1RTCP報文分類171
9.3.2RTCP協(xié)議頭172
9.3.3WebRTC的反饋報文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擁塞控制的準確性186
10.2.2與TCP連接并存時的公平性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信令服務器實現(xiàn)分析201
12.1.1信令服務器的組成202
12.1.2信令服務器的工作流程203
12.2PeerConnection客戶端分析206
12.2.1運行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)絡傳輸250
13.3.1網(wǎng)絡接收與分發(fā)模塊類關系圖250
13.3.2網(wǎng)絡連接的建立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