nginx+rtmp的流媒体服务器及用java对推流权限验证

参考搭建文档地址: https://www.cnblogs.com/suiyuewuxin/p/7256972.html

一、nginx安装环境

         nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境。

  1. gcc

       安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:

  1. 在线安装yum install gcc-c++  这种是可以访问外网的才可以安装
  2. 查看命令:gcc –version,出现下图则已经安装过
  3. PCRE

         PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。

  1. 在线安装  yum install -y pcre pcre-devel  命令,可以访问外网才可以这样安装
  2. 在内网安装方式

去该网站下载相应的安装包

https://ftp.pcre.org/pub/pcre/

注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。

  1. zlib

         zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。

  1. 在线安装  yum install -y zlib zlib-devel 命令,可以访问外网才可以这样安装
  2. 在内网安装方法

去该网站下载安装包

http://www.zlib.net/fossils

  1. openssl

         OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

         nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。

  1. 在线安装  yum install -y openssl openssl-devel 命令,可以访问外网才可以这样安装
  2. 在内网安装方法

去该网站下载安装包

离线安装步骤: https://blog.csdn.net/WuXianYuYongHeng/article/details/53781657

二、搭建nginx流服务器

1、将nginx-1.8 和nginx-rtmp-module 上传到服务器

2、nginx-rtmp-module上传到安装nginx的目录

3、Nginx-1.8上传  再解压到安装nginx的目录 tar –zxvf nginx-1.8.0.tar.gz –C/home/admin/local

4、再进去解压后的nginx-1.8目录

cd nginx-1.8.0 

5、首次安装nginx,先安装 configure

configure

./configure --help查询详细参数(参考本教程附录部分:nginx编译参数)

参数设置如下:

./configure \

--prefix=/home/admin/local/nginx \  

--pid-path=/home/admin/local/nginx/logs/nginx.pid \

--lock-path=/home/admin/local/nginx/lock/nginx.lock \

--error-log-path=/home/admin/local/nginx/logs/error.log \

--http-log-path=/home/admin/local/nginx/logs/access.log \

--with-http_gzip_static_module \

--http-client-body-temp-path=/home/admin/local/client \

--http-proxy-temp-path=/home/admin/local/nginx/proxy \

--http-fastcgi-temp-path=/home/admin/local/nginx/fastcgi \

--http-uwsgi-temp-path=/home/admin/local/nginx/uwsgi \

--http-scgi-temp-path=/home/admin/local/nginx/scgi

遇到的错误

./configure: error: the HTTP rewrite module requires the PCRE library.

You can either disable the module by using --without-http_rewrite_module

option, or install the PCRE library into the system, or build the PCRE library

statically from the source with nginx by using --with-pcre=<path> option.

安装:

yum -y install pcre-devel  遇到的错误 则需要安装

pcre-devel-8.32-17.el7.x86_64: [Errno 256] No more mirrors to try.

根据系统的版本查询对应的版本安装

http://rpmfind.net/linux/rpm2html/search.php?query=pcre-devel

 

安装命令: rpm -i pcre-devel-7.8-7.el6.x86_64.rpm

6、再执行 make 命令

7、再执行 make install 命令

8、再执行命令:

./configure --prefix=/home/admin/local/nginx --add-module=/home/admin/local/nginx-rtmp-module  --with-http_ssl_module

查看一下是否添加了nginx-rtmp-module

5、再执行 make 命令

6、再执行 make install 命令

7、修改: nginx/conf目录下的 nginx.conf配置文件内容

rtmp {
    server {
        listen 1935;
        chunk_size 8192;
        application live {
            live on;
            #开始推流回调,url地址为java接口 
            on_publish http://localhost:8089/vin/auth;
        }

       #hls配置
        application hls {
            live on;
            hls on;
            hls_path /home/admin/local/nginx/hls;  #存放流视频的文件夹
            #开始推流回调,url地址为java接口
            #on_publish http://localhost:8089/cloudLive/vin/auth;
            #推流停止回调,url地址为java接口
            #on_done http://localhost:8089/cloudLive/vin/auth;
        }

        #rtmp日志设置
        access_log logs/rtmp_access.log ;
    }
}

关于推流的日志:详询说明地址:https://github.com/arut/nginx-rtmp-module/wiki/Directives#access-log

访问日志

语法:access_log off|path [format_name]
Context:rtmp,server,application

设置访问日志参数。默认情况下会启用日志记录。关闭它使用access_log off指令。默认情况下,访问日志记录与HTTP访问记录器(logs/access.log)完成相同的文件。您可以在access_log指令中指定另一个日志文件路径。第二个参数是可选的。它可用于按名称指定日志记录格式。log_format有关格式的更多详细信息,请参阅指

log_format new '$remote_addr';
access_log logs/rtmp_access.log new;
access_log logs/rtmp_access.log;
access_log off;

log_format

语法:log_format format_name format
Context:rtmp

创建命名日志格式。日志格式与nginx HTTP日志格式非常相似。日志格式支持几个变量:

  • connection - 连接号码
  • remote_addr - 客户地址
  • app - 应用名称
  • name - 最后一个流名称
  • args - 最后一个流播放/发布参数
  • flashver - 客户端flashVer
  • swfurl - 客户端swfUrl
  • tcurl - 客户tcUrl
  • pageurl - 客户端页面.Url
  • command-播放/发布客户机发送命令:NONEPLAYPUBLISHPLAY+PUBLISH
  • bytes_sent - 发送到客户端的字节数
  • bytes_received - 从客户端收到的字节数
  • time_local - 客户端连接结束时的本地时间
  • session_time - 连接持续时间(秒)
  • session_readable_time - 人类可读格式的连接持续时间
  • msec - SEC.MSEC格式的当前unix时间戳

默认日志格式具有名称combined。这是这种格式的定义

$remote_addr [$time_local] $command "$app" "$name" "$args" - 
$bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time)

8、进入 nginx的sbin目录执行命令 ./nginx -c /home/admin/local/nginx/conf/nginx.conf

 

再启动nginx

 ./nginx

 

退出nginx

./nginx  -s quit

-------------------------------------------------------------------------------------------------------------------------

以上是服务器的配置

两种后台验证方式,第一种是推流url带参数方式实现

二、编写后台java代码,使用springboot框架写的后台。 

@Controller
@RequestMapping(value = "/vin")
public class AuthController {
    
    @RequestMapping(value = "/auth", method = RequestMethod.POST)
    @ResponseBody
    public String hello(String vin, HttpServletRequest request,HttpServletResponse response) {
        System.out.println("vin="+ vin);
        if(vin.equals("1234567890")){
            System.out.println("返回编号为200");
            return "{\"code\":\"200\",\"detail\":\"SUCCESS\"}";
            }else{
            response.setStatus(500);
            System.out.println("返回编号为500");
            return "{\"code\":\"500\",\"detail\":\"auth error\"}";
            }
            
        }
}

这样你推流的时候就会先进入验证的方法如果不成功就回返回500断开连接,成功则返回200可以继续直播,如果不想验证的话就把on_publish去掉就可以了

三、再使用ffmpeg推流

可以参考的地址:https://www.jianshu.com/p/eacfc0a9f2fd  感谢这位博主的文章

使用ffmpeg将视频转成流资源命令:

ffmpeg -re -i orange.mp4 -vcodec libx264 -acodec aac -f flv rtmp://10.9.160.147:1935/live/home?vin=1234567890

 

已经在推流

看java后台输出,说明验证成功

拉流使用VLC

 

观看视频流程

 

 

第二种是 我这边项目要求是,手机端调用后台生成推流地址,如:rtmp://10.9.160.147:1935/live/1234567890,其中1234567890可以用uuid生成,这样每次推流地址都不一样,有效防止推流地址固定,摄像头就推流到这个地址,通过下面java验证是最好的方法。有效验证方式:生成的推流地址uuid为1234567890,我们存入缓存如redis和数据库中,摄像头那边推流,我们通过服务配置 on_publish参数,获取推流参数与缓存如redis和数据库的值,做比较是否存在,存在则验证通过成功,不存在则推送失败。

二、编写后台java代码,使用springboot框架写的后台。 

@Controller
@RequestMapping(value = "/vin")
public class AuthController {
    
    @RequestMapping(value = "/auth", method = RequestMethod.POST)
    @ResponseBody
    public String hello(HttpServletRequest request,HttpServletResponse response) {
        String name = request.getParameter("name");
        System.out.println("name:"+name);
        if(name.equals("1234567890")){
            System.out.println("返回编号为200");
            return "{\"code\":\"200\",\"detail\":\"SUCCESS\"}"; // 流媒体服务器认证通过必须返回200 流媒体服务器才可以继续推流
            }else{
            response.setStatus(500);
            System.out.println("返回编号为500");
            return "{\"code\":\"500\",\"detail\":\"auth error\"}";
            }
       

    }
}

这样你推流的时候就会先进入验证的方法如果不成功就回返回500断开连接,成功则返回200可以继续直播,如果不想验证的话就把on_publish去掉就可以了

三、再使用ffmpeg推流

可以参考的地址:https://www.jianshu.com/p/eacfc0a9f2fd  感谢这位博主的文章

使用ffmpeg将视频转成流资源命令:

切换到D盘的live目录,里面有orange.mp4视频资源,再执行命令,如下图。

ffmpeg -re -i orange.mp4 -vcodec libx264 -acodec aac -f flv rtmp://10.9.160.147:1935/live/1234567890

执行命令:如下意见在推流了

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值