1 Star 43 Fork 10

xianyu_java / easystream

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 8.32 KB
一键复制 编辑 原始数据 按行查看 历史
xianyu_java 提交于 2020-09-21 17:15 . 1

EASYSTREAM FOR SPRINGBOOT

JDK License

easystream - 简单的rtsp转rtmp,hlv,hls播放流框架

项目介绍:

easystream是一个对海康大华rtsp二次封装转换为web直播流的框架。
利用nginx实现rtmp、hlv、hls格式播放视频。windows下编译过的nginx请项目中下载,Linux下需动态编译需要欢迎索取。

easystream配置加到application.yml

easystream:
  #对应推送的nginx服务地址
  push_host: 192.168.200.2
  #直播流保活时间(分钟)
  keepalive: 1
  #额外推送地址
  host_extra: 127.0.0.1
  #nginx推送端口
  push_port: 1935
  #主码流最大码率
  main_code: 5120
  #子码流最大码率
  sub_code: 1024
  #1nvr,2,合成服务
  rtsptype: 1
  #nginx视频流访问端口
  access_port: 8085

极速开始

以下例子基于Spring Boot

第一步:添加Maven依赖

直接添加以下maven依赖即可

<dependency>
    <groupId>com.github.xianyujava</groupId>
     <artifactId>easystream-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>

第二步:扫描接口

在Spring Boot的配置类或者启动类上加上@EasystreamScan注解

@SpringBootApplication
@Configuration
@EasystreamScan
public class MyApplication {
  public static void main(String[] args) {
      SpringApplication.run(MyApplication.class, args);
   }
}

第三步:调用接口

OK,我们可以愉快地调用接口了

// 注入接口实例
@Autowired
private EasysteamService easysteamService;
...

开启视频流

/**
 * CameraPojo 实体属性 
 *  private String username = "";// 摄像头账号
    private String password = "";// 摄像头密码
    private String ip = "";// 摄像头ip
    private String port = "8000";
    private String channel = "";// 摄像头通道
    private String stream = "1";// 摄像头码流 1主码流,2子码流
    private String rtsp = "";// 返回的rtsp地址
    private String rtmp = "";// 返回的rtmp地址
    private String url = "";// 返回的hlv播放地址
    private String startTime = "";// 回放开始时间,回放时候才要赋值
    private String endTime = "";// 回放结束时间,回放时候才要赋值
    private String openTime = "";// 打开时间
    private int count = 0;// 默认使用人数
    private String token = "";//直播和回放必须指定一个唯一标志
    private String hls = "";//返回hls播放
    private String type="";//默认空为合成视频,0:nvr,1:ipc
********************************************

    方法传入参数pojo实体必须赋值如下参数
        username = "";// 摄像头账号
        password = "";// 摄像头密码
        ip = "";// 摄像头ip
        port = "8000";
        channel = "";// 摄像头通道
        token = "";//直播和回放必须指定一个唯一标志
        type="";//默认空为合成视频,0:nvr,1:ipc
********************************************
    当打开回放流必须传入
        startTime = "";// 回放开始时间,回放时候才要赋值
        endTime = "";// 回放结束时间,回放时候才要赋值
********************************************    
    方法返回result 为CameraPojo的json字符串,其中播放地址回返回在其中
        rtsp = "";// 返回的rtsp地址
        rtmp = "";// 返回的rtmp地址
        url = "";// 返回的hlv播放地址
        hls = "";//返回hls播放
 */
String result = easysteamService.openCamera(CameraPojo pojo);

关闭直播视频流

/**
 * tokens为打开视频流的时的token,多个用逗号分隔;例如1,3
 */
String result = easysteamService.closeCamera(String tokens);

关闭回放视频流

/**
 * tokens为打开视频流的时的token,多个用逗号分隔;例如1,3
 */
String result = easysteamService.closeHistoryCamera(String tokens);

视频流保活,定时调用此方法否则超时会停止转码流

/**
 * tokens为打开视频流的时的token,多个用逗号分隔;例如1,3
 */
String result = easysteamService.keepAlive(String tokens);

视频回放流保活,定时调用此方法否则超时会停止转码流

/**
 * tokens为打开视频流的时的token,多个用逗号分隔;例如1,3
 */
String result = easysteamService.keepPlayBackAlive(String tokens);

前端页面播样例:这里用了flv.js库

<script src="../../lib/media/flv1.5.js"></script>

<video id="video_3"  autoplay="autoplay" height="100%" width="100%"></video>
function playvidoe(param, timer,id) {
  
    $.ajax({
        type: 'POST',
        url: '/nslcloud/rtmp/cameras',
        dataType: 'json',
        data: {
            'ip': param.videoip,
            'port': param.videoport,
            'username': param.username,
            'password': param.password,
            'channel': param.monitortdh,
            'type': param.type,
            'token': param.videoid,
            'kcdm' : param.kcdm
        },
        success: function (json) {
            //json=JSON.parse(json)
            //alert(json.url);
            var ieversion = IEVersion();
            if (json.url != '') {
                //if (flvjs.isSupported()) {
                if (ieversion == 99) {
                    var videoElement = document.getElementById('video_' + id);
                    var flvPlayer = flvjs.createPlayer({
                        type: 'flv',
                        //height:'1040px',
                        url: json.url
                    });

                    flvPlayer.attachMediaElement(videoElement);
                    flvPlayer.load();
                    flvPlayer.play();
                    //flvid[id] = flvPlayer;
                    flvid.put(id, flvPlayer);
                    kcdms.put(id,param);
                } else {
                    videojs('video_' + id).ready(
                        function () {
                            //alert("1111");
                            var myPlayer5 = this;
                            myPlayer5.src({type: "rtmp/flv", src: json.rtmp});
                            myPlayer5.load(json.rtmp);
                            //myPlayer5.src({type: "rtmp/flv", src: json.hls});
                            //myPlayer5.load(json.hls);
                            myPlayer5.play();
                            this.on('play', function () {//开始播放
                                //flvid[id] = myPlayer5;
                                flvid.put(id, myPlayer5);
                                kcdms.put(id,param);
                            });
                        }
                    );
                }

                var interval = setInterval(function () {
                    $.ajax({
                        type: 'POST',
                        url: '/nslcloud/rtmp/keepAlive',
                        dataType: 'json',
                        traditional: true,//这里设置为true
                        headers: {
                            'Authorization': sessionStorage.getItem('Authorization')
                        },
                        data: {
                            'tokens': param.videoid,
                            'kcdm' : param.kcdm
                        }, success: function (json) {

                        }
                    });
                }, 10000, 3000);
                if (timer.containsKey(id)) {
                    clearInterval(timer.get(id));
                    timer.remove(id);
                }
                //timer[id] = interval;
                timer.put(id, interval);
                // }
            } else {

                alert("无视频源!");
            }
        },
        error: function (data) {
            alert("请求错误!");
        }
    });

}

联系作者:

亲,进群前记得先star一下哦~

项目协议

The MIT License (MIT)

Copyright (c) 2020 jian yu

Java
1
https://gitee.com/null_166_0518/easystream.git
git@gitee.com:null_166_0518/easystream.git
null_166_0518
easystream
easystream
master

搜索帮助