一.WebRTC願景
想象一下一個世界,您的電話,電視和計算機都可以在同一個平臺上進行通信。想象一下,將視頻聊天和對等數據共享添加到Web應用程序很容易。這就是WebRTC的願景。
想嘗試一下嗎?WebRTC現在可在臺式機和移動設備上的Google Chrome,Safari,Firefox和Opera中使用。一個很好的起點是位於appr.tc的簡單視頻聊天應用程序:
- 在瀏覽器中打開appr.tc。
- 單擊加入按鈕加入聊天室,然後讓該應用使用您的網絡攝像頭。
- 在新標籤頁中打開頁面底部顯示的URL,或者最好在另一臺計算機上打開。
二.WebRTC概念
1.什麼是WebRTC
我們都知道瀏覽器本身不支持相互之間建立信道進行通信,都需要通過服務器進行中轉。比如現在有兩個客戶端—甲、乙,他倆想要進行通信,首先需要甲和服務器、乙和服務器之間建立信道。甲給乙發送消息時,甲先將消息發送到服務器上,服務器對甲的消息進行中轉,發送到乙處,反過來也是一樣。這樣甲與乙之間的一次消息要通過兩段信道,通信的效率同時受制於這兩段信道的帶寬。同時這樣的信道並不適合數據流的傳輸,如何建立瀏覽器之間的點對點傳輸,一直困擾着開發者。因此WebRTC應運而生。
WebRTC是一個開源項目,旨在使得瀏覽器能爲實時通信(RTC)提供簡單的JavaScript接口。說的簡單明瞭一點就是讓瀏覽器提供JS的即時通信接口。這個接口所創立的信道並不是像WebSocket一樣,打通一個瀏覽器與WebSocket服務器之間的通信,而是通過一系列的信令,建立一個瀏覽器與瀏覽器之間(-to-peer)的信道,這個信道可以發送任何數據,而不需要經過服務器。並且WebRTC通過實現MediaStream,通過瀏覽器調用設備的攝像頭、話筒,使得瀏覽器之間可以傳遞音頻和視頻。
同時WebRTC是一個非常優秀的多媒體框架,且支持跨平臺(支持Android、IOS),能夠使得Android和IOS設備作爲終端設備能夠像瀏覽器一樣,進行即時通信。
2.使用WebRTC能做什麼?
- 能用於音視頻實時互動,視頻會議
- 能用於遊戲、即時通訊、文件傳輸等等
- 它是一個採集,編碼,傳輸音視頻處理(迴音消除、降噪等),渲染
3.學習WebRTC的過程中我們能掌握什麼?
- 音視頻設備的訪問與管理
- 音視頻數據的採集
- 數據的傳輸與實時互動
- WebRTC的整體工作機制
4.學習WebRTC步驟
(1). 學習NodeJS的基本使用,嘗試搭建一個簡單的Web服務器並實現簡單的HTTP服務。
(2). 學習JavaScript,瞭解並掌握其基本的使用方法,爲後續開發及完善Web服務做技術鋪墊。
(3). 瞭解音視頻設備相關的Web API,嘗試使用MediaDevices
實現音視頻設備的訪問,包括攝像頭、麥克風及屏幕採集。
(4). 學習使用Socket.IO,嘗試使用Socket.IO實現簡單的聊天室,爲後續開發WebRTC信令服務器做技術鋪墊。
(5). 瞭解和學習使用SDP,並使用WebRTC的Web API實現本地的1v1視頻互通。
(6). 搭建STUN/TURN服務器,使用ICE框架及Socket.IO實現WebRTC正式的1V1連麥
(7). 實現WebRTC的移動端開發,做到瀏覽器和手機客戶端能進行連麥操作。
三.WebRTC架構
整個WebRTC架構具有很高的複雜性。
整體架構分爲應用層和核心層。應用層提供實現相關業務邏輯Api,核心層提供應用層需要的核心API。
其中核心層分爲四層:
第一層爲C++ API,其中最主要的是PeerConnection,這個接口需要重點學習和掌握。
第二層爲Session層,爲上下文管理層,應用裏的音頻和視頻及非音視頻的數據處理邏輯都可以在這層進行。
第三層爲引擎和傳輸層,包括音頻引擎和視頻引擎,以及音視頻的傳輸,這也是整個架構中最重要的一層。
第四層與硬件相關,包括音視頻的採集和網絡的IO。
注:WebRTC的核心層無視頻的渲染,所有的渲染都需要應用層自行實現。
這裏着重提一下第三層:
- Voice Engine(音頻引擎模塊):包含編碼能力、音頻緩衝Buff(防網絡抖動)、迴音消除(實時連麥關鍵點)。
- Video Engine(視頻引擎模塊):包含編碼能力(如VP8)、視頻緩衝、圖像增強。
- Transport(傳輸模塊):傳輸協議在底層使用UDP,上層使用的RTP(爲安全起見增加SRTP),還有P2P機制,包括STUN、TURN 和 ICE。
四、WebRTC源碼目錄結構
這裏着重介紹一下module目錄下的子目錄結構:
五、WebRTC 運行機制
WebRTC核心API有三個:MediaStream、RTCPeerConnection、RTCDataChannel。
MediaStream:通過設備的攝像頭及話筒獲得視頻、音頻的同步流
PeerConnection: 用於構建點對點之間穩定、高效的流傳輸的組件
DataChannel:能夠使得瀏覽器之間(點對點)建立一個高吞吐量、低延時的信道,用於傳輸任何數據
其中PeerConnection調用過程如下圖所示:
其中RTCPeerConnection對象的主要任務是建立和創建對等連接。我們可以輕鬆地鉤住連接的關鍵點,因爲此對象在出現時會觸發一組事件。這些事件使您可以訪問我們的連接配置,如下圖所示:
六,WebRTC-快速指南
基本方案
WebRTC允許您快速,輕鬆地建立與其他Web瀏覽器的對等連接。爲了從頭開始構建這樣的應用程序,您需要大量的框架和庫來處理典型的問題,例如數據丟失,連接丟失和NAT遍歷。藉助WebRTC,所有這些內置於現成的瀏覽器中。這項技術不需要任何插件或第三方軟件。它是開源的,其源代碼可從http://www.webrtc.org/
WebRTC API包括媒體捕獲,音頻和視頻的編碼和解碼,傳輸層以及會話管理
媒體捕捉
第一步是訪問用戶設備的攝像頭和麥克風。我們檢測可用設備的類型,獲得用戶訪問這些設備和管理流的權限。
音頻和視頻編碼和解碼
通過Internet發送音頻和視頻數據流並非易事。這是使用編碼和解碼的地方。這是將視頻幀和音頻波分成較小的塊並將其壓縮的過程。該算法稱爲編解碼器。有大量不同的編解碼器,這些編解碼器由具有不同業務目標的不同公司維護。WebRTC內部也有許多編解碼器,例如H.264,iSAC,Opus和VP8。當兩個瀏覽器連接在一起時,它們會在兩個用戶之間選擇最受支持的編解碼器。幸運的是,WebRTC在後臺進行了大多數編碼。
運輸層
傳輸層管理數據包的順序,處理數據包丟失並連接到其他用戶。同樣,WebRTC API使我們可以輕鬆訪問事件,這些事件會在連接出現問題時告訴我們。
會話管理
會話管理處理管理,打開和組織連接。這通常稱爲信令。如果將音頻和視頻流傳輸給用戶,則傳輸附帶數據也很有意義。這是由RTCDataChannel API完成的。
來自Google,Mozilla,Opera等公司的工程師爲將這種實時體驗引入Web做出了出色的工作。
參考:
https://www.cnblogs.com/renhui/p/6369568.html
https://www.tutorialspoint.com/webrtc/webrtc_quick_guide.htm
https://www.html5rocks.com/en/tutorials/webrtc/basics/#toc-disruptive