1. 程式人生 > >[轉載】利用RTMP實現直播系統

[轉載】利用RTMP實現直播系統

http://blog.csdn.net/kenny25/article/details/39346417

 

一,目標:

利用開源或者免費工具實現一個直播系統;同時支援在瀏覽器、播放器和嵌入到PC應用或者移動APP中觀看直播。

 

二,技術選型:

視音訊源端:: 

Adobe Flash Media Live Encoder 3.2,可以在windows和mac安裝;

如果你已有一些支援RTMP的採集裝置,那是最好了;

或許你想在自己的應用中實現,這樣你就必須自己開發處理採集,編碼和協議傳輸了(以後再表;

 

RTMP Server:

FMS -- Adobe公司出品的伺服器,價格昂貴,當然是最正宗的,因為RTMP就是Adobe公司的私有協議;

Wowza -- 同樣需要授權費, 大概是$55 per month/instance,效率和穩定性都還不錯;

Red5 -- 一個開源實現, 效率和穩定性都稍微差些,由於它是java實現的,所以天生支援跨平臺執行;

Nignx-rtmp-module - -nginx的一個第三方模組,如果你熟悉nginx那是不錯的選擇,當然它也是免費的,不過功能就沒有其他幾個豐富了;

這裡我選擇nginx+nginx-rtmp-module作為伺服器,這是我認為最容易上手的一種方式了(如果你把windows作為伺服器那可能麻煩些, 官方提供的windows二進位制版本是沒有nignx-rtmp-module的,而且nginx在windows下的效能比linux就差太多了)

 

客戶端:

Flash Player VLC  也可以安裝其他支援rtmp的播放器;

JW Media Player 一個開源的flash視音訊播放器,利用它我們可以直接在瀏覽器觀看直播;(移動端的瀏覽器是不知道flash的)

ffmpge/librtmp  如果你希望在自己的應用中實現播放器,或者希望在移動端直接接收RTMP流,那就要自己開發了(以後再表)

 

最後選型是: Adobe Flash Media Live Encoder 3.2 + Nignx-rtmp-module + JW Media Player

 

三,實現

(本文將nginx 安裝到Centos 6.5 下,IP 為192.168.0.51)

1,下載安裝 Adobe Flash Media Live Encoder 3.2

2,編譯安裝配置nginx + nginx-rtmp-module (nginx 1.7 無法編譯通過)

#wget http://nginx.org/download/nginx-1.6.2.tar.gz

#tar -zxvf nginx-1.6.2.tar.gz

#git clone https://github.com/arut/nginx-rtmp-module.git (如果沒有安裝git則直接下載zip包)

#cd nginx-1.6.2

#./configure --add-module=../nginx-rtmp-module --with-http_ssl_module

#make

#make install

 

配置(詳細檢視https://github.com/arut/nginx-rtmp-module), 編輯nginx/nginx.conf,增加rtmp模組:

rtmp {

     server {

listen 1935;

chunk_size 4000;

#可以將mylive改成你想要的名字

application mylive {

live on;

}

    }

}

 

在http模組增加:

location /stat{

    rtmp_stat all;

    rtmp_stat_stylesheet stat.xsl;

}

 

location /stat.xsl{

     root html;

}

同時需要將nginx-rtmp-module原始碼目錄下的stat.xsl拷貝到nginx/html下,這樣就可以通過網頁檢視伺服器的RTMP狀態了。

 

啟動nginx

 

3,下載免費版本JW player: https://account.jwplayer.com/static/download/jwplayer-6.10.zip (需要註冊登入後才可以下載),將其解壓到nginx/html下;

 

4,編寫live.html,儲存到nginx/html下;

[html] view plain copy

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  2.      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">  
  4. <head>  
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />  
  6. <title>live-player</title>  
  7. <style type="text/css">  
  8. </style>  
  9. </head>  
  10. <body>  
  11. <script type='text/javascript' src='jwplayer/jwplayer.js'></script>  
  12. <center>  
  13. <b>RTMP直播系統</b>  
  14. <div id='mediaspace'>This text will be replaced</div>  
  15. <script type='text/javascript'>  
  16.    var server = window.location.hostname;  
  17.    // mylive 對應nginx.conf配置項application的名字  
  18.    // live_stream 對應Adobe Flash Stream Media Live Encoder配置的stream名稱  
  19.    var live_url = 'rtmp://' + server + '/mylive' + '/live_stream';  
  20.   jwplayer('mediaspace').setup({  
  21.     'flashplayer': 'jwplayer/jwplayer.flash.swf',  
  22.     'file': live_url,  
  23.     'controlbar': 'bottom',  
  24.     'width': '760',  
  25.     'height': '428',  
  26.     //autostart: true,  //如果開啟此標誌,在開啟網頁時會自動播放直播流  
  27.   });  
  28. </script>  
  29. </body>  
  30. </html>  

 

這時候我們在瀏覽器輸入http://192.168.0.51/live.html:

 

5, Adobe Flash Media Live Encoder使用

 

A, 在FMS URL填寫RTMP伺服器地址,mylive則是我們在nginx.conf配置的rtmp application的名字(根據自己的配置填寫);

B,  在Stream填寫流的名字,這個名字相當是一個檔案的名字,填寫好後必須修改live.html的配置;

這時候我們按“Connect”,如果沒有提示錯誤則表示連線伺服器成功了,如果提示錯誤,則要檢查伺服器是否執行,是否已配置了rtmp模組相關屬性,尤其是application名字是否相對應。

C, 在Video 欄配置視訊相關屬性

Device: 表示攝像頭資訊,如果有多個攝像頭,則可以通過選擇切換;

Format: 視訊編碼格式,只支援H264和VP6,我們選擇H264就好;

Frame Rate: 幀率,如果越大則視訊會更流暢和清晰,但同時也會對碼流有影響;

Input Size: 攝像頭採集的解析度,我們最好是按攝像頭最好的解析度設定;

BitRate: 碼流,越大佔的頻寬就越多,最好根據輸出解析度和網路來調節,如果解析度大,而碼流小則影象就會比較模糊,如果在網路不好的狀況可以降低碼流來保證流暢度;

Output Size: 編碼輸出解析度,這個會影響碼流和影象質量;

D,在Audio欄配置音訊相關屬性

Device: 麥克風

Format: 音訊編碼格式,一般有MP3和AAC,在不同平臺不一樣,我在windows下只有MP3,在mac下MP3和AAC都有;

Channels: 聲道,Mono 單聲道,Stereo 雙聲道,根據自己的採集裝置進行選擇;

Sample Rate: 聲音取樣率,一般是越大采集出來的聲音會越清晰,但同時會影響到碼流;

Bit Rate: 碼流,類似視訊的Bit Rate;

 

但我們都設定好了就可以點選“start”進行直播了,此時我們再點選http://192.168.0.51/live.html 頁面的播放按鈕,在3s左右後就會看到直播畫面;

 

在我的實測中(區域網和Intenet都有測試),一般都在1-3s之間的延遲;

 

 

四,問題和解決

1,在你檢查了N遍引數都正確後,視訊一直在loading狀態或者失敗了,那請你檢查一下伺服器的防火牆是否開放1935埠;

2,視訊很卡,則可以將video 引數BitRate和Output Size,相應調小些,同時也可以將Audio的Sample Rate和Bit Rate調小;

3,沒有聲音,可以通過切換audio引數的Format試試;

 

五,後續

通過現有的工具,然後幾行程式碼,我們就可以實現一個簡單的直播系統了,但離我們的生產環境還是有差距的,也許我們有那麼幾個疑問:

伺服器可以支援多少併發,效能如何?

如何在移動端觀看直播?

如何在自己的應用程式支援像Adobe Media Live Encode一樣的功能?

如何在自己的應用程式直接接收RTMP流?