關於WebRTC的簡單瞭解報告(同事整理)

關於WebRTC的簡單瞭解報告

1.什麼是WebRTC

WebRTC是Google於2011年發佈的一個開源項目,它提供基於API的Web瀏覽器和移動應用程序之間的通信,包括音頻、視頻和數據的傳輸。 它消除了對本機插件和應用程序安裝的依賴,使這些連接易於使用,並得到所有主要瀏覽器和移動操作系統的支持。

在過去的幾年中,WebRTC在技術社區中的應用迅速發展。 Facebook、Amazon和Google都是實現WebRTC的主要技術公司之一,這些公司實現了WebRTC,從而使他們的Web應用程序更快、更可靠和更安全。WebRTC還提供現成的解決方案,可以輕鬆地與其他軟件集成。

WebRTC提供了視頻會議的核心技術,包括音視頻的採集、編解碼、網絡傳輸、顯示等功能,並且還支持跨平臺:windows,linux,mac,android。

2.WebRTC工作原理

WebRTC的主要焦點是在參與者之間提供實時音頻和視頻通信,參與者使用Web瀏覽器開始對話,相互定位並繞過防火牆(如果有的話)。WebRTC利用嵌入瀏覽器中的JavaScript API和HTML5。 WebRTC應用程序的典型功能如下:

(1)發送和接收流數據,包括音頻和視頻。
(2)檢索網絡配置數據,例如 使用WebRTC API向另一個客戶端發送和接收數據所需的IP地址,應用程序端口,防火牆和NAT。
(3)打開/關閉連接並報告錯誤。
(4)傳輸媒體數據,例如圖像分辨率和視頻編解碼器。

爲了發送和接收數據流,WebRTC提供了以下可在Web應用程序中使用的API:

RTCPeerConnection,用於音頻和視頻傳輸,加密和帶寬配置。
RTCDataChannel,用於傳輸通用數據。
MediaStream,用於從數碼相機,網絡攝像頭,麥克風或共享桌面等設備訪問多媒體數據流。

作爲涉及私人信息傳輸的技術,WebRTC預先假定安全措施以保護用戶免受惡意入侵。 當應用程序使用WebRTC時,沒有必要安裝輔助插件來保護其網絡連接。 它使用經過驗證可在傳輸過程中保護數據的標準加密技術。 WebRTC組件使用強制加密,並且所有JavaScript API都使用安全的HTTPS連接。 因此,實現WebRTC應用程序的開發人員需要注意的主要安全問題就是確保使用安全網絡協議。

3.WebRTC後臺服務

3.1.通話的房間服務器(Room Server)

房間服務器是用來創建和管理通話會話的狀態維護,是雙方通話還是多方通話,加入與離開房間等等,我們暫時沿用Google部署在GAE平臺上的AppRTC這個房間服務器實現,該GAE App的源碼可以在github.com上獲取.該實現是一個基於Python的GAE應用,我們需要下載Google GAE的離線開發包到我們自己的Linux服務器上來運行該項目,搭建大陸互聯網環境下的房間服務器.

3.2.通話的信令服務器(Signaling Server)

信令服務器是用來管理和協助通話終端建立去中心的點對點通話的一個角色.這個角色要負責一下任務:

  1. 用來控制通信發起或者結束的連接控制消息
  2. 發生錯誤時用來相互通告的消息
  3. 各自一方媒體流元數據,比如像解碼器、解碼器的配置、帶寬、媒體類型等等
  4. 兩兩之間用來建立安全連接的關鍵數據
  5. 外界所能看到的網絡上的數據,比如廣域網IP地址、端口等信令服務器的具體協議實現沒有嚴格規定,只要實現功能就OK.

我們這裏依然沿用Google提供的基於GO語言和WebSocket的信令服務器Collider.和上面的房間服務器一併在Github上可以獲取.獲取到我們自己的Linux服務器上用GO語言的運行環境來運行該信令服務器.

3.3.防火牆打洞服務器(STUN/TURN/ICE Server)

我們目前大部分人連接互聯網時都處於防火牆後面或者配置私有子網的家庭(NAT)路由器後面,這就導致我們的計算機的IP地址不是廣域網IP地址,故而不能相互之間直接通訊. 正因爲這樣的一個場景,我們得想辦法去穿越這些防火牆或者家庭(NAT)路由器,讓兩個同處於私有網絡裏的計算機能夠通訊起來.

###3.4.房間服務器搭建案例(LINUX)

####3.4.1.安裝依賴軟件和環
阿里雲的源是阿里自己的鏡像,不需要再修改源,安裝必備軟件像 git、解壓、nodejs、python 、go語言編譯等必備的軟件

cd ~
sudo apt-get update
apt-get install git unzip lrzsz nodejs npm automake autoconf libtool nodejs-legacy python-webtest golang -y

哪個軟件安裝失敗就重新裝

apt-get 軟件名稱

3.4.2. java環境安裝

下載jdk8 linux 64位版 jdk-8u191-linux-x64.tar.gz 下載地址下載完拿shell工具上傳到服務器/usr/lib/jvm路徑下,jvm 文件夾沒有的話創建後上傳。解壓jdk壓縮文件

cd /usr/lib/jvm/
tar -zxvf jdk-8u191-linux-x64.tar.gz

設置環境變量

cd /etc/
vim profile

打開文件後,在文件末尾追加

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

修改後按鍵ESC ->shift+:->wq 保存並退出
使配置生效

source /etc/profile

驗證java環境

java -version

如果出現如下信息則環境配置成功

java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

3.4.3. git下載apprtc項目倉庫,並編譯

cd ~
git clone https://github.com/webrtc/apprtc.git
cd apprtc/
git checkout v1.0

安裝編譯工具

npm -g install grunt-cli

安裝項目依賴

npm install 

這裏不會很順利,出現各種問題
如果報錯:SyntaxError: Use of const in strict mode,需要更新版本:

npm cache clean -f
npm install -g n
n stable
node -v
npm install  // 再來安裝一次

如果仍有錯誤還可以切換grunt-cli的源再重來一次

rm node_modules/ -rf 					//刪掉
npm config set registry https://registry.npm.taobao.org 			//切換淘寶源
npm info underscore			 //使其生效
npm install  // 再來安裝一次

還有問題谷歌、百度、Stack Overflow 查詢

依賴搞定之後,編譯apprtc項目

grunt build

這裏也會出現一些問題,缺少一些依賴,到相應缺少module目錄下

npm install 

再沒有可能需要翻牆自己下載。
如果出現

requests.exceptions.SSLError

這個是證書,不需要,nginx來轉發就好了,使用如下方式編譯

grunt build -force

如果出現

Done.with warrings 或者 Done.with out error

表示成功

3.4.4.修改編譯後的項目配置,源文件沒有動

修改 constants.py

cd out/app_engine/
vim constants.py

修改的部分

TURN_BASE_URL = 'https://www.域名'
ICE_SERVER_BASE_URL = 'https://www.域名
WSS_INSTANCE_HOST_KEY = 'www.域名:8089'
WSS_INSTANCES = [{
    WSS_INSTANCE_HOST_KEY: 'www.域名:8089',
    WSS_INSTANCE_NAME_KEY: 'wsserver-std',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}, {
    WSS_INSTANCE_HOST_KEY: 'www.域名:8089',
    WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
    WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
}]

修改 index_template.html在
var loadingParams = { 這一行上面添加javaScript代碼

var servers=[{
	credential:"helloword",
	username:"helloword",
	urls:["turn:服務器外網ip:3478?transport=udp",
	"turn:服務器外網ip:3478?transport=tcp",
	"turn:服務器外網ip:3479?transport=udp",
	"turn:服務器外網ip:3479?transport=tcp"
	]
}];

修改debug.js

cd ~/apprtc/out/app_engine/js
vi apprtc.debug.js 

做出如下修改

if (!isChromeApp()) {
   roomLink=roomLink.substring("http","https"); //新增加的
    window.history.pushState({"roomId":roomId, "roomLink":roomLink}, roomId, roomLink);
  		}

註釋掉

//peerConnectionConfig: {{ pc_config | safe }},
//turnRequestUrl: '{{ turn_url }}',
//iceServerRequestUrl: '{{ ice_server_url }}',

添加

peerConnectionConfig:{"rtcpMuxPolicy":"require","iceServers":servers,"bundlePolicy":"max-bundle"},

3.4.5.安裝google_appengine 谷歌Python服務器容器,apprtc跑在上面

https://cloud.google.com/appengine/downloads?csw=1

選擇Standard environment下的python,下載到本地後後上傳到服務器 ~ 目錄

解壓

cd ~
unzip google_appengine_1.9.80.zip

配置環境變量

vi  /etc/profile

添加變量

export PATH=$PATH:/root/google_appengine/

使其生效

source /etc/profile

創建日誌文件

mkdir logs 
cd logs
touch room.log collider.log turn.log			   //創建文件
chmod 777 room.log collider.log turn.log  //修改權限

3.4.6.啓動房間服務器,觀察日誌

觀察日誌

tail -f ./logs/room.log

新建立連接啓動服務器

cd ~
nohup ./google_appengine/dev_appserver.py --host 
內網ip--enable_host_checking false ./apprtc/out/app_engine > ./logs/room.log 2>&1 &

3.4.7.結果驗證

打開https://域名/

能正常訪問,則成功

如果報錯找不到

callstats.min.js
下載地址

https://download.csdn.net/download/qinxue24/10789910

socket.io.js
下載地址

https://download.csdn.net/download/xuelang532777032/10723395

下載後上傳到

/root/apprtc/out/app_engine/third_party/callstats

重新打開網頁就好

關於其他

依次將通話的房間服務器、通話的信令服務器、防火牆打洞服務器搭建完成後,進行一定的整合配置,使他們能一起工作,最後用谷歌瀏覽器打開 http://apprtc.diveinedu.com:8080/ ,註冊房間之後就可以視頻通話了。

一些開源的WebRTC框架

licode

http://chotis2.dit.upm.es/#

mediasoup

https://mediasoup.org/

jitsi

https://jitsi.org/

kurento

http://www.kurento.org/

進入這些網址後我們可以試用,找到相關的框架和相關的服務器搭建API和案例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章