Android IOS WebRTC 音視頻開發總結(八十五)-- 使用WebRTC廣播網路網路攝影機視頻(下)

來源:互聯網
上載者:User

標籤:

本文主要介紹WebRTC (我們翻譯和整理的,譯者:weizhenwei,校正:blacker),最早發表在【編風網】  

 

支援原創,轉載必須註明出處,歡迎關注我的公眾號blacker(ID:blackerteam 或 webrtcorgcn)。

 

回顧:Android IOS WebRTC 音視頻開發總結(八十三)-- 使用WebRTC廣播網路網路攝影機視頻(上) 

 

串連網路攝影機

 

正如上文所提,我們選用一款簡單的D-Link DCS-7010L網路攝影機。關鍵原因在於它支援RTSP協議,因此伺服器可以從網路攝影機中擷取視頻流。

 

我們使用插接線把網路攝影機和路由器串連起來。網路攝影機開啟後,通過DHCP協議識別路由器並擷取IP地址,在這裡是192.168.1.34。如果你開啟路由器設定,你會發現一台已串連裝置DCS 7010,這就是我們的網路攝影機。現在開始測試這台網路攝影機。

 

在瀏覽器中開啟192.168.1.34,進入網路攝影機的Web管理介面,密碼預設為空白。

 

 

如你所見,在管理面板上網路攝影機的視頻流播放地很流暢。儘管如此,我們還是能夠看到抖動現象。這正是我們要用WebRTC修正的問題。

 

配置網路攝影機

 

首先,我們禁用認證功能。基於測試目的,我們允許任何人觀看廣播。具體設定是,進入SetupNetwork頁面,設定AuthenticationDisable

 

在同一設定介面,我們檢查RTSP協議的連接埠是否正確,預設是554。輸出視頻格式在檔次中確定。你可以設定為3檔次,但是我們使用第一個live1.sdp,它已經分別為音視頻配置H.264和G.711。這裡所做的任何設定都可以通過Setup-Audio and Video修改。

 

 

現在我們可以通過RTSP測試網路攝影機。開啟VLC播放器(或其它任何支援RTSP協議的播放器,例如QuickTime,Window Media Player,RealPlayer,等等),開啟URL對話方塊設定網路攝影機的RTSP地址:rtsp://192.168.1.34/live1.sdp。

 

 

OK,它如預期那樣工作。網路攝影機通過RTSP發送視頻流到播放器。

 

 

此外,視頻流播放非常流暢,沒有任何瑕疵。我們期待WebRTC能有同樣表現。

 

安裝伺服器

 

至此,網路攝影機已經安裝完畢,並且用案頭播放器進行過測試。我們已經準備好使用伺服器進行廣播。藉助於whatismyip.com網站可以確定網路攝影機的外網IP地址是178.51.142.223。現在需要配置路由器,把所有經過554連接埠發送的RTSP請求重新導向到網路攝影機。

 

開啟路由器的對應設定頁面:

 

 

並使用telnet檢查外網IP地址和RTSP連接埠:

 

telnet 178.51.142.223 554

 

確定連接埠能夠響應請求後,我們開始安裝WebRTC伺服器。

 

託管服務我們使用Amazon EC2 CentOS 64位伺服器。為減少效能問題,我們選擇配置一個VCPU的m3.medium執行個體:

 

 

當然,可供選擇的還有Linode和DigitalOcean,但這次我們決定使用Amazon。為使樣本工作起來,我們需要在AmazonEC2控制台上配置連接埠,WebRTC和RTSP/RTP都需要這些連接埠。如果你也想測試樣本,那麼要確保Amazon接收流量面板配置如下:

 

 

DigitalOcean的配置更加簡單,你僅需要在防火牆關閉這些連接埠,或者完全禁用。根據我們使用DigitalOcean的經驗,它們提供靜態IP,不會和NAT混淆在一起。因此,DigitalOcean並不需要像Amazon那樣配置連接埠。

 

作為向WebRTC廣播RTSP/RTP的服務端軟體,我們使用WebRTC媒體廣播伺服器軟體Flashphoner。該流媒體伺服器很像可以通過Flash廣播RTSP/RTP 的Wowza。唯一不同的是Flashphoner通過WebRTC傳輸串流媒體,而不是Flash。從技術上說,這意味著瀏覽器和伺服器之間通過DTLS通訊,建立SRTP會話,傳送VP8編碼的視頻流到觀眾面前。

 

接下來安裝伺服器需要的SSH。

 

完整的伺服器軟體安裝清單如下:

 

1.下載伺服器軟體
$wget flashphoner.com/downloads/builds/WCS/3.0/x8664/wcs3_video_vp8/FlashphonerMediaServerWebRTC-3.0/FlashphonerMediaServerWebRTC-3.0.868.tar.gz

2.提取軟體
$tar -xzf FlashphonerMediaServerWebRTC-3.0.868.tar.gz

3.安裝軟體

$cd FlashphonerMediaServerWebRTC-3.0.868
$./install.sh

設定管理員的外網IP地址:54.186.112.111,內網IP地址:172.31.20.65。

4.開啟服務

$service webcallserver start

5.檢查日誌

$tail — f/usr/local/FlashphonerWebCallServer/logs/server_logs/flashphoner.log

6.確認服務正在運行

$ps aux | grep Flashphoner

7.裝並開啟apache服務

$yum install httpd
$service httpd start

8.下載web檔案並放置到apache預設目錄/var/www/html

cd /var/www/html
$wget github.com/flashphoner/flashphoner_client/archive/wcs_media_client.zip
$unzip webrtc_media_client.zip

9.在設定檔flashphoner.xml中設定管理員的IP地址。

10.關閉防火牆

$service iptables stop

 

理論上說,你應該在第10步配置防火牆連接埠和規則,而不是關閉它。但基於測試目的,我們直接把防火牆關掉。

 

設定管理員

 

我們的WebRTC廣播服務架構如下:

 

 

我們已經配置好圖中的節點,現在我們需要配置節點之間的箭頭串連。

 

Web用戶端負責瀏覽器和WebRTC之間互聯,可以從github下載源碼。JS,CSS和HTML檔案在安裝期間上傳到/var/www/html目錄(看上節第九步)。

 

瀏覽器-伺服器通訊在flashphoner.xml中配置,我們在該檔案中寫入伺服器的外網IP地址,因此Web用戶端可以通過HTML5 websocket串連WebRTC伺服器。

 

OK,我們已經配置好伺服器,現在讓我們測試一下:

 

在瀏覽器中開啟Web用戶端索引頁面index.html:

 

http://54.186.112.111/wcs_media_client/?id=rtsp://webrtc-ipcam.ddns.net/live1.sdpwebrtc-ipcam.ddns.net是一個從noip.com動態網域名稱伺服器獲得的免費網域名稱,它能夠串連到我們的外網IP地址。並且,我們已經配置路由器,根據NAT規則把發送到192.168.1.34的RTSP請求進行重新導向。

 

參數id=rtsp://webrtc-ipcam.ddns.net/live1.sdp設定視頻流的URL。WebRTC伺服器從網路攝影機擷取視頻流,處理後用WebRTC廣播到瀏覽器。你的路由器可能支援DDNS,如果不支援的話,可以使用網路攝影機選項:

 

 

下面是在路由器中設定DDNS:

 

 

最後,我們來測試系統查看結果。

 

測試

 

連結從瀏覽器開啟,串連到WebRTC伺服器。伺服器發送請求到網路攝影機以擷取視頻流。這個過程需要幾秒鐘時間。

 

 

瀏覽器通過WebSocket串連到伺服器,然後伺服器通過RTSP向網路攝影機發送請求,得到用RTP封裝的H.264流,進而轉碼為VP8/SRTP格式,最終在WebRTC相容瀏覽器上進行播放。

 

 

經過一小段延遲後,我們可以看到熟悉的畫面:

 

 

視頻底部顯示視頻流的URL地址,你可以複製後在另一個瀏覽器中開啟。

 

確認WebRTC在工作

 

如果我們作弊怎麼辦?即來自網路攝影機的視頻仍然通過HTTP傳輸。我們不要只相信看到的視頻流,更應該去核查接收流量的類型。再次運行Wireshark和Chrome調試工具,在Chrome控制台可以看到如下內容:

 

 

這一次沒有資料包進進出出,也沒有通過HTTP協議傳輸的圖片。現在我們看到的是Websocket資料幀,大部分是保持Websocket會話連通性的ping/pong幀。比較有趣的幀是connect,prepareRtspSession和onReadyToPlay-——串連伺服器正是要經曆這些階段:首先建立Websocket串連和會話,然後播放請求內容。

 

下面是chrome://webrtc-internals所示內容:

 

 

如所示,來自網路攝影機的視頻碼率為1Mbps。也有發送流量,主要是RTCP和ICE資料包。瀏覽器和Amazon伺服器之間的RTT在300ms左右。

 

現在我們來看Wireshark,它清楚顯示來自伺服器的UDP流量。圖片資料包大小為1468位元組,這就是WebRTC流量。特別地,我們可以從瀏覽器中看到傳輸VP8視訊框架的SRTP資料包。另外,我們也可以看到一些STUN請求,這是WebRTC在仔細檢查串連狀況。

 

 

值得一提的是視頻播放延遲很低。WebRTC工作在SRTP/UDP之上,相比於HTTP、RTMP和其它基於TCP的協議,這是最快的發送資料包方法。因此,可見延遲是RTT 、緩衝區時延、解碼時延、播放時延的總和。

 

從視覺上講,裸眼沒有感覺到任何延遲,這表示延遲低於500ms。

 

下一個測試是串連其他觀眾。我們開啟10個Chrome視窗,每個視窗都播放視頻,這讓Chrome變得遲鈍。在另一台電腦上開啟第11個視窗,視頻播放仍然很流暢。

 

行動裝置的WebRTC

 

正如你所知,Android平台上的Chrome和Firefox也都支援WebRTC。讓我們檢查WebRTC廣播在這裡是否工作:

 

 

如所示,一部HTC智能機在Firefox上播放來自網路攝影機的視頻。和案頭系統相比,行動裝置上的視頻播放同樣很平滑流暢。

 

結論

 

作為結果,我們能夠以最小代價把網路攝影機的視頻用WebRTC廣播到瀏覽器。實現這一切不需要雨中跳舞或者巫術,也不需要火箭科學,僅基礎Linux和SSH知識即可。

 

廣播品質完全可以接受,裸眼感覺不到延遲。

 

我們可以得出結論:基於瀏覽器的WebRTC廣播完全值得考慮,正如在我們的情境下,WebRTC不是附件或者外掛程式,而是一個在瀏覽器中播放視頻的真正平台。

 

為什麼WebRTC沒有被廣泛應用

 

主要障礙可能在於缺少視頻轉碼器。WebRTC社區和廠商應該努力把H.264整合到WebRTC中。我們不能說VP8不好,但是為什麼要忽視數百萬計已經使用H.264的相容裝置和軟體呢?該死的專利! 

    

第二個原因是只有部分瀏覽器支援WebRTC。IE和Safari瀏覽器仍然不支援,因此我們不得不用其它辦法比如使用webrtc4all外掛程式。

 

在未來我們希望能夠看到很多不需要轉碼的解決方案,和很多能夠從不同裝置播放視頻流的瀏覽器。

 

譯者:weizhenwei,具體詳見:【編風網】

 

Android IOS WebRTC 音視頻開發總結(八十五)-- 使用WebRTC廣播網路網路攝影機視頻(下)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.