一,目標(biāo):
利用開源或者免費(fèi)工具實(shí)現(xiàn)一個直播系統(tǒng);同時支持在瀏覽器、播放器和嵌入到PC應(yīng)用或者移動APP中觀看直播。
二,技術(shù)選型:
視音頻源端::
Adobe Flash Media Live Encoder 3.2,可以在windows和mac安裝;
如果你已有一些支持RTMP的采集設(shè)備,那是最好了;
或許你想在自己的應(yīng)用中實(shí)現(xiàn),這樣你就必須自己開發(fā)處理采集,編碼和協(xié)議傳輸了(以后再表;
RTMP Server:
FMS -- Adobe公司出品的服務(wù)器,價格昂貴,當(dāng)然是最正宗的,因為RTMP就是Adobe公司的私有協(xié)議;
Wowza -- 同樣需要授權(quán)費(fèi), 大概是$55 per month/instance,效率和穩(wěn)定性都還不錯;
Red5 -- 一個開源實(shí)現(xiàn), 效率和穩(wěn)定性都稍微差些,由于它是
Java實(shí)現(xiàn)的,所以天生支持跨平臺運(yùn)行;
Nignx-rtmp-module - -nginx的一個第三方模塊,如果你熟悉nginx那是不錯的選擇,當(dāng)然它也是免費(fèi)的,不過功能就沒有其他幾個豐富了;
這里我選擇nginx+nginx-rtmp-module作為服務(wù)器,這是我認(rèn)為最容易上手的一種方式了(如果你把windows作為服務(wù)器那可能麻煩些, 官方提供的windows二進(jìn)制版本是沒有nignx-rtmp-module的,而且nginx在windows下的性能比
Linux就差太多了)
客戶端:
Flash Player VLC 也可以安裝其他支持rtmp的播放器;
JW Media Player 一個開源的flash視音頻播放器,利用它我們可以直接在瀏覽器觀看直播;(移動端的瀏覽器是不知道flash的)
ffmpge/librtmp 如果你希望在自己的應(yīng)用中實(shí)現(xiàn)播放器,或者希望在移動端直接接收RTMP流,那就要自己開發(fā)了(以后再表)
最后選型是:
Adobe Flash Media Live Encoder 3.2 +
Nignx-rtmp-module +
JW Media Player三,實(shí)現(xiàn)
(本文將nginx 安裝到Centos 6.5 下,IP 為192.168.0.51)
1,下載安裝
Adobe Flash Media Live Encoder 3.22,編譯安裝配置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
配置(詳細(xì)查看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下,這樣就可以通過網(wǎng)頁查看服務(wù)器的RTMP狀態(tài)了。
啟動nginx
3,下載免費(fèi)版本JW player:
https://account.jwplayer.com/static/download/jwplayer-6.10.zip (需要注冊登錄后才可以下載),將其解壓到nginx/html下;
4,編寫live.html,保存到nginx/html下;
[html]
view plain copy<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>live-player</title>
<style type="text/css">
</style>
</head>
<body>
<script type='text/javascript' src='jwplayer/jwplayer.js'></script>
<center>
<b>RTMP直播系統(tǒng)</b>
<div id='mediaspace'>This text will be replaced</div>
<script type='text/javascript'>
var server = window.location.hostname;
// mylive 對應(yīng)nginx.conf配置項application的名字
// live_stream 對應(yīng)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, //如果打開此標(biāo)志,在打開網(wǎng)頁時會自動播放直播流
});
</script>
</body>
</html>
這時候我們在瀏覽器輸入http://192.168.0.51/live.html:
5, Adobe Flash Media Live Encoder使用
A, 在FMS URL填寫RTMP服務(wù)器地址,mylive則是我們在nginx.conf配置的rtmp application的名字(根據(jù)自己的配置填寫);
B, 在Stream填寫流的名字,這個名字相當(dāng)是一個文件的名字,填寫好后必須修改live.html的配置;
這時候我們按“Connect”,如果沒有提示錯誤則表示連接服務(wù)器成功了,如果提示錯誤,則要檢查服務(wù)器是否運(yùn)行,是否已配置了rtmp模塊相關(guān)屬性,尤其是application名字是否相對應(yīng)。
C, 在Video 欄配置視頻相關(guān)屬性
Device: 表示攝像頭信息,如果有多個攝像頭,則可以通過選擇切換;
Format: 視頻編碼格式,只支持H264和VP6,我們選擇H264就好;
Frame Rate: 幀率,如果越大則視頻會更流暢和清晰,但同時也會對碼流有影響;
Input Size: 攝像頭采集的分辨率,我們最好是按攝像頭最好的分辨率設(shè)置;
BitRate: 碼流,越大占的帶寬就越多,最好根據(jù)輸出分辨率和網(wǎng)絡(luò)來調(diào)節(jié),如果分辨率大,而碼流小則圖像就會比較模糊,如果在網(wǎng)絡(luò)不好的狀況可以降低碼流來保證流暢度;
Output Size: 編碼輸出分辨率,這個會影響碼流和圖像質(zhì)量;
D,在Audio欄配置音頻相關(guān)屬性
Device: 麥克風(fēng)
Format: 音頻編碼格式,一般有MP3和AAC,在不同平臺不一樣,我在windows下只有MP3,在mac下MP3和AAC都有;
Channels: 聲道,Mono 單聲道,Stereo 雙聲道,根據(jù)自己的采集設(shè)備進(jìn)行選擇;
Sample Rate: 聲音采樣率,一般是越大采集出來的聲音會越清晰,但同時會影響到碼流;
Bit Rate: 碼流,類似視頻的Bit Rate;
但我們都設(shè)置好了就可以點(diǎn)擊“start”進(jìn)行直播了,此時我們再點(diǎn)擊http://192.168.0.51/live.html 頁面的播放按鈕,在3s左右后就會看到直播畫面;
在我的實(shí)測中(局域網(wǎng)和Intenet都有
測試),一般都在1-3s之間的延遲;
四,問題和解決
1,在你檢查了N遍參數(shù)都正確后,視頻一直在loading狀態(tài)或者失敗了,那請你檢查一下服務(wù)器的防火墻是否開放1935端口;
2,視頻很卡,則可以將video 參數(shù)BitRate和Output Size,相應(yīng)調(diào)小些,同時也可以將Audio的Sample Rate和Bit Rate調(diào)小;
3,沒有聲音,可以通過切換audio參數(shù)的Format試試;
五,后續(xù)
通過現(xiàn)有的工具,然后幾行代碼,我們就可以實(shí)現(xiàn)一個簡單的直播系統(tǒng)了,但離我們的生產(chǎn)環(huán)境還是有差距的,也許我們有那么幾個疑問:
服務(wù)器可以支持多少并發(fā),性能如何?
如何在移動端觀看直播?
如何在自己的應(yīng)用程序支持像Adobe Media Live Encode一樣的功能?
如何在自己的應(yīng)用程序直接接收RTMP流?