[實戰]利用RTMP實現直播系統
一,目標:
利用開源或者免費工具實現一個直播系統;同時支援在瀏覽器、播放器和嵌入到PC應用或者移動APP中觀看直播。
二,技術選型:
視音訊源端::
如果你已有一些支援RTMP的採集裝置,那是最好了;
或許你想在自己的應用中實現,這樣你就必須自己開發處理採集,編碼和協議傳輸了(以後再表;
RTMP Server:
FMS -- Adobe公司出品的伺服器,價格昂貴,當然是最正宗的,因為RTMP就是Adobe公司的私有協議;
Wowza -- 同樣需要授權費, 大概是$55 per month/instance,效率和穩定性都還不錯;
Red5 -- 一個開源實現, 效率和穩定性都稍微差些,由於它是
Nignx-rtmp-module - -nginx的一個第三方模組,如果你熟悉nginx那是不錯的選擇,當然它也是免費的,不過功能就沒有其他幾個豐富了;
這裡我選擇nginx+nginx-rtmp-module作為伺服器,這是我認為最容易上手的一種方式了(如果你把windows作為伺服器那可能麻煩些, 官方提供的windows二進位制版本是沒有nignx-rtmp-module的,而且nginx在windows下的效能比linux就差太多了)
客戶端:
也可以安裝其他支援rtmp的播放器;
JW Media Player 一個開源的flash視音訊播放器,利用它我們可以直接在瀏覽器觀看直播;
ffmpge/librtmp 如果你希望在自己的應用中實現播放器,或者希望在移動端直接接收RTMP流,那就要自己開發了(以後再表)
三,實現
(本文將nginx 安裝到Centos 6.5 下,IP 為192.168.0.51)
2,編譯安裝配置nginx + nginx-rtmp-module (nginx 1.7 無法編譯通過)
#tar -zxvf nginx-1.6.2.tar.gz
#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
4,編寫live.html,儲存到nginx/html下;
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="en"lang="en">
- <head>
- <metahttp-equiv="content-type"content="text/html; charset=utf-8"/>
- <title>live-player</title>
- <styletype="text/css">
- </style>
- </head>
- <body>
- <scripttype='text/javascript'src='jwplayer/jwplayer.js'></script>
- <center>
- <b>RTMP直播系統</b>
- <divid='mediaspace'>This text will be replaced</div>
- <scripttype='text/javascript'>
- var server = window.location.hostname;
- // mylive 對應nginx.conf配置項application的名字
- // live_stream 對應Adobe Flash Stream Media Live Encoder配置的stream名稱
- var live_url = 'rtmp://' + server + '/mylive' + '/live_stream';
- jwplayer('mediaspace').setup({
- 'flashplayer': 'jwplayer/jwplayer.flash.swf',
- 'file': live_url,
- 'controlbar': 'bottom',
- 'width': '760',
- 'height': '428',
- //autostart: true, //如果開啟此標誌,在開啟網頁時會自動播放直播流
- });
- </script>
- </body>
- </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流?