1. 程式人生 > >nginx+ffmpeg搭建流媒體伺服器(直播流)

nginx+ffmpeg搭建流媒體伺服器(直播流)

環境 系統環境: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
  1. zypper install yasm  
然後安裝libx264
  1. zypper install libx264-dev  
解壓縮libx264
  1. tar -xzvf last_x264.tar.bz2  
安裝libx264
  1. ./configure --enable-shared --enable-pthread --enable-pic  
  2. make  
  3. make install  
然後安裝ffmpeg,ffmpeg有許多依賴包,需要一個一個先安裝,可能安裝過程中還需要下載其他依賴包,這個安裝過程依照提示進行下載安裝即可 1. libfaac
  1. zypper install libfaac-dev  
2. libmp3lame
  1. zypper install libmp3lame-dev  
3. libtheora
  1. zypper install libtheora-dev  
4. libvorbis
  1. zypper install libvorbis-dev  
5. libxvid
  1. zypper install libxvidcore-dev 
6. libxext
  1. zypper install libxext-dev  
7. libxfixes
  1. zypper install libxfixes-dev  
依賴包安裝完後,安裝ffmpeg 先解壓縮ffmpeg
  1. tar -xzvf ffmpeg-3.2.4.tar.bz2  
  2. cd /usr/local/ffmpeg_sources #我把它統一放在/usr/local/ffmpeg_sources目錄
  3. cd ffmpeg ffmpeg-3.2.4
  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 
  5. make && make install
  6. 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  從客戶端訪問網頁: