======配置目的====== 让Nginx支持flv和mp4格式文件,支持RTMP协议的直播和点播; 同时打开RTMP的HLS功能 资料: HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。 HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。 它也很容易使用内容分发网络来传输媒体流。 ======前提条件====== Nginx: http://nginx.org 模块:nginx_mod_h264_streaming(支持h264编码的视频) 模块:http_flv_module 支持flv 模块:http_mp4_module 支持mp4 下载地址: http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz https://github.com/arut/nginx-rtmp-module ======安装依赖包====== yum -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 ======安装相关工具包====== 1.安装git mkdir soft-source cd soft-source wget http://codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.xz xz -d git-latest.tar.xz tar xf git-latest.tar cd git-2016-03-29 autoconf ./configure make && make install git --version 2.zlib安装 wget http://zlib.net/zlib-1.2.8.tar.gz tar xf zlib-1.2.8.tar.gz cd zlib-1.2.8 ./configure make && make install 3.pcre安装 wget http://exim.mirror.fr/pcre/pcre-8.12.tar.gz tar xf pcre-8.12.tar.gz cd pcre-8.12 ./configure make && make install 4.yadmi安装 yadmi的作用是为flv文件添加关键帧,才能实现拖动播放 wget http://sourceforge.net/projects/yamdi/files/yamdi/1.4/yamdi-1.4.tar.gz/download tar xf yamdi-1.4.tar.gz cd yamdi-1.4 make && make install 5.OpenSSL安装 wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz tar xf openssl-1.0.1c.tar.gz ./config make && make install ======安装ffmpeg及其依赖包====== 1). Yasm wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz tar xf yasm-1.2.0.tar.gz cd yasm-1.2.0 ./configure make make install 2). x264 git clone git://git.videolan.org/x264 cd x264 ./configure --enable-shared make make install 3). LAME wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz tar xf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure --enable-nasm make make install 4). libogg wget http://downloads.xiph.org/releases/ogg/libogg-1.3.0.tar.gz tar xf libogg-1.3.0.tar.gz cd libogg-1.3.0 ./configure make make install 5). libvorbis wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.3.tar.gz tar xf libvorbis-1.3.3.tar.gz cd libvorbis-1.3.3 ./configure make make install 6). libvpx git clone https://github.com/Distrotech/libvpx.git cd libvpx ./configure --enable-shared make make install 7). FAAD2 wget http://downloads.sourceforge.net/project/faac/faad2-src/faad2-2.7/faad2-2.7.tar.gz tar xf faad2-2.7.tar.gz cd faad2-2.7 ./configure make make install 8). FAAC wget http://downloads.sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz tar xf faac-1.28.tar.gz cd faac-1.28 ./configure make make install 在make之前修改 vim +123 ./common/mp4v2/mpeg4ip.h 从123行开始修改此文件mpeg4ip.h,到129行结束。 修改前: #ifdef __cplusplus extern "C" { #endif char *strcasestr(const char *haystack, const char *needle); #ifdef __cplusplus } #endif 修改后: #ifdef __cplusplus extern "C++" { #endif const char *strcasestr(const char *haystack, const char *needle); #ifdef __cplusplus } #endif 9). Xvid wget http://downloads.xvid.org/downloads/xvidcore-1.3.2.tar.gz tar xf xvidcore-1.3.2.tar.gz cd xvidcore/build/generic ./configure make make install 10). ffmpeg git clone git://source.ffmpeg.org/ffmpeg cd ffmpeg ./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 make && make install 修改/etc/ld.so.conf如下: include ld.so.conf.d/*.conf /lib /lib64 /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 /opt/ffmpeg/lib # ldconfig ======安装Nginx相关模块====== <code> 1. 模块安装 wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz tar xf nginx_mod_h264_streaming-2.2.7.tar.gz git clone git://github.com/arut/nginx-rtmp-module.git 2. 创建用户和组 groupadd www useradd -g www www 3. nginx安装 wget http://nginx.org/download/nginx-1.6.0.tar.gz tar xf nginx-1.6.0.tar.gz cd nginx-1.6.0 4.编译安装nginx 在nginx-1.6.0目录下新建文件:nginx_configure.sh vim nginx_configure.sh #!/bin/sh echo "configure start ..." ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --add-module=../nginx_mod_h264_streaming-2.2.7 --with-pcre=../pcre-8.12 --with-zlib=../zlib-1.2.8 --with-http_dav_module --with-http_flv_module --with-http_stub_status_module --without-http_scgi_module --without-http_uwsgi_module --without-http_gzip_module --without-http_ssi_module --without-http_proxy_module --without-http_memcached_module --without-http_empty_gif_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_ssl_module --with-openssl=../openssl-1.0.1c --add-module=../nginx-rtmp-module --with-cc-opt=-I/opt/ffmpeg/include --with-ld-opt=‘-L/opt/ffmpeg/lib -Wl,-rpath=/opt/ffmpeg/lib‘ echo "configure end!" 【保存并退出】 chmod +x nginx_configure.sh ./nginx_configure.sh make && make install 备注: 在执行make的时候可能出现错误1: adding module in ../nginx_mod_h264_streaming-2.2.7 + ngx_http_h264_streaming_module was configured adding module in ../nginx-rtmp-module + ngx_rtmp_module was configured checking for OpenSSL library ... not found ./configure: error: SSL modules require the OpenSSL library. You can either do not enable the modules, or install the OpenSSL library into the system, or build the OpenSSL library statically from the source with nginx by using --with-openssl=<path> option. configure end! [email protected]:/home/song/nginx-t/nginx-1.6.0# make make: *** No rule to make target `build‘, needed by `default‘. Stop. 解决方法: a)可以安装ssl apt-get install openssl apt-get install libssl-dev b)也可以添加 --with-openssl=<path> 在执行make的时候可能出现错误2: /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; } 在执行make的时候可能出现错误3: ../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c: 在函数‘esds_read’中: ../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:377:16: 错误: 变量‘stream_priority’被设定但未被使用 [-Werror=unused-but-set-variable] ../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:376:12: 错误: 变量‘stream_id’被设定但未被使用 [-Werror=unused-but-set-variable] ../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c: 在函数‘stsd_parse_vide’中: ../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:529:22: 错误: 变量‘level_indication’被设定但未被使用 [-Werror=unused-but-set-variable] ../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:528:22: 错误: 变量‘profile_compatibility’被设定但未被使用 [-Werror=unused-but-set-variable] ../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:527:22: 错误: 变量‘profile_indication’被设定但未被使用 [-Werror=unused-but-set-variable] ../nginx_mod_h264_streaming-2.2.7/src/mp4_reader.c:526:22: 错误: 变量‘configuration_version’被设定但未被使用 [-Werror=unused-but-set-variable] cc1: all warnings being treated as errors make[1]: *** [objs/addon/src/mp4_reader.o] 错误 1 解决方法: # vim objs/Makefile (修改objs/Makefile文件, 去掉其中的"-Werror"), 然后就能够正常编译了. 然后在make就能过了。 ======配置Nginx相关模块====== 1. 安装好了之后终端进入 nginx安装的目录 : /usr/local/nginx/html/ 然后新建目录:nginx-rtmp-module 然后拷贝 之前用于存放下载 nginx 所需资源包的目录 :/root/nginx/nginx-rtmp-module/ 拷贝 目录 test 到/usr/local/nginx/html/ 目录下: cp /root/nginx-rtmp-module/test /usr/local/nginx/html/nginx-rtmp-module/ cp /root/nginx-rtmp-module/stat.xsl /usr/local/nginx/html/nginx-rtmp-module/ 2. 拷贝之后就需要修改 /usr/local/nginx/nginx.conf 文件: 下面是配置好的nginx.conf 文件: #user nobody; worker_processes 4; #error_log logs/error.log; #error_log logs/error.log notice; error_log logs/error.log info; pid logs/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } #切换自动推送(多 worker 直播流)模式。默认为 off rtmp_auto_push on; #当 worker 被干掉时设置自动推送连接超时时间。默认为 100 毫秒 rtmp_auto_push_reconnect 1s; #设置用于流推送的 UNIX 域套接字目录。默认为 /tmp #rtmp_socket_dir /var/sock; rtmp { server { listen 1935; #点播配置 application vod { play /opt/media/nginxrtmp/flv; } #直播流配置 application live { live on; #为 rtmp 引擎设置最大连接数。默认为 off max_connections 1024; # default recorder record all; record_path /var/rec; recorder audio { record audio; record_suffix -%d-%b-%y-%T.flv; } recorder chunked { record all; record_interval 15s; record_path /var/rec/chunked; } #on_publish http://localhost:8080/publish; #on_play http://localhost:8080/play; #on_record_done http://localhost:8080/record_done; #rtmp日志设置 #access_log logs/rtmp_access.log new; #access_log logs/rtmp_access.log; #access_log off; } #HLS协议支持 #application hls { #live on; #hls on; #hls_path /tmp/app; #hls_fragment 5s; #} application hls{ live on; hls on; hls_path /usr/local/nginx/html/app; hls_fragment 1s; } } } 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; } # 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; #} location /rtmp-publisher { root /root/nginx/nginx-rtmp-module/test; } #location /hls { #server hls fragments #types{ #application/vnd.apple.mpegurl m3u8; #video/mp2t ts; #} #alias /usr/local/nginx/html; #expires -1; #} location /hls { #server hls fragments types{ application/vnd.apple.mpegurl m3u8; video/mp2t ts; } #alias /usr/local/nginx/html/app; alias /usr/local/nginx/html; expires -2; } location / { #root /root/nginx/nginx-rtmp-module/test/rtmp-publisher; types{ application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /usr/local/nginx/html/rtmp-publisher; expires -1; } } # 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; # server_name localhost; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_timeout 5m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} #支持flv server { listen 8081; server_name localhost; #root /opt/pub/media/nginx; #http协议时候,flv视频位置 #root /root/nginx/nginx-rtmp-module/test/www; root /usr/local/nginx/html/www; location ~ .*.(flv|swf|mp4|wma|wmv)$ { valid_referers none blocked *.xxxx.com http://localhost; if ($invalid_referer) { return 403; } } location ~ \.flv$ { flv; #limit_conn one 20;#限制客户端并发连接数 limit_rate 200k;#限制每客户端最大带宽 } location ~ \.mp4$ { flv; #limit_conn one 20; limit_rate 200k; } #access_log logs/nginxflv_access.log main; } server { listen 8082; server_name localhost; index index.html; location / { #root /opt/pub/media/nginx-rtmp; root /root/nginx/nginx-rtmp-module/test/rtmp-publisher; } #access_log logs/nginxrtmpflv_access.log main; } server { listen 8080; server_name localhost; index player.html; location /stat { rtmp_stat all; rtmp_stat_stylesheet /root/nginx/nginx-rtmp-module/stat.xsl; } location /stat.xsl { root /root/nginx/nginx-rtmp-module; } location /rtmp-publisher { root /usr/local/nginx/html/test/rtmp-publisher; } location / { root /root/nginx/nginx-rtmp-module/test/rtmp-publisher; } } } 推流使用OBS进行推流 rtmp://192.168.15.3/live/ 流秘钥:stream 客户端使用VLC进行观看 rtmp://192.168.15.3/live/stream
时间: 2024-10-18 08:52:41