這是一本全面、詳細(xì)講解WebRTC技術(shù)以及如何使用它構(gòu)建一個(gè)可商用的視頻會(huì)議系統(tǒng)的著作。
技術(shù)維度,本書不僅詳細(xì)講解了WebRTC規(guī)范和全部API、信令系統(tǒng)、底層技術(shù)、移動(dòng)端和服務(wù)端實(shí)現(xiàn),而且還總結(jié)了作者多年來的“踩坑”經(jīng)驗(yàn);實(shí)戰(zhàn)維度,本書不僅提供了可直接應(yīng)用于視頻會(huì)議和在線教育等場景的真實(shí)案例,而且開源了一個(gè)可商用的視頻會(huì)議系統(tǒng)WiLearning,教讀者如何從0到1搭建一個(gè)高并發(fā)、易擴(kuò)展的視頻會(huì)議系統(tǒng)。
【全書一共10章】
第1章介紹了WebRTC的歷史、技術(shù)架構(gòu)、網(wǎng)絡(luò)拓?fù)、兼容性等?nèi)容。
第2章講解了使用WebRTC API獲取本地?cái)z像頭、話筒、桌面等媒體流的方法,以及媒體流的錄制、使用canvas操作媒體流的方法和示例。
第3章講解了WebRTC底層使用的傳輸技術(shù),如ICE、SDP、STUN/TURN等。
第4章介紹了使用RTCPeerConnection管理WebRTC連接的方法。
第5章介紹了WebRTC的媒體管理方法,結(jié)合示例演示了切換編碼格式、控制視頻碼率、替換視頻背景的方法。
第6章結(jié)合實(shí)例介紹一種高效、實(shí)時(shí)的信令系統(tǒng)實(shí)現(xiàn)方法,并實(shí)現(xiàn)一個(gè)可以在生產(chǎn)環(huán)境中使用的信令系統(tǒng)。
第7章介紹了使用WebRTC數(shù)據(jù)通道傳輸任意數(shù)據(jù)的方法,結(jié)合示例演示了基于P2P的文本聊天以及文件傳輸功能的實(shí)現(xiàn)。
第8章介紹了使用WebRTC獲取媒體流相關(guān)統(tǒng)計(jì)數(shù)據(jù)的方法,在示例中演示如何使用Chart.js繪圖展示實(shí)時(shí)碼率。
第9章介紹了在Android、iOS開發(fā)環(huán)境中使用WebRTC的方法,通過實(shí)例實(shí)現(xiàn)了基于WebRTC的視頻聊天App。
第10章結(jié)合筆者的開源項(xiàng)目WiLearning介紹了從0到1打造高性能視頻會(huì)議系統(tǒng)的方法。
適讀人群 :實(shí)時(shí)直播技術(shù)研發(fā)人員、架構(gòu)師、CTO。1.了解實(shí)時(shí)直播的技術(shù)趨勢和實(shí)現(xiàn)方案2.WebRTC 核心API講解及實(shí)例3.WebRTC在Web、IOS、Android中的應(yīng)用4.使用WebRTC設(shè)計(jì)及實(shí)現(xiàn)視頻會(huì) (1)本書得到了來自阿里云、金山云等企業(yè)的多位音視頻技術(shù)專家的高度評(píng)價(jià)。
(2)作者在音視頻領(lǐng)域有多年開發(fā)經(jīng)驗(yàn),對(duì)WebRTC有深入研究,利用WebRTC技術(shù)開發(fā)了直播、在線課堂、視頻會(huì)議等商業(yè)產(chǎn)品,并發(fā)用戶數(shù)達(dá)到500萬。
(3)技術(shù)維度,詳細(xì)講解了WebRTC規(guī)范和全部API、信令系統(tǒng)、底層技術(shù)、移動(dòng)端和服務(wù)端實(shí)現(xiàn),總結(jié)作者多年來的“踩坑”經(jīng)驗(yàn);
(4)實(shí)戰(zhàn)維度,提供了可直接應(yīng)用于視頻會(huì)議和在線教育等場景的真實(shí)案例,開源了一個(gè)可商用的視頻會(huì)議系統(tǒng)WiLearning,
(5)本書將手把手教讀者如何從0到1搭建一個(gè)高并發(fā)、易擴(kuò)展的視頻會(huì)議系統(tǒng)和一個(gè)視頻聊天APP。
(6)本書提供的示例代碼以及開源項(xiàng)目WiLearning可以在GitHub上免費(fèi)獲取,掃描封底二維碼關(guān)注“華章計(jì)算機(jī)”回復(fù)“67844”獲取地址。
【為什么要寫這本書】
最早接觸WebRTC技術(shù)是在2015年,那時(shí)需要在直播產(chǎn)品中增加實(shí)時(shí)連麥的功能,經(jīng)過對(duì)幾種技術(shù)進(jìn)行對(duì)比,最終我選擇了WebRTC。當(dāng)時(shí)WebRTC技術(shù)還不夠成熟,相關(guān)資料非常少,在產(chǎn)品中使用WebRTC技術(shù)的難度非常大,往往為了弄清楚某個(gè)概念、某個(gè)API的用法,需要查閱大量的英文資料,而且遇到問題解決起來非常棘手。
從最初的原生WebRTC,到多點(diǎn)控制單元(MCU),再到各種選擇性轉(zhuǎn)發(fā)單元(SFU),我在使用WebRTC的過程中一直不斷學(xué)習(xí)新的知識(shí),不斷解決新的問題,同時(shí)也逐步加深了對(duì)WebRTC技術(shù)的理解和認(rèn)識(shí)。
因?yàn)椴冗^許多坑,所以我深刻體會(huì)到了WebRTC技術(shù)的難度和廣度。WebRTC技術(shù)包含了音視頻編解碼技術(shù)、傳輸技術(shù)、流媒體服務(wù)器技術(shù)等,涵蓋了音視頻處理和傳輸?shù)姆椒矫婷。這些技術(shù)中任意一個(gè)都能成為獨(dú)立的課題,都值得花大量時(shí)間深入研究。除此之外,理解WebRTC相關(guān)API,還必須掌握現(xiàn)代Web技術(shù),尤其是ES6、Promise等語法知識(shí)?梢姡瑢W(xué)習(xí)WebRTC技術(shù)需要掌握大量的預(yù)備知識(shí),這對(duì)于初學(xué)者來說有一定的門檻。
非常遺憾的是,時(shí)至今日仍沒有一本中文書能夠系統(tǒng)地涵蓋WebRTC的技術(shù)內(nèi)容,剝離層層技術(shù)面紗將WebRTC呈現(xiàn)給國內(nèi)技術(shù)人員。
在實(shí)時(shí)通信產(chǎn)品大爆發(fā)的時(shí)期,為什么WebRTC的中文技術(shù)資料如此之少?我想可能有以下幾個(gè)原因。
●WebRTC技術(shù)規(guī)范都是英文文檔,缺少使用示例,故而讀起來晦澀難懂,加大了WebRTC的學(xué)習(xí)難度。
●WebRTC技術(shù)較新,專業(yè)性較強(qiáng),能真正理解并掌握其精髓的技術(shù)人員較少。
●國內(nèi)技術(shù)人員工作壓力大,資深WebRTC技術(shù)人員忙于項(xiàng)目,沒有時(shí)間總結(jié)經(jīng)驗(yàn)并分享。
●WebRTC技術(shù)覆蓋面廣,難以講深、講透,針對(duì)某個(gè)技術(shù)點(diǎn)的分享容易實(shí)現(xiàn),但要系統(tǒng)講解技術(shù)內(nèi)幕則非常難。
撰寫一本能夠降低國內(nèi)技術(shù)人員使用WebRTC的門檻,能夠幫助研發(fā)人員更好地將WebRTC技術(shù)應(yīng)用到產(chǎn)品中的書,是我編寫本書的出發(fā)點(diǎn)。
作為一名較早使用WebRTC的技術(shù)人員,我一直關(guān)注WebRTC技術(shù)的發(fā)展,在日常使用過程中積累了大量學(xué)習(xí)筆記和經(jīng)驗(yàn),這些都為撰寫本書提供了素材。
本書對(duì)WebRTC 1.0規(guī)范的內(nèi)容進(jìn)行了系統(tǒng)整理,以一種易于理解的形式呈現(xiàn)給讀者。書中還給出了我的“踩坑”經(jīng)驗(yàn)和一些實(shí)用的案例,幫助讀者全面認(rèn)識(shí)WebRTC。
WebRTC降低了實(shí)時(shí)通信技術(shù)的門檻,使得之前只有互聯(lián)網(wǎng)巨頭才能掌握的實(shí)時(shí)通信技術(shù)得以普及,使得我們能夠在家遠(yuǎn)程辦公,孩子們能夠“停課不停學(xué)”。相信在5G普及之后,WebRTC還會(huì)迎來更加蓬勃的發(fā)展。
可以預(yù)見,未來將有更多技術(shù)人員學(xué)習(xí)并應(yīng)用WebRTC,希望本書能夠幫助大家輕松踏入WebRTC的技術(shù)殿堂!
【讀者對(duì)象】
實(shí)時(shí)通信產(chǎn)品的售前、售后、研發(fā)人員,音視頻行業(yè)的架構(gòu)師、CTO等。
【本書特色】
●全面涵蓋WebRTC 1.0規(guī)范。
●詳細(xì)講解WebRTC底層技術(shù)。
●結(jié)合示例演示W(wǎng)ebRTC API的使用。
●從零起步實(shí)現(xiàn)高效、實(shí)時(shí)的信令系統(tǒng)。
●使用WebRTC技術(shù)從0到1打造開源視頻會(huì)議系統(tǒng)。
【如何閱讀本書】
本書對(duì)WebRTC技術(shù)進(jìn)行了全面的介紹,涵蓋WebRTC 1.0規(guī)范全部API、WebRTC底層技術(shù)、WebRTC在移動(dòng)端和服務(wù)器端的應(yīng)用等內(nèi)容,并提供了具體的示例,力求做到理論結(jié)合實(shí)踐。本書最后使用這些WebRTC知識(shí)打造了一個(gè)真實(shí)的視頻會(huì)議系統(tǒng),同時(shí)對(duì)高并發(fā)、易擴(kuò)展的視頻會(huì)議架構(gòu)進(jìn)行了詳細(xì)講解。
本書分為10章。
●第1章介紹WebRTC的歷史、技術(shù)架構(gòu)、兼容性等內(nèi)容。
●第2章介紹使用WebRTC API獲取本地?cái)z像頭、話筒、桌面等媒體流的方法,以及媒體流的錄制、使用canvas操作媒體流的方法和示例。
●第3章介紹WebRTC底層使用的傳輸技術(shù),如SDP、ICE、STUN/TURN等。
●第4章介紹使用RTCPeerConnection管理WebRTC連接的方法。
●第5章介紹WebRTC的媒體管理方法,結(jié)合示例演示切換編碼格式、控制視頻碼率、替換視頻背景的方法。
●第6章結(jié)合示例介紹一種高效、實(shí)時(shí)的信令系統(tǒng)實(shí)現(xiàn)方法,并實(shí)現(xiàn)一個(gè)可以在生產(chǎn)環(huán)境中使用的信令系統(tǒng)。
●第7章介紹使用WebRTC數(shù)據(jù)通道傳輸任意數(shù)據(jù)的方法,結(jié)合示例演示基于P2P的文字聊天以及文件傳輸功能的實(shí)現(xiàn)。
●第8章介紹使用WebRTC獲取媒體流相關(guān)統(tǒng)計(jì)數(shù)據(jù)的方法,結(jié)合示例演示如何使用Chart.js繪圖展示實(shí)時(shí)碼率。
●第9章介紹在Android、iOS開發(fā)環(huán)境中使用WebRTC的方法,并實(shí)現(xiàn)基于WebRTC的視頻聊天App。
●第10章結(jié)合我的開源項(xiàng)目WiLearning介紹從0到1打造視頻會(huì)議系統(tǒng)的方法。
本書提供的示例代碼以及開源項(xiàng)目WiLearning可以在GitHub上免費(fèi)獲取,掃描封底二維碼關(guān)注“華章計(jì)算機(jī)”回復(fù)“67844”獲取地址。
栗偉
資深音視頻技術(shù)專家,在該領(lǐng)域有多年實(shí)踐經(jīng)驗(yàn),對(duì)WebRTC有非常深入的研究。
曾任職于中科院計(jì)算所、CC視頻,任職期間利用WebRTC技術(shù)開發(fā)了直播、在線課堂、視頻會(huì)議等商業(yè)產(chǎn)品,并發(fā)用戶數(shù)達(dá)到500萬。
開源社區(qū)的積極參與者,在GitHub上開源了視頻會(huì)議項(xiàng)目WiLearning,免費(fèi)供中小企業(yè)使用。
●第1章 WebRTC概述1
1.1 WebRTC的歷史1
1.2 WebRTC的技術(shù)架構(gòu)2
1.3 WebRTC的網(wǎng)絡(luò)拓?fù)?
1.4 Simulcast聯(lián)播4
1.5 可伸縮視頻編碼5
1.6 WebRTC的兼容性5
1.7 其他直播技術(shù)6
1.8 統(tǒng)一計(jì)劃與Plan B8
1.9 本章小結(jié)9
●第2章 本地媒體10
2.1 媒體流10
2.1.1 構(gòu)造媒體流11
2.1.2 MediaStream屬性11
2.1.3 MediaStream方法11
2.1.4 MediaStream事件14
2.2 媒體軌道15
2.2.1 MediaStreamTrack屬性15
2.2.2 MediaStreamTrack方法17
2.2.3 MediaStreamTrack事件20
2.3 媒體約束22
2.3.1 約束類型22
2.3.2 數(shù)據(jù)類型與用法23
2.3.3 通用約束25
2.3.4 視頻約束25
2.3.5 音頻約束25
2.3.6 屏幕共享約束26
2.3.7 圖像約束26
2.3.8 約束的advanced屬性27
2.4 媒體設(shè)備28
2.4.1 WebRTC隱私和安全28
2.4.2 獲取攝像頭與話筒29
2.4.3 共享屏幕30
2.4.4 查詢媒體設(shè)備31
2.4.5 監(jiān)聽媒體設(shè)備變化33
2.5 從canvas獲取媒體流34
2.6 從媒體元素獲取媒體流34
2.7 播放媒體流35
2.8 錄制媒體流36
2.8.1 構(gòu)造MediaRecorder36
2.8.2 MediaRecorder屬性37
2.8.3 MediaRecorder方法39
2.8.4 MediaRecorder事件42
2.9 示例45
2.9.1 代碼結(jié)構(gòu)45
2.9.2 獲取圖片像素?cái)?shù)據(jù)46
2.9.3 替換視頻背景47
2.10 本章小結(jié)48
●第3章 傳輸技術(shù)49
3.1 RTP49
3.2 RTCP52
3.3 SRTP/SRTCP54
3.4 TLS/DTLS55
3.5 SDP55
3.6 ICE57
3.7 搭建STUN/TURN服務(wù)器63
3.8 本章小結(jié)65
●第4章 連接管理66
4.1 WebRTC建立連接的過程66
4.1.1 會(huì)話描述信息RTCSession-Description69
4.1.2 pending狀態(tài)與current狀態(tài)70
4.1.3 ICE候選者RTCIceCandidate70
4.2 RTCPeerConnection接口72
4.2.1 構(gòu)造函數(shù)RTCPeerConnection73
4.2.2 連接配置RTCConfiguration74
4.2.3 RTCPeerConnection接口的屬性76
4.2.4 RTCPeerConnection接口的方法82
4.2.5 RTCPeerConnection接口的事件90
4.3 完美協(xié)商模式94
4.3.1 SDP沖突問題95
4.3.2 使用完美協(xié)商模式95
4.3.3 再談ICE重啟97
4.4 示例98
4.4.1 運(yùn)行示例98
4.4.2 使用WebSocket99
4.4.3 創(chuàng)建RTCPeerConnection的時(shí)機(jī)100
4.5 本章小結(jié)102
●第5章 RTP媒體管理103
5.1 WebRTC編解碼104
5.2 RTCPeerConnection RTP擴(kuò)展110
5.2.1 RTCPeerConnection擴(kuò)展方法111
5.2.2 RTCPeerConnection擴(kuò)展事件113
5.3 傳輸媒體流114
5.3.1 無流軌道115
5.3.2 有流軌道115
5.4 RTP收發(fā)管理116
5.4.1 RTCRtpTransceiver屬性117
5.4.2 RTCRtpTransceiver方法118
5.5 RTP發(fā)送器118
5.5.1 RTCRtpSender屬性119
5.5.2 RTCRtpSender方法119
5.6 RTP接收器123
5.6.1 RTCRtpReceiver屬性123
5.6.2 RTCRtpReceiver方法123
5.7 DTLS傳輸層126
5.7.1 RTCDtlsTransport屬性126
5.7.2 RTCDtlsTransport方法127
5.7.3 RTCDtlsTransport事件127
5.8 ICE傳輸層128
5.8.1 RTCIceTransport屬性128
5.8.2 RTCIceTransport方法130
5.8.3 RTCIceTransport事件132
5.9 使用DTMF134
5.9.1 RTCDTMFSender屬性134
5.9.2 RTCDTMFSender方法135
5.9.3 RTCDTMFSender事件135
5.10 RTC錯(cuò)誤處理136
5.11 通話的掛起與恢復(fù)137
5.11.1 通話掛起137
5.11.2 通話恢復(fù)138
5.12 示例139
5.12.1 動(dòng)態(tài)設(shè)置視頻碼率140
5.12.2 使用VP9和H264141
5.12.3 使用虛擬背景144
5.13 本章小結(jié)145
●第6章 信令服務(wù)器146
6.1 使用Node.js147
6.2 使用TypeScript156
6.3 使用Express164
6.4 使用Socket.IO173
6.5 實(shí)現(xiàn)信令服務(wù)器179
6.6 實(shí)現(xiàn)信令客戶端186
6.7 示例189
6.8 本章小結(jié)191
●第7章 數(shù)據(jù)通道192
7.1 SCTP192
7.2 RTCPeerConnection數(shù)據(jù)通道擴(kuò)展接口196
7.3 RTCSctpTransport199
7.4 RTCDataChannel200
7.5 帶內(nèi)協(xié)商與帶外協(xié)商206
7.6 文字聊天與文件傳輸206
7.7 本章小結(jié)216
●第8章 統(tǒng)計(jì)數(shù)據(jù)217
8.1 統(tǒng)計(jì)數(shù)據(jù)入口217
8.2 RTCStats及其擴(kuò)展219
8.3 實(shí)時(shí)碼率監(jiān)測241
8.3.1 使用Chart.js242
8.3.2 獲取碼率數(shù)據(jù)244
8.4 本章小結(jié)247
●第9章 移動(dòng)端WebRTC248
9.1 原生應(yīng)用與混合應(yīng)用248
9.2 原生開發(fā)環(huán)境249
9.2.1 Android原生開發(fā)環(huán)境249
9.2.2 iOS原生開發(fā)環(huán)境250
9.3 WebView251
9.4 Cordova252
9.4.1 編譯環(huán)境253
9.4.2 全局配置config.xml254
9.4.3 應(yīng)用程序行為preference258
9.4.4 應(yīng)用程序圖標(biāo)icon261
9.4.5 簡單的WebRTC移動(dòng)應(yīng)用264
9.4.6 調(diào)試Cordova應(yīng)用267
9.5 Ionic Framework268
9.5.1 安裝與使用269
9.5.2 開發(fā)工具269
9.6 基于Ionic的WebRTC移動(dòng)應(yīng)用270
9.6.1 使用模板創(chuàng)建應(yīng)用程序271
9.6.2 首頁組件272
9.6.3 連接管理服務(wù)275
9.6.4 視頻與聊天組件281
9.6.5 構(gòu)建Android應(yīng)用程序283
9.6.6 構(gòu)建iOS應(yīng)用程序285
9.7 本章小結(jié)286
●第10章 從0到1打造多人視頻會(huì)議系統(tǒng)287
10.1 整體設(shè)計(jì)287
10.2 媒體服務(wù)器289
10.2.1 OWT289
10.2.2 Kurento289
10.2.3 Janus290
10.2.4 Mediasoup291
10.2.5 媒體服務(wù)器的選擇291
10.3 Mediasoup信令交互過程293
10.4 服務(wù)器端實(shí)現(xiàn)294
10.4.1 房間與參與者295
10.4.2 管理與監(jiān)控接口296
10.5 客戶端實(shí)現(xiàn)298
10.5.1 發(fā)布媒體流298
10.5.2 訂閱媒體流301
10.5.3 共享桌面303
10.5.4 共享本地媒體303
10.5.5 文檔及白板304
10.5.6 文字聊天307
10.6 傳輸質(zhì)量監(jiān)控308
10.7 從網(wǎng)絡(luò)故障中恢復(fù)309
10.8 本章小結(jié)310