zoukankan      html  css  js  c++  java
  • Nginx与Nginx-rtmp-module搭建RTMP视频直播和点播服务器

    一.开发环境

      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);
        }

  • 相关阅读:
    js 检测浏览器
    js获取url参数
    js 使用Math函数取得数组最大最少值
    js 取一定范围内的整数
    遍历文件夹内所有文件
    'weinre' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决方案
    解决图片缓存导致页面刷新无效果问题
    JAVA中的几种基本数据类型是什么,各自占用多少字节
    Mac终端git,svn提交代码步骤
    小程序分享链接功能
  • 原文地址:https://www.cnblogs.com/bluesky-yuan/p/10148700.html
Copyright © 2011-2022 走看看