WebRTC學習與DEMO資源一覽


一. WebRTC學習

1.1   WebRTC現狀

本人最早接觸WebRTC是在2011年底,
那時Google已經在Android源碼中加入了webrtc源碼,放在/external/webrtc/,
但是Android並沒有用到它,更沒有被瀏覽器使用。
當時試圖在Android 2.3(Gingerbread)高通平台的手機上
用H.264 硬件codec替換掉WebRTC缺省使用的VP8軟codec,費了不少勁勉強換掉后效果很差只得放棄。

最近得知Google最新版的Chrome for Android已經支持WebRTC,
應老板的要求搭一個手機瀏覽器上視頻通信的demo,
為此在網上搜集各種資料,發現經過一年多的發展,
國內外研究和使用WebRTC的人明顯多起來,可用的demo也很多。
在此做一個筆記,留作日后參考。


目前基於WebRTC的開發其實有兩個方向,
一個是基於瀏覽器的WebRTC應用開發,編程語言主要是JavaScript、HTML等,
這也是WebRTC作為HTML5標准的組成部分原本的目的;


另一個是C層面的移植和開發,作為一款非常強大的開源軟件,
很多領域的軟件項目都可以利用到WebRTC的音視頻通信和處理能力,
這些場合的應用程序可能是C語言寫的,也不一定與瀏覽器有關。
本文是屬於前一種方向。

1.2 WebRTC基本概念學習

WebRTC的官方資料可以從其官網http://www.webrtc.org/
和W3C網站http://www.w3.org/TR/webrtc/上看到。

學習WebRTC基礎知識比較好的網站是《Getting Started with WebRTC》,
網址是http://www.html5rocks.com/en/tutorials/webrtc/basics/,這個也是官網上推薦的。

對瀏覽器來說,WebRTC其實就是提供了3個API:
. MediaStream (即getUserMedia),用於獲取媒體數據,例如來自攝像頭和麥克風的視頻流和音頻流;
. RTCPeerConnection,用於peer跟peer之間呼叫和建立連接以便傳輸音視頻數據流;
. RTCDataChannel,用於peer跟peer之間傳輸音視頻之外的一般數據。

需要注意的是這幾個API的名稱在不同瀏覽器及同一瀏覽器的不同版本之間略有差異,
比如PeerConnection在FireFox上叫做mozRTCPeerConnection,
而在當前版本的Chrome上叫做webkitRTCPeerConnection,
將來WebRTC標准化完成后會把這些前綴去掉使用統一的名稱。

目前網上找到的WebRTC demo都只用到了getUserMedia和RTCPeerConnection這兩個API,
另一個API即RTCDataChannel似乎目前還不太成熟。

WebRTC是實現peer to peer的實時通信(可以兩個或多個peer之間),
在能夠通信前peer跟peer之間必須建立連接,這是RTCPeerConnection的任務,
為此需要借助一個信令服務器(signaling server)來進行,信令包括3種類型的信息:
 . Session control messages: 初始化和關閉通信,及報告錯誤;
 . Network configuration: 雙方的IP地址和端口號(局域網內部IP地址需轉換為外部的IP地址);
 . Media capabilities: 雙方的瀏覽器支持使用何種codecs以及多高的視頻分辨率。

WebRTC並未規定使用何種信令機制和消息協議,
象SIP、XMPP、XHR、WebSocket這些技術都可以用作WebRTC的信令通信。

除了信令服務器,peer跟peer建立連接還需要借助另一種服務器
(稱為STUN server)實現NAT/Firewall穿越,因為很多peer是處於私有局域網中,
使用私有IP地址,必須轉換為公有IP地址才能相互之間傳輸數據。
這其中涉及到一些專業術語包括STUN、TURN、ICE等,具體的本人還有待學習。
網上找到的WebRTC demo好象都用的是Google提供的STUN server。

peer跟peer之間一旦建立連接就可以直接傳輸音視頻數據流,
並不需要借助第三方服務器中轉。

二. WebRTC封裝庫

WebRTC的目的是為了簡化基於瀏覽器的實時數據通信的開發工作量,
但實際應用編程還是有點復雜,尤其調用RTCPeerConnection必須對如何建立連接、
交換信令的流程和細節有較深入的理解。

因此有高人為我們開發了WebRTC封裝庫,將WebRTC的調用細節封裝起來,包裝成更簡單的API,
使開發應用程序更簡單。
封裝庫的另一個目的是為了屏蔽不同瀏覽器之間的差異,例如上面說的API名稱的差異。
當然,這些庫都是開源的,可以根據自己的需要重新修改。

目前網上找到的有兩種WebRTC封裝庫,
1) webrtc.io,網址是https://github.com/webRTC/webRTC.io,
   上面有詳細說明和使用方法,有很多demo使用它;
2) SimpleWebRTC,網址是https://github.com/HenrikJoreteg/SimpleWebRTC,
   貌似比webrtc.io用起來更簡單。

三、 WebRTC demo試用

網上可以找到一堆WebRTC demo,在code.google.com上也能找到不少WebRTC應用項目的源碼。
有些demo是直接調用WebRTC API開發的,但大多數是調用上述兩種WebRTC封裝庫開發的。
由於WebRTC API的名稱在不同瀏覽器及同一瀏覽器的不同版本之間存在差異,
所以不是所有demo都能運行在所有瀏覽器上。

為了找到一個可在公司局域網環境中跑在手機上的WebRTC demo,本人試用了不少demo,
下面選幾個有代表性的介紹,其中有兩個經修改后已在本人公司的局域網環境中運行成功。

先說一下本人的測試環境:手機上的瀏覽器是Chrome for Android 26.0.1410.49,
運行在Android 4.1.2上,這個Chrome版本本身是beta版,支持WebRTC但缺省是關閉WebRTC功能的,
需要在chrome://flags中使能WebRTC並重啟Chrome,
或者在啟動Chrome時增加命令行選項--enable-webrtc。
本人在PC上運行WebRTC的瀏覽器是Chrome 26.0.1410.43,操作系統是Windows 7。

3.1  http://www.webrtc.org/demo(https://apprtc.appspot.com/)

這是官方的demo,功能很全,
這個網站 https://apprtc.appspot.com/ 不能直接從國內上去,需要翻牆才行,
它的源碼原來是在https://code.google.com/p/webrtc-samples/上,
現在下不了了。
此demo沒有用任何封裝庫。

這個demo所使用的信令機制使用了XHR和Google App Engine Channel API ,具體我不懂。
在我的公司局域網環境里無法運行該demo。

3.2  愛立信實驗室開發的WebRTC demo

據說是第一個基於瀏覽器的WebRTC視頻通信demo,
愛立信為此還開發了一個瀏覽器用於支持WebRTC,好象也是基於WebKit的,
叫做Bowser browser(當時市場上可能還沒有支持WebRTC的瀏覽器),
該項目網址是https://labs.ericsson.com/apps/bowser。
這個Bowser browser好象只支持Ubuntu 11.04 and 11.10
(見https://labs.ericsson.com/apis/web-real-time-communication/downloads)。

該demo的網址是http://webrtc.labs.ericsson.net:8082。
在我的公司局域網環境里無法運行該demo。

3.3   人臉檢測識別

利用WebRTC的getUserMedia從攝像頭獲取圖像進行人臉識別的demo,例如這兩個:
http://neave.com/webcam/html5/face/
http://www.raymondcamden.com/demos/2012/mar/29/test1.html
前面這個在PC和手機上的Chrome上都可運行,后面那個不行

3.4   http://www.simpl.info

這個demo演示HTML, CSS and JavaScript的各種feature和使用方法,
包括WebRTC的3個API:
 . getUserMedia、
 . RTCPeerConnection、
 . RTCDataChannel的演示,
但遺憾的是RTCPeerConnection的演示只是本地camera的畫面傳回給本地,
並沒有實現真正的設備之間音視頻通信。
該項目的源碼在https://github.com/samdutton/simpl。

3.5   Framegrabber

這是一個基於WebRTC實現屏幕共享(screensharing)的Chrome擴展,
源碼在https://github.com/samdutton/rtcshare,
有關介紹可參考這篇文章:http://blog.sina.com.cn/s/blog_51396f890102es7k.html。
沒試用過。

3.6   http://webrtc.dennis.is

這個demo是基於庫webrtc.io實現的,是webrtc.io官方的demo,使用WebSocket作為信令手段。
在我的公司局域網環境里無法運行該demo;
在家里無線路由器環境下可成功運行,但只能單向傳輸視頻。

3.7   http://v.kainy.cn

國內牛人做的,相當於是漢化版的http://webrtc.dennis.is,
自然也是基於webrtc.io實現的,但使用的webrtc.io版本較老,
不支持新版本Chrome所使用的API名稱webkitRTCPeerConnection,
所以無法在新版本Chrome上運行。
具體介紹在http://blog.kainy.cn/2013/01/webrtc實現的視頻聊天室應用/。

3.8   http://conversat.io

這個demo是基於庫SimpleWebRTC實現的,是SimpleWebRTC官方的demo,使用WebSocket作為信令手段。

在我的公司局域網環境里無法運行該demo;
在家里無線路由器環境下可成功運行,且可雙向傳視頻,支持多個peer同時視頻通信。


經修改后在本人公司局域網成功運行,
試過兩個手機和一個筆記本電腦同時視頻通信OK。
修改和運行步驟:
1. 從http://www.nodejs.org/download/下載nodejs最新版並安裝,
   我是在Windows7 64位上安裝的;
2. 在命令行下依次運行如下命令(安裝運行signaling server所需的模塊):
npm install express
npm install yetify
npm install getconfig
npm install node-uuid
npm install socket.io


3. 從https://github.com/andyet/signalmaster下載信令服務器源碼,
   該信令服務器是SimpleWebRTC缺省使用的,解開該源碼后運行node server.js,
   該服務器監聽8888端口,通過WebSocket與瀏覽器通信。


4. 在同一台PC上運行apache server,
   將從http://conversat.io網站扒下來的文件放到該server上
  (可在Chrome瀏覽器中打開http://conversat.io然后鼠標右鍵單擊在菜單中選
   “另存為”、“網頁,全部”即可),修改其中的 index.html 和 simplewebrtc.js,
    將其中 url 改為'http://10.100.156.83:8888'(其中IP地址是我的PC在公司局域網中的IP地址)。


5. 在同一局域網中的其他設備上打開Chrome瀏覽器,
   地址欄輸入http://10.100.156.83,輸入相同的room名稱(隨便起)即可開始多方視頻通信,
   也可修改上述index.html中的“var room”一行,設定為固定的room名稱,
   就不需要每次在每個設備上手工輸入room名稱了。


3.9   國內人開發的視頻聊天室應用

這個demo是國內人趙書劍開發的視頻聊天室,基於webrtc.io實現。
該項目源碼和文檔下載地址是:
  http://ishare.iask.sina.com.cn/f/35083616.html,
源碼在:
  https://github.com/zsj2145676。


1. 從http://ishare.iask.sina.com.cn/f/35083616.html下載webrtc.chatdemo.zip,
解壓縮,修改其中public\javascripts\client.js中的rtc.connect一行,
將實際的服務器地址寫進去,例如改為:
  rtc.connect("ws://10.100.156.83:8001", room);


2. 安裝node.js
從http://www.nodejs.org/download/下載nodejs最新版並安裝,
   我是在Windows7 64位上安裝的;
在命令行下依次運行如下命令(安裝運行signaling server所需的模塊):
npm install express
npm install yetify
npm install getconfig
npm install node-uuid
npm install socket.io


3.運行node app.js,注意該demo本身已包含http server,
  不需要其他的http server,比如apache server


4.在同一局域網中的其他設備上打開Chrome瀏覽器,
地址欄輸入http://10.100.156.83:8000,
輸入相同的room名稱(隨便起)即可開始多方視頻通信。


我對照做了安裝和修改,測試失敗,
能看到房間有人進來和退出,但無法進行文件和視頻聊天。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM