# easystream **Repository Path**: sunjiyun26/easystream ## Basic Information - **Project Name**: easystream - **Description**: rtsp转rtmp,hlv,hls播放流框架 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 15 - **Created**: 2024-08-19 - **Last Updated**: 2024-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

EASYSTREAM FOR SPRINGBOOT

JDK License

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

项目介绍: ------------------------------------- easystream是一个对海康大华rtsp二次封装转换为web直播流的框架。
利用nginx实现rtmp、hlv、hls格式播放视频。windows下编译过的nginx请项目中下载,Linux下需动态编译需要欢迎索取。 easystream配置加到application.yml ----- ```xml 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依赖即可 ```xml com.github.xianyujava easystream-spring-boot-starter 1.1.1 ``` ### 第二步:扫描接口 在Spring Boot的配置类或者启动类上加上`@EasystreamScan`注解 ```java @SpringBootApplication @Configuration @EasystreamScan public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } ``` ### 第三步:调用接口 OK,我们可以愉快地调用接口了 ```java // 注入接口实例 @Autowired private EasysteamService easysteamService; ... ``` ## 开启视频流 ```java /** * 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); ``` ## 关闭直播视频流 ```java /** * tokens为打开视频流的时的token,多个用逗号分隔;例如1,3 */ String result = easysteamService.closeCamera(String tokens); ``` ## 关闭回放视频流 ```java /** * tokens为打开视频流的时的token,多个用逗号分隔;例如1,3 */ String result = easysteamService.closeHistoryCamera(String tokens); ``` ## 视频流保活,定时调用此方法否则超时会停止转码流 ```java /** * tokens为打开视频流的时的token,多个用逗号分隔;例如1,3 */ String result = easysteamService.keepAlive(String tokens); ``` ## 视频回放流保活,定时调用此方法否则超时会停止转码流 ```java /** * tokens为打开视频流的时的token,多个用逗号分隔;例如1,3 */ String result = easysteamService.keepPlayBackAlive(String tokens); ``` ### 前端页面播样例:这里用了flv.js库 ```java ``` ```java 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