1 引言
1.1 編寫目的
- 互聯網成功的一個關鍵因素是一些核心技術如HTML、HTTP和TCP/IP是開放和免費實現的。目前,在瀏覽器通信領域還沒有免費、高質量、完整的解決方案。WebRTC就是這樣的技術。
- 該技術的使用已經超過了 8 年,集成了最佳的音頻、視頻引擎,並被部署到數以百萬的終端中,同時這些技術 Google不收取任何費用。
- 該技術包含了使用STUN、ICE、TURN、RTP-over-TCP的關鍵NAT和防火牆穿透技術,並支持代理。
- 通過瀏覽器,WebRTC把通訊雙方的信令狀態直接映射到PeerConnection裏面來抽象信令處理,這樣 開發人員按不同的應用場景選擇不同的會話協議,比如 SIP、XMPP/Jingle等等)。
1.2 定義
WebRTC | WebRTC 是 Web Real-Time Communication 的縮寫,它是一項在瀏覽器內部進行實時數據、視頻和音頻通信的技術,是 Google 2010年以6820萬美元收購Global IP Solutions公司而獲得一項技術。 |
MediaStreamTrack | 媒體數據源,一個媒體數據源構成一個 MediaStreamTrack,比如音頻數據源和視頻數據源,多個相互之間有關聯的媒體數據源(比如有同步關係的音頻視頻媒體數據源)構成一個媒體流(MediaStream)。 |
MediaStream | 媒體流,一個媒體流包含 0 個到多個的媒體數據源,媒體流裏面的數據源在呈現(render)必須同步。 MediaStream 通過 getUserMedia 獲得。 |
DataChannel | 數據通道,兩個 WebRTC 終端的連接建立後,它們可以通過這個數據通道傳輸任意類型的數據。 |
Peer | 通過 WebRTC 進行數據交互的節點或用戶或終端,它通常是一個 Web App,它們之間的發現,連接的建立和斷開通過 signalling(信令)控制。 |
PeerConnection | 表示一個 WebRTC 通訊連接對象,它維護與這個通訊連接相關的 MediaStream,處理通訊雙方信令事件,完成通訊數據的傳輸。 |
Signalling | 信令,WebRTC 網絡通過 Signalling 來發現各個 Peer,通過 Signalling 來控制各個 Peer 之間連接的建立和斷開。 |
STUN | STUN(Session Traversal Utilities for NAT,NAT會話傳輸應用程序)是一種網絡協議,它允許位於NAT(或多重NAT)後的客戶端找出自己的公網地址,查出自己位於哪種類型的NAT之後以及NAT爲某一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處於NAT 路由器之後的主機之間建立UDP通信。該協議由RFC 5389定義。 |
ICE | 交互式連接建立(Interactive Connectivity Establishment),一種綜合性的NAT穿越的技術。 ICE 是由IETF的MMUSIC工作組開發出來的一種framework,可整合各種NAT穿透技術,如STUN、TURN、RSIP(Realm Specific IP,特定域IP)等。該framework可以讓SIP的客戶端利用各種NAT穿透方式打穿遠程的防火牆。 |
TURN | TURN(Traversal Using Relay NAT),是一種資料傳輸協議(data-transfer protocol)。通過中繼服務器,穿透 NAT 或防火牆使兩個 TCP 或 UPD 客戶端建立連接。 |
2 參考資料
- WebRTC規範 http://www.w3.org/TR/webrtc/
- WebRTC官網 http://datatracker.ietf.org/wg/rtcweb/
- WebRTC wiki http://en.wikipedia.org/wiki/WebRTC
- WebRTC實現 http://www.webrtc.org/
- Media Capture and Streams http://dev.w3.org/2011/webrtc/editor/getusermedia.html
- Mozilla對WebRTC的介紹 https://developer.mozilla.org/zh-CN/docs/WebRTC
- Html5rocks 的 WebRTC 使用例子 http://www.html5rocks.com/en/tutorials/webrtc/basics/
3 現狀
3.1 規範現狀
3.2 Google WebRTC(http://www.webrtc.org/)庫現狀
- MediaStream 裏的音頻無法給 audio 標籤處理,也無法給其它 Web API(比如 Web Audio)處理;
- ICE 尚未完全兼容規範 RFC 5245,將要發佈的 Chrome M23 會有第一個實現;
- DataChannel 尚未實現,這個主要是因爲標準委員會還在討論該規範。
3.3 瀏覽器實現現狀
4 設計
4.1 系統框架
- 瀏覽器開發人員關注的 WebRTC C++ API 層
- Web App 開發人員關注的 Web API 層
4.1.1 Your Web App
4.1.2 Web API
4.1.3 WebRTC C++ API
4.1.4 Transport / Session
4.1.5 VoiceEngine
4.1.6 VideoEngine
4.2 概要設計
4.2.1 MediaStream 實現
媒體流,一個媒體流包含 0 個到多個的媒體數據源,媒體流裏面的數據在呈現(render)的時候必須同步進行(就是常說的音視頻同步)。WebRTC 客戶端連接建立後傳遞的數據流就是這個東西。 MediaStream 通過 getUserMedia 獲得,MediaStream 的實現由 w3c 規範 Media Capture and Streams(http://dev.w3.org/2011/webrtc/editor/getusermedia.html)定義。4.2.2 Signalling 實現
- 本地客戶端的配置信息;
- 遠程客戶端的配置信息;
- 遠程參與建立P2P連接的信息:主要是 IP 和端口。
- 呼叫方發送 offer;
- 被呼叫方接受這個 offer;
- 被呼叫方方式 answer;
- 呼叫方接受 answer。
4.2.3 PeerConnection 實現
4.2.4 DataChannel 實現
5 實現
-
WebKit 庫方面,除了適配,已經支持 WebRTC,操作如下:
- 編譯時啓用宏 ENABLE_MEDIA_STREAM;
- 採用 http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/Modules/mediastream 下面的所以 idl 文件,並把生成的 cpp 文件添加到 WebCore工程裏;
- 把 http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/Modules/mediastream 下面的所有 cpp 文件添加到 WebCore工程裏;
- 把 http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/mediastream 下面的所有 cpp 文件添加到 WebCore工程裏;
-
適配開發
適配的實現主要是要實現 PeerConnection,參考實現是:
http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/mediastream/chromium
(chromium 的適配使用了 http://www.webrtc.org/ 庫)
-
WebKit已有實現關鍵類介紹
6 部署
- Web APP 開發
參考例子爲:http://webrtc-samples.googlecode.com/svn/trunk/apprtc/index.html
- 信令(Signalling)服務器開發及部署
參考例子爲:http://webrtc-samples.googlecode.com/svn/trunk/apprtc/apprtc.py
- STUN 或 TURN 服務器開發及部署
STUN 參考:http://en.wikipedia.org/wiki/STUN
TURN 參考:http://en.wikipedia.org/wiki/Traversal_Using_Relay_NAT