一.开发环境
Nginx地址: http://nginx.org/download/nginx-1.14.2.tar.gz
Nginx-rtmp-module地址: https://github.com/arut/nginx-rtmp-module
二.执行安装命令
备份nginx原文件
cp /usr/local/openresty/nginx/sbin/nginx /usr/local/openresty/nginx/sbin/nginx.bak.201812.1.rtmp
下载模块并解压:
cd /thirdparties
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip unzip master.zip
添加模块并编译openresty(注意:重新编译的时候,记得一定要把以前编译过的模块一同加到configure参数里面)
查看原来的模块
/usr/local/openresty/nginx/sbin/nginx -V
cd /thirdparties/openresty-1.11.2.2 ./configure --prefix=/usr/local/openresty --add-module=/thirdparties/nginx-rtmp-module-master --with-http_ssl_module
make
停止nginx
/usr/local/openresty/nginx/sbin/nginx -s stop
备份nginx原文件
mv /usr/local/openresty/nginx/sbin/nginx /usr/local/openresty/nginx/sbin/nginx.bak.201812.origin.rtmp
将编译后的nginx文件覆盖原文件并重启nginx
cp /thirdparties/openresty-1.11.2.2/build/nginx-1.11.2/objs/nginx /usr/local/openresty/nginx/sbin
/usr/local/openresty/nginx/sbin/nginx
查看module是否已经加入到nginx
/usr/local/openresty/nginx/sbin/nginx -V
三.nginx的配置
在添加完模块后nginx的配置文件( /usr/local/nginx/conf/nginx.config)中要增加对rtmp的配置
与http {... ...}同级的地方配置rtmp
events {
use epoll;
worker_connections 1024;
}
#RTMP服务 rtmp { server { listen 1935; #//服务端口 chunk_size 4096; #//数据传输块的大小 application vod { play /opt/video; #//视频文件存放位置。 } #直播 application live{ live on; record off; #on时将流转换成flv视频文件 #record all; record_path /opt/video/hls; #record_max_size 50M; record_max_size 2M;
notify_method get;#鉴权
on_publish http://localhost:8081/chat_auth;#鉴权
hls on; #这个参数把直播服务器改造成实时回放服务器。 wait_key on; #对视频切片进行保护,这样就不会产生马赛克了 hls_path /opt/video/hls; #切片视频文件存放位置 hls_fragment 600s; #设置HLS片段长度 hls_playlist_length 1m; #设置HLS播放列表长度,这里设置的是10分钟 hls_continuous on; #连续模式 hls_cleanup on; #对多余的切片进行删除 hls_nested on; #嵌套模式 allow play all; } } }
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 8081; server_name rtmp_server; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /chat_auth { proxy_pass https://api.xxxx.com/item_chat_api/v1/account/platform/auth; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #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; #} } # 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; # } #} }
注意:
1. 如果不存在文件夹“/opt/video”、“/opt/video/hls”则要创建一个,并且要改成可读可写的权限(chmod 777 /opt/video)
2. 防火墙是否通:
iptables -I INPUT -p tcp -m state --state NEW --dport 1935 -j ACCEPT #放行1935端口的 NEW状态请求 service iptables save #保存规则 service iptables restart #重启防火墙保证新的规则加载进来
参考:
https://blog.csdn.net/qzcsu/article/details/72782759
https://blog.csdn.net/qq_36510261/article/details/78971387
https://blog.csdn.net/zhiyuan_2007/article/details/52003713
https://www.cnblogs.com/lidabo/p/7099501.html
java代码鉴权:
@ResponseBody() @RequestMapping(value="/auth", method={RequestMethod.GET,RequestMethod.POST}) public void auth(HttpServletRequest request, HttpServletResponse response, @RequestParam(required = true)String auth_key, @RequestParam(required = false) String jsonpcallback) { //openId$userId$orderId logger.info("auth auth_key:{}",auth_key); RpcResponseDTO<Boolean> rpcResult = new RpcResponseDTO<>(); String fail= "{\"code\":\"500\",\"detail\":\"sys error\"}"; String succ= "{\"code\":\"200\",\"detail\":\"SUCCESS\"}"; String result = fail; if (StringUtils.isEmpty(auth_key)) { response.setStatus(500); }else { String[] auth = auth_key.split("\\$"); logger.info("auth auth[0]:{},auth[1]:{},auth[2]:{}",auth[0],auth[1],auth[2]); if (auth.length!=3) { response.setStatus(500); }else { RtmpAuthParam param = new RtmpAuthParam(); param.setOpenId(auth[0]); param.setUserId(Long.parseLong(auth[1])); param.setOrderId(Long.parseLong(auth[2])); rpcResult = platformAccountRpcService.validateRtmpAuth(Request.build(param)); logger.info("auth rpcResult:{}",JsonHelper.getJSONString(rpcResult)); if (!rpcResult.hasError()&&rpcResult.getPayload()!=null&&rpcResult.getPayload()) { response.setStatus(200); result = succ; }else { response.setStatus(500); } } } logger.info("auth result:{}",result); SpringMVCHelper.renderText(response,result); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步