Nginx自己是一個很是出色的HTTP服務器,FFMPEG是很是好的音視頻解決方案.這兩個東西經過一個nginx的模塊nginx-rtmp-module,組合在一塊兒便可以搭建一個功能相對比較完善的流媒體服務器.html
這個流媒體服務器能夠支持RTMP和HLS(Live Http Stream)nginx
從安裝開始服務器
Nginx的安裝參照我以前的這個: http://blog.csdn.net/redstarofsleep/article/details/45092127
app
不一樣的是在configure的時候須要增長nginx-rtmp-module的支持,下載好nginx-rtmp-module後解壓,而後nginx安裝時增長這個模塊(--add-module),其它都是同樣的.tcp
./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
FFMPEG的安裝參照上一篇: http://blog.csdn.net/redstarofsleep/article/details/45092145ide
nginx配合ffmpeg作流媒體服務器的原理是: nginx經過rtmp模塊提供rtmp服務, ffmpeg推送一個rtmp流到nginx, 而後客戶端經過訪問nginx來收看實時視頻流. HLS也是差很少的原理,只是最終客戶端是經過HTTP協議來訪問的,可是ffmpeg推送流仍然是rtmp的.url
安裝完成後,打開Nginx的配置文件nginx.conf進行配置.net
首先在裏面加入rtmp的配置代理
rtmp { server { listen 1935; application myapp { live on; } application hls { live on; hls on; hls_path /tmp/hls; } } }
而後,針對hls,還須要在http裏面增長一個location配置code
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監聽端口.
# netstat -ltn Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:1935 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN
而後用ffmpeg推流到nginx:
第一個是推到了上面配置的myapp上:
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上:
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的這種技術特色,決定了它的延遲通常老是會高於普通的流媒體直播協議。
文章來自: http://blog.csdn.net/redstarofsleep/article/details/45092147