nginx+ffmpeg搭建流媒體伺服器(直播流)
阿新 • • 發佈:2019-02-18
環境
系統環境:opensuse 12
需求
利用nginx和ffmpeg搭建流媒體伺服器(直播流),其他流後續會有所更新
關於用Nginx搭建flv,mp4,hls流媒體伺服器的技術乾貨!
模組:nginx_mod_h264_streaming(支援h264編碼MP4格式的視訊)
模組:http_flv_module (支援flv)
模組:http_mp4_module (支援mp4)
模組: nginx-rtmp-module (支援rtmp協議,也支援HLS)
步驟
(1)模組下載和解壓
wget http://nginx.org/download/nginx-1.6.0.tar.gz
wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
wget http://sourceforge.net/projects/pcre/files/pcre/8.35/pcre-8.35.tar.gz
wget http://zlib.net/zlib-1.2.8.tar.gz
wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz
將所有模組統一放置在/usr/local/nginx_sources目錄下,方便管理
安裝步驟:openssl-->zlib-->pcre
1.openssl
./config --prefix=/usr/local/openssl -->make -->make install
2. zlib
./configure --prefix=/usr/local/zlib-->make -->make install
3.pcre
./configure ==prefix=/usr/local/pcre -->make -->make install
(2)配置命令,會生成makefile檔案
cd /usr/local/nginx-1.6.0
./configure \
--prefix=/usr/local/nginx \
--add-module=/usr/tmp/nginx_mod_h264_streaming-2.2.7
\
--add-module=/usr/tmp/nginx-rtmp-module-master \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-pcre=/usr/tmp/pcre-8.35
\
--with-zlib=/usr/tmp/zlib-1.2.8
\
--with-debug\
--with-openssl=/usr/tmp/openssl-1.0.1g
錯誤提示:如果在configure過程中出現以下錯誤:
/root/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c: In function ‘ngx_streaming_handler’:
/root/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c:158: error: ‘ngx_http_request_t’ has no member named ‘zero_in_uri’
make[1]: *** [objs/addon/src/ngx_http_h264_streaming_module.o] Error 1
make[1]: Leaving directory `/root/nginx-0.8.54'
make: *** [build] Error 2
那麼將src/ngx_http_streaming_module.c檔案中以下程式碼刪除或者是註釋掉就可以了:
/* TODO: Win32 */
if (r->zero_in_uri)
{
return NGX_DECLINED;
}
如果你沒有對這個檔案做個更改,那麼應該在原始碼的第157-161行。
cd /usr/local/nginx/sbin--> ./nginx ( 啟動nginx) -->netstat -nltp(如果80埠啟動就說明安裝成功)
安裝ffmpeg:(如果系統不支援上網功能,可以自行從網下先下載,再上傳到伺服器) 下載FFmpeg和libx264的包 ffmpeg-3.2.4.tar.bz2 last_x264.tar.bz2 libx264需要yasm,所以先安裝yasm
http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp; add_header Cache-Control no-cache; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } server { listen 8080; location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /usr/local/nginx-rtmp-module/; #在nginx-rtmp-module原始碼根目錄 } } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} } 錯誤提示:安裝ffmpeg出現錯誤, cannot open shared object file vi /etc/ld.so.conf 在尾部增加一行:/usr/local/lib -->ldconfig 溫馨提示:如果編譯過程中出現一些錯誤,學會看config.log,裡面會有錯誤提示及解決方法 5、配置好後判斷配置是否正確 /usr/local/nginx/sbin/nginx -t
-->重啟nginx /usr/local/nginx/sbin/nginx -s reload -->檢視是否已經啟動流媒體伺服器的埠 netstat -anp | grep 1935 6、開始推流,我推的是直播流 -->cd /usr/local/ffmpeg_sources/ffmpeg-3.2.4 -->./ffmpeg -re -i "/usr/local/WEB.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -pix_fmt yuv420p -q 10 rtmp://172.19.197.244:1935/myapp/test -->make && make install 7. 搭建客戶端測試環境,本文測試播放器使用的是jwplayer -->準備網頁 -->下載jwplayer:http://www.longtailvideo.com/players/jw-flv-player/ -->下載後,解壓到:/usr/local/nginx/html/ -->建立測試頁面test.html,也放到上面目錄下。 <html> <head> <script src="jwplayer/jwplayer.js"></script> </head> <body> <div id='my-video'></div> <script type='text/javascript'> jwplayer('my-video').setup({ file:'rtmp://172.19.197.244/myapp/test', //#live是applicatioin,test是直播快取流檔案 width:'100%', aspectratio:'3:2', fallback:'false', primary:'flash' }); </script> </body> </html> ps:由於指令碼預設不呼叫javascript函式,所以我們要去官網下載這個函式配置檔案,將它放在 /usr/local/nginx/html/jwplayer/jwplayer.js,由於jwplayer.js是沒有的,需要自己建立 找到下圖這個網址,然後開啟網址將jwplayer.js的程式碼複製進你之前建立的配置檔案中
8、 啟動服務 nginx l 推流 用ffmpeg產生一個模擬直播源,向rtmp伺服器推送 ./ffmpeg -re -i "/usr/local/WEB.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -pix_fmt yuv420p -q 10 rtmp://172.19.197.244:1935/myapp/test 注意,原始檔必須是H.264+AAC編碼的。 172.19.197.244是執行nginx的伺服器IP,live是applicatioin, test是直播快取流檔案,需要與配置檔案中的直播快取檔名一樣。 l 從客戶端訪問網頁:
安裝ffmpeg:(如果系統不支援上網功能,可以自行從網下先下載,再上傳到伺服器) 下載FFmpeg和libx264的包 ffmpeg-3.2.4.tar.bz2 last_x264.tar.bz2 libx264需要yasm,所以先安裝yasm
- zypper install yasm
- zypper install libx264-dev
- tar -xzvf last_x264.tar.bz2
- ./configure --enable-shared --enable-pthread --enable-pic
- make
- make install
- zypper install libfaac-dev
- zypper install libmp3lame-dev
- zypper install libtheora-dev
- zypper install libvorbis-dev
- zypper install libxvidcore-dev
- zypper install libxext-dev
- zypper install libxfixes-dev
- tar -xzvf ffmpeg-3.2.4.tar.bz2
- cd /usr/local/ffmpeg_sources #我把它統一放在/usr/local/ffmpeg_sources目錄
- cd ffmpeg ffmpeg-3.2.4
-
./configure --prefix=/usr/local/ffmpeg --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-pthreads --enable-libmp3lame --enable-libtheora
--enable-libx264 --enable-libxvid --enable-x11grab
- make && make install
- cd /usr/local/nginx/conf -->vi nginx.conf
http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /tmp; add_header Cache-Control no-cache; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } server { listen 8080; location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root /usr/local/nginx-rtmp-module/; #在nginx-rtmp-module原始碼根目錄 } } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} } 錯誤提示:安裝ffmpeg出現錯誤, cannot open shared object file vi /etc/ld.so.conf 在尾部增加一行:/usr/local/lib -->ldconfig 溫馨提示:如果編譯過程中出現一些錯誤,學會看config.log,裡面會有錯誤提示及解決方法 5、配置好後判斷配置是否正確 /usr/local/nginx/sbin/nginx -t
-->重啟nginx /usr/local/nginx/sbin/nginx -s reload -->檢視是否已經啟動流媒體伺服器的埠 netstat -anp | grep 1935 6、開始推流,我推的是直播流 -->cd /usr/local/ffmpeg_sources/ffmpeg-3.2.4 -->./ffmpeg -re -i "/usr/local/WEB.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -pix_fmt yuv420p -q 10 rtmp://172.19.197.244:1935/myapp/test -->make && make install 7. 搭建客戶端測試環境,本文測試播放器使用的是jwplayer -->準備網頁 -->下載jwplayer:http://www.longtailvideo.com/players/jw-flv-player/ -->下載後,解壓到:/usr/local/nginx/html/ -->建立測試頁面test.html,也放到上面目錄下。 <html> <head> <script src="jwplayer/jwplayer.js"></script> </head> <body> <div id='my-video'></div> <script type='text/javascript'> jwplayer('my-video').setup({ file:'rtmp://172.19.197.244/myapp/test', //#live是applicatioin,test是直播快取流檔案 width:'100%', aspectratio:'3:2', fallback:'false', primary:'flash' }); </script> </body> </html> ps:由於指令碼預設不呼叫javascript函式,所以我們要去官網下載這個函式配置檔案,將它放在 /usr/local/nginx/html/jwplayer/jwplayer.js,由於jwplayer.js是沒有的,需要自己建立 找到下圖這個網址,然後開啟網址將jwplayer.js的程式碼複製進你之前建立的配置檔案中
8、 啟動服務 nginx l 推流 用ffmpeg產生一個模擬直播源,向rtmp伺服器推送 ./ffmpeg -re -i "/usr/local/WEB.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -pix_fmt yuv420p -q 10 rtmp://172.19.197.244:1935/myapp/test 注意,原始檔必須是H.264+AAC編碼的。 172.19.197.244是執行nginx的伺服器IP,live是applicatioin, test是直播快取流檔案,需要與配置檔案中的直播快取檔名一樣。 l 從客戶端訪問網頁: