一.开发环境

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

 

 

posted on 2018-12-20 13:01  拥抱天空的风  阅读(2700)  评论(0编辑  收藏  举报