nginx+ffmpeg搭建流媒體伺服器
安裝ffmpeg:
下載FFmpeg和libx264的包
ffmpeg-2.4.1.tar.bz2 last_x264.tar.bz2
libx264需要yasm,所以先安裝yasm
- apt-get install yasm
然後安裝libx264
- aptitude install libx264-dev
也可以手動安裝libx264(原先libx264在ubuntu的軟體源裡是沒有的只能手動安裝,現在有了就可以不用手動安裝了)
解壓縮libx264
-
tar -xjvf last_x264.tar.bz2
安裝libx264
- ./configure --enable-shared --enable-pic
- make
- make install
然後安裝ffmpeg,ffmpeg有許多依賴包,需要一個一個先安裝
1. libfaac
- aptitude install libfaac-dev
2. libmp3lame
- aptitude install libmp3lame-dev
3. libtheora
-
aptitude install libtheora-dev
4. libvorbis
- aptitude install libvorbis-dev
5. libxvid
- aptitude install libxvidcore-dev
6. libxext
- aptitude install libxext-dev
7. libxfixes
- aptitude install libxfixes-dev
依賴包安裝完後,安裝ffmpeg
先解壓縮ffmpeg
-
tar -xjvf ffmpeg-2.4
然後編譯安裝
- ./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-libxvid --enable-x11grab --enable-libvorbis
- make
- make install
Nginx本身是一個非常出色的HTTP伺服器,FFMPEG是非常好的音視訊解決方案.這兩個東西通過一個nginx的模組nginx-rtmp-module,組合在一起即可以搭建一個功能相對比較完善的流媒體伺服器.
這個流媒體伺服器可以支援RTMP和HLS(Live Http Stream)
從安裝開始
不同的是在configure的時候需要增加nginx-rtmp-module的支援,下載好nginx-rtmp-module後解壓,然後nginx安裝時增加這個模組(--add-module),其它都是一樣的.
- ./configure --prefix=/usr/local/nginx --with-pcre=/home/user/pcre/pcre-8.32 --with-zlib=/home/user/zlib/zlib-1.2.8 --with-openssl=/home/user/openssl/openssl-1.0.1i --add-module=/home/user/nginx-rtmp-module
nginx配合ffmpeg做流媒體伺服器的原理是: nginx通過rtmp模組提供rtmp服務, ffmpeg推送一個rtmp流到nginx, 然後客戶端通過訪問nginx來收看實時視訊流. HLS也是差不多的原理,只是最終客戶端是通過HTTP協議來訪問的,但是ffmpeg推送流仍然是rtmp的.
安裝完成後,開啟Nginx的配置檔案nginx.conf進行配置
首先在裡面加入rtmp的配置
- rtmp {
- server {
- listen 1935;
- application myapp {
- live on;
- }
- application hls {
- live on;
- hls on;
- hls_path /tmp/hls;
- }
- }
- }
然後,針對hls,還需要在http裡面增加一個location配置
- location /hls {
- types {
- application/vnd.apple.mpegurl m3u8;
- video/mp2t ts;
- }
- root /tmp;
- add_header Cache-Control no-cache;
- }
這是一個最簡單,最基礎的配置, rtmp監聽1935埠,如果是hls的話用hls on開啟hls,並且為hls設定一個臨時檔案目錄hls_path /tmp/hls; 其它更高階的配置可以參看nginx-rtmp-module的readme,裡面有比較詳細的介紹其它的配置,並且它還提供了一個通過JWPlayer在網頁上播放的例子.
儲存完配置檔案後,啟動nginx,通過netstat -ltn命令可以看到增加了一個1935埠的監聽.8080是nginx預設的http監聽埠.
[java] view plaincopyprint?- # netstat -ltn
- Active Internet connections (only servers)
- Proto Recv-Q Send-Q Local Address Foreign Address State
- tcp 00127.0.1.1:530.0.0.0:* LISTEN
- tcp 000.0.0.0:220.0.0.0:* LISTEN
- tcp 00127.0.0.1:6310.0.0.0:* LISTEN
- tcp 000.0.0.0:19350.0.0.0:* LISTEN
- tcp 000.0.0.0:80800.0.0.0:* LISTEN
- tcp6 00 :::22 :::* LISTEN
- tcp6 00 ::1:631 :::* LISTEN
然後用ffmpeg推流到nginx:
第一個是推到了上面配置的myapp上:
[java] view plaincopyprint?- ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac
- -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://server:1935/
- myapp/test1
第二個推送到hls上:
[java] view plaincopyprint?- ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac
- -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://ip:1935/
- hls/test2
現在我們的流媒體伺服器有兩個實時流了,一個是rtmp的,另一個是hls的,用流媒體播放器播放一下,流媒體播放器可以用vlc也可以用ffmpeg帶的ffplay.手機也是可以播放的.
上面這兩個流的地址分別是:
第一個就是推送的地址: rtmp://serverIp:1935/myapp/test1
第二個是HTTP地址: http://serverIp:8080/hls/test2.m3u8
最後貼上一段對於HLS這個比較特殊的流媒體協議的解釋:
(這段解釋來自: http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html)
HTTP Live Streaming(HLS)是蘋果公司(Apple Inc.)實現的基於HTTP的流媒體傳輸協議,可實現流媒體的直播和點播,相對於常見的流媒體直播協議,例如RTMP協議、RTSP協議、MMS協議等,HLS直播最大的不同在於,直播客戶端獲取到的,並不是一個完整的資料流。HLS協議在伺服器端將直播資料流儲存為連續的、很短時長的媒體檔案(MPEG-TS格式),而客戶端則不斷的下載並播放這些小檔案,因為伺服器端總是會將最新的直播資料生成新的小檔案,這樣客戶端只要不停的按順序播放從伺服器獲取到的檔案,就實現了直播。由此可見,基本上可以認為,HLS是以點播的技術方式來實現直播。由於資料通過HTTP協議傳輸,所以完全不用考慮防火牆或者代理的問題,而且分段檔案的時長很短,客戶端可以很快的選擇和切換位元速率,以適應不同頻寬條件下的播放。不過HLS的這種技術特點,決定了它的延遲一般總是會高於普通的流媒體直播協議。
用開源nginx-rtmp-module搭建flash直播環境:
2、進入nginx的原始碼目錄,編譯
./configure --add-module=<path-to-nginx-rtmp-module> --without-http_rewrite_module
make
make install
3、寫一個測試配置檔案
#user nobody;
worker_processes 1;
error_log logs/error.log debug;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application myapp {
live on;
}
}
}
http {
server {
listen 8080;
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /home/arut-nginx-rtmp-module-e5d61f2/;
}
location / {
root /home/arut-nginx-rtmp-module-e5d61f2/test/rtmp-publisher;
}
}
}
4、啟動nginx
/usr/local/nginx/sbin/nginx -c /home/arut-nginx-rtmp-module-e5d61f2/test/nginx.conf
5、用ffmpeg產生一個模擬直播源,向rtmp伺服器推送
ffmpeg -re -i ~/2012.flv -f flv rtmp://192.168.11.75/myapp/test1
注意,原始檔必須是H.264+AAC編碼的。192.168.11.75是執行nginx的伺服器IP
7、網頁播放測試,用nginx-rtmp-module自帶的一個例子修改,在test/rtmp-publisher目錄下
player.html
<!DOCTYPE html>
<html>
<head>
<title>RTMP Player</title>
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
var flashVars = {
streamer: 'rtmp://192.168.11.75/myapp',
file:'test1'
};
swfobject.embedSWF("RtmpPlayer.swf", "rtmp-publisher", "500", "400", "9.0.0",
null, flashVars);
</script>
</head>
<body>
<div id="rtmp-publisher">
<p>Flash not installed</p>
</div>
</body>
</html>
播放大視訊會很卡
nginx-rtmp-module還有許多其他特性,例如支援FLV/MP4的點播、HLS直播、多worker工作模式、push and pull工作模式等,以後慢慢挖掘
Nginx-RTMP功能調研:
協議介紹
RTMP(Real Time Messaging Protocol)實時訊息傳送協議是Adobe Systems公司為Flash播放器和伺服器之間音訊、視訊和資料傳輸開發的私有協議。
它有三種變種:
1)工作在TCP之上的明文協議,使用埠1935;
3)RTMPS類似RTMPT,但使用的是HTTPS連線;
RTMP協議就像一個用來裝資料包的容器,這些資料可以是AMF格式的資料,也可以是FLV中的視/音訊資料。一個單一的連線可以通過不同的通道傳輸多路網路流。這些通道中的包都是按照固定大小的包傳輸的。
圖1 RTMP互動圖
更多協議的細節可以參見《rtmp specification 1.0》
2.1當前的流媒體server
現在主要有兩種rtmp server,商業的和開源的。商業的比開源的支援的功能多,個人根據需要選擇吧
商業的有FMS Wowza
開源RTMP server
1. red5 java 有名
2. crtmpserver c++ 支援多種rtmp協議,移動裝置以及IPTV相關網路協議 http://www.rtmpd.com/ Erlyvideo erlong 有開源和商業版本 https//github.com/erlyvideo/erlyvideo h
FMS是Adobe公司的產品,license非常昂貴。下面就wowza這個商業軟體講下流媒體Server,不僅僅是RTMP Server,在達到生產環境所需要的功能。wowza最突出的特定是多終端適應性,這個在如今多媒體融合的網路環境下有很強的實用意義。究其原理並無深入研究。國內尚為視訊是其代理公司。
Wowza Media Server是一款高效能、多執行緒的流媒體伺服器軟體。專為多種終端裝置提供音視訊內容播放服務,支援iOS、windows、Android、BlackMerry等系統的終端裝置,以HTTP、RTSP/ RTP、RTMP傳輸協議的流播放,還支援利用機頂盒進行播放的IPTV。
通過對Wowza Media Server的深度定製開發,尚為網路視聽管理系統實現了對網路音視訊內容的採集、編碼、編輯、轉碼、稽核、播出與監控等完整的生命週期管理,突出了以下能力:
1)自動化內容收錄
對網路視訊的錄製,採用伺服器端錄製模式,滿足從28Kbps到10Mbps碼流範圍的H.264編碼流的自動化定時收錄。
2) 快速線上編輯
雲端計算架構設計,伺服器端處理。所有編輯任務都處在雲端,對編輯機無要求,任務處理快捷簡單。
對視訊的處理包括切條、合併、去除廣告、新增logo等操作。
支援同一素材多格式檔案的一次性編輯處理,提高工作效率。
3) 雲式轉碼
採用雲轉碼技術開發的音視訊檔案轉碼、實時流轉碼,實現了不同格式、位元速率、解析度、幀數等引數的自由轉換,滿足不同終端的播放需求。
4) 多終端釋出支援
結合Wowza Media Server支援多協議多終端的特性,尚為網路視聽系統一個平臺即可支援多終端裝置的視訊訪問,無論用任何裝置都可訪問所需的視訊內容。
在對多終端內容統一管理的基礎之上,還可實現了多終端視訊的斷點續播功能。使用者的播放在一個終端上播放暫停後