Nginx本身是一個非常出色的HTTP服務(wù)器,FFMPEG是非常好的音視頻解決方案.這兩個東西通過一個nginx的模塊nginx-rtmp-module,組合在一起即可以搭建一個功能相對比較完善的流媒體服務(wù)器。這個流媒體服務(wù)器可以支持RTMP和HLS(Live Http Stream)
nginx配合ffmpeg做流媒體服務(wù)器的原理是: nginx通過rtmp模塊提供rtmp服務(wù), ffmpeg推送一個rtmp流到nginx, 然后客戶端通過訪問nginx來收看實時視頻流. HLS也是差不多的原理,只是最終客戶端是通過HTTP協(xié)議來訪問的,但是ffmpeg推送流仍然是rtmp的。如圖所示:
1.安裝編譯環(huán)境和依賴項
1yum -y install gcc glibc glibc-devel make nasm pkgconfig lib-devel openssl-devel expat-devel gettext-devel libtool mhash.x86_64 perl-Digest-SHA1.x86_64 gcc-c++
2yum -y install git pcre pcre-devel zlib zlib-devel
2.下載nginx和nginx-rtmp-module
1wget http://nginx.org/download/nginx-1.10.0.tar.gz
2tar zxvf nginx-1.10.0.tar.gz
3git clone git://github.com/arut/nginx-rtmp-module.git
3.編譯nginx
1cd nginx-1.10.0
2./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module --with-http_stub_status_module
3make
4make install
4.配置nginx并啟動服務(wù)
1vi /usr/local/nginx/conf/nginx.conf
2增加一下內(nèi)容:
3 rtmp {
4 server {
5 listen 1935;
6
7 application myapp {
8 live on;
9 }
10 application hls {
11 live on;
12 hls on;
13 hls_path /tmp/hls;
14 }
15 }
16 }
17
18然后,針對hls,還需要在http里面增加一個location配置
19 location /hls {
20 types {
21 application/vnd.apple.mpegurl m3u8;
22 video/mp2t ts;
23 }
24 root /tmp;
25 add_header Cache-Control no-cache;
26 }
27/usr/local/nginx/sbin/nginx
5.安裝ffmpeg和相應(yīng)的解碼庫
1yum -y install yasm
2#如果yum源里面沒有yasm,就用下面的方式安裝,注意要去掉前面的注釋符號#
3#++++++++Yasm+++++++++++
4#wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
5#tar xzvf yasm-1.2.0.tar.gz
6#cd yasm-1.2.0
7#./configure
8#make
9#make install
10#cd ..
11#++++++++x264+++++++++++
12git clone git://git.videolan.org/x264
13cd x264
14./configure --enable-shared
15make
16make install
17cd ..
18#++++++++LAME+++++++++++
19wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
20tar xzvf lame-3.99.5.tar.gz
21cd lame-3.99.5
22./configure --enable-nasm
23make
24make install
25cd ..
26#++++++++libogg+++++++++++
27wget http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz
28tar xzvf libogg-1.3.0.tar.gz
29cd libogg-1.3.0
30./configure
31make
32make install
33cd ..
34#++++++++libvorbis+++++++++++
35wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz
36tar xzvf libvorbis-1.3.3.tar.gz
37cd libvorbis-1.3.3
38./configure
39make
40make install
41cd ..
42#++++++++libvpx+++++++++++
43wget http://down1.chinaunix.net/distfiles/libvpx-v1.1.0.tar.bz2
44tar jxvf libvpx-v1.1.0.tar.bz2
45cd libvpx-v1.1.0
46./configure --enable-shared --enable-vp8
47make
48make install
49cd ..
50#++++++++FAAD2+++++++++++
51wget http://downloads.sourceforge.net/project/faac/faad2-src/faad2-2.7/faad2-2.7.tar.gz
52tar zxvf faad2-2.7.tar.gz
53cd faad2-2.7
54./configure
55make
56make install
57cd ..
58#++++++++FAAC+++++++++++
59wget http://downloads.sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz
60tar zxvf faac-1.28.tar.gz
61cd faac-1.28
62vi common/mp4v2/mpeg4ip.h
63#修改以下內(nèi)容
64從123行開始修改此文件mpeg4ip.h,到129行結(jié)束。
65 修改前:
66 #ifdef __cplusplus
67 extern "C" {
68 #endif
69 char *strcasestr(const char *haystack, const char *needle);
70 #ifdef __cplusplus
71 }
72 #endif
73
74 修改后:
75 #ifdef __cplusplus
76 extern "C++" {
77 #endif
78 const char *strcasestr(const char *haystack, const char *needle);
79 #ifdef __cplusplus
80 }
81 #endif
82#修改完后保存退出
83./configure
84make
85make install
86cd ..
87#++++++++Xvid+++++++++++
88wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz
89tar zxvf xvidcore-1.3.2.tar.gz
90cd xvidcore/build/generic
91./configure
92make
93make install
94cd ../../../
95#++++++++ffmpeg+++++++++++
96git clone git://source.ffmpeg.org/ffmpeg
97cd ffmpeg
98./configure --prefix=/opt/ffmpeg/ --enable-version3 --enable-libvpx --enable-libfaac --enable-libmp3lame --enable-libvorbis --enable-libx264 --enable-libxvid --enable-shared --enable-gpl --enable-postproc --enable-nonfree --enable-avfilter --enable-pthreads
99make && make install
100cd ..
101vi /etc/ld.so.conf
102#增加以下內(nèi)容
103include ld.so.conf.d/*.conf
104/lib
105/lib64
106/usr/lib
107/usr/lib64
108/usr/local/lib
109/usr/local/lib64
110/opt/ffmpeg/lib
111#保存退出
112ldconfig
6.用ffmpeg推流到nginx
1#RTMP方式
2/opt/ffmpeg/bin/ffmpeg -re -i "/home/1.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://0.0.0.0:1935/
3myapp/test1
4#HTTP方式
5/opt/ffmpeg/bin/ffmpeg -re -i "/home/2.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://0.0.0.0:1935/hls/test2
7.驗證服務(wù)是否搭建成功
上面這兩個流的地址分別是:
第一個就是推送的地址: rtmp://0.0.0.0:1935/myapp/test1
第二個是HTTP地址: http://0.0.0.0:80/hls/test2.m3u8
其中0.0.0.0換成你服務(wù)器的ip地址。
現(xiàn)在我們的流媒體服務(wù)器有兩個實時流了,一個是rtmp的,另一個是hls的,用流媒體播放器播放一下,實際測試vlc無法播放,mpc-hc、potplayer可以播放,還有一個測試swf地址也可以播放:http://www.cutv.com/demo/live_test.swf,其它播放器沒有測試,rtmp方式成功,http方式?jīng)]有成功。
8.后續(xù)
ffmpeg功能強大,還可以做在線轉(zhuǎn)碼、切片等功能,暫時沒有測試。有興趣的同學可以自行實驗。
最后貼上一段對于HLS這個比較特殊的流媒體協(xié)議的解釋:
(這段解釋來自: http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html)
HTTP Live Streaming(HLS)是蘋果公司(Apple Inc.)實現(xiàn)的基于HTTP的流媒體傳輸協(xié)議,可實現(xiàn)流媒體的直播和點播,相對于常見的流媒體直播協(xié)議,例如RTMP協(xié)議、RTSP協(xié)議、MMS協(xié)議等,HLS直播最大的不同在于,直播客戶端獲取到的,并不是一個完整的數(shù)據(jù)流。HLS協(xié)議在服務(wù)器端將直播數(shù)據(jù)流存儲為連續(xù)的、很短時長的媒體文件(MPEG-TS格式),而客戶端則不斷的下載并播放這些小文件,因為服務(wù)器端總是會將最新的直播數(shù)據(jù)生成新的小文件,這樣客戶端只要不停的按順序播放從服務(wù)器獲取到的文件,就實現(xiàn)了直播。由此可見,基本上可以認為,HLS是以點播的技術(shù)方式來實現(xiàn)直播。由于數(shù)據(jù)通過HTTP協(xié)議傳輸,所以完全不用考慮防火墻或者代理的問題,而且分段文件的時長很短,客戶端可以很快的選擇和切換碼率,以適應(yīng)不同帶寬條件下的播放。不過HLS的這種技術(shù)特點,決定了它的延遲一般總是會高于普通的流媒體直播協(xié)議。
參考鏈接:
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246040020bee7723517708d98293c5db21a1cacab672c601e76e0dd9bd3149ca694282f8327317a1992044f934fa09a1179877dd14de9de45b2e1ac7884afa2c4df2244cb23453cdfb29c5b7003ca19e71541bcfbcf0f4b08&p=977bdf0c86cc42af5b81c7710f41cc&newp=89759a46d6c018fc57efdb371c418e231610db2151d2d34c&user=baidu&fm=sc&query=centos+nginx-rtmp-module&qid=8ca1d4d200012b2b&p1=7http://download.chinaunix.net/download.php?id=40081&ResourceID=13024http://redstarofsleep.iteye.com/blog/2123752