whycxzp
2025-01-09 82258b502bb39bd7621617d79c59d2973fd4b378
摄像头视频流相关接口
9个文件已修改
4个文件已添加
624 ■■■■ 已修改文件
src/main/java/com/whyc/config/StaticResourceConfig.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/constant/YamlProperties.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/VideoController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/Mp4FileDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/Response4Http.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/listener/ApplicationListener.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/schedule/VideoScheduleService.java 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/VideoService.java 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/FileUtil.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/HttpUtil.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/config/application-dev.yml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/config/application-prod.yml 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/config/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/config/StaticResourceConfig.java
@@ -27,6 +27,8 @@
        //这个是可行的,解析的时候path为*.html,校验路径admin下是否存在
        registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/");
        //录像视频mp4文件路径转为http url
        registry.addResourceHandler("/video/**").addResourceLocations("file:/battery_system/video_system/ZLMediaKit/www/record/rtp/");
        super.addResourceHandlers(registry);
    }
src/main/java/com/whyc/constant/YamlProperties.java
@@ -3,6 +3,8 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * Yaml配置参数 实体类
 */
@@ -56,6 +58,8 @@
    public static String publicKey;
    public static String privateKey;
    public static List<String> videoStreamIds;
    @Value("${custom.rsa.publicKey}")
    public void setPublicKey(String publicKey) {
@@ -172,6 +176,8 @@
    public void setFtpPassword(String ftpPassword){
        YamlProperties.ftpPassword=ftpPassword;
    }*/
    @Value("${video.streamIds}")
    public void setVideoStreamIds(List<String> videoStreamIds) {
        YamlProperties.videoStreamIds = videoStreamIds;
    }
}
src/main/java/com/whyc/controller/VideoController.java
@@ -1,14 +1,22 @@
package com.whyc.controller;
import com.whyc.dto.Response;
import com.whyc.dto.Response4Http;
import com.whyc.service.VideoService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * 摄像头的存储逻辑分为如下步骤:
 * 1.程序启动时,获取所有的视频流id,并openRtpServer来开启流,执行startRecord来启动录制,自动1个小时保存一次录像.
 * 2.录像的保存路径映射到http url中,可通过http获取mp4
 * 3.每秒钟检测所有的视频流 是否 开启状态是否异常,如果异常,重新开启流
 */
@RestController
@RequestMapping("video")
@Api(tags = "摄像头视频")
@@ -17,21 +25,24 @@
    @Autowired
    private VideoService service;
    @RequestMapping("getVideoStreamIds")
    public Response<List> getVideoStreamIds() {
        List<String> videoStreamIds = service.getVideoStreamIds();
        return new Response<List>().set(1, videoStreamIds, "获取摄像头视频流成功");
    @GetMapping("getVideoStreamIds")
    public Response4Http getVideoStreamIds() {
        return service.getVideoStreamIds();
    }
    @RequestMapping("startRecord")
    public Response<String> startRecord(String streamId) {
        service.startRecord(streamId);
        return new Response<String>().set(1, "开始录制视频流成功");
    @GetMapping("startRecord")
    public Response4Http startRecord(String streamId) {
        return service.startRecord(streamId);
    }
    @RequestMapping("stopRecord")
    public Response<String> stopRecord(String streamId) {
        service.stopRecord(streamId);
        return new Response<String>().set(1, "停止录制视频流成功");
    @GetMapping("stopRecord")
    public Response4Http<String> stopRecord(String streamId) {
        return service.stopRecord(streamId);
    }
    @GetMapping("getMp4RecordFile")
    public Response4Http<String> getMp4RecordFile(String streamId,String period){
        return service.getMp4RecordFile(streamId,period);
    }
}
src/main/java/com/whyc/dto/Mp4FileDTO.java
New file
@@ -0,0 +1,25 @@
package com.whyc.dto;
import java.util.List;
public class Mp4FileDTO {
    private List<String> paths;
    private String rootPath;
    public List<String> getPaths() {
        return paths;
    }
    public void setPaths(List<String> paths) {
        this.paths = paths;
    }
    public String getRootPath() {
        return rootPath;
    }
    public void setRootPath(String rootPath) {
        this.rootPath = rootPath;
    }
}
src/main/java/com/whyc/dto/Response4Http.java
New file
@@ -0,0 +1,112 @@
package com.whyc.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.ToString;
import java.io.Serializable;
/**
 * 视频api接口数据响应对象
 */
@ApiModel
@ToString
public class Response4Http<T> implements Serializable {
    private Integer code;
    @ApiModelProperty
    private T data;
    private T data2;
    private String msg;
    private Boolean status;
    private Boolean result;
    public Response4Http<T> setCode(Integer code) {
        this.code = code;
        return this;
    }
    public Response4Http<T> setData(T data) {
        this.data = data;
        return this;
    }
    public Response4Http<T> set(Integer code, T data) {
        this.code = code;
        this.data = data;
        return this;
    }
    public Response4Http<T> set(Integer code, T data, String msg) {
        this.code = code;
        this.data = data;
        this.msg = msg;
        return this;
    }
    public Response4Http<T> set(Integer code) {
        this.code = code;
        return this;
    }
    public Response4Http<T> setII(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
        return this;
    }
    public Response4Http<T> setII(Integer code, T data, T data2, String msg) {
        this.code = code;
        this.msg = msg;
        this.data = data;
        this.data2 = data2;
        return this;
    }
    public Response4Http setStatus(int code, T data, Boolean status) {
        this.code = code;
        this.data = data;
        this.status = status;
        return this;
    }
    public Integer getCode() {
        return code;
    }
    public T getData() {
        return data;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public T getData2() {
        return data2;
    }
    public void setData2(T data2) {
        this.data2 = data2;
    }
    public Boolean getStatus() {
        return status;
    }
    public void setStatus(Boolean status) {
        this.status = status;
    }
    public Boolean getResult() {
        return result;
    }
    public void setResult(Boolean result) {
        this.result = result;
    }
}
src/main/java/com/whyc/listener/ApplicationListener.java
New file
@@ -0,0 +1,67 @@
//package com.whyc.listener;
//
//import com.whyc.constant.YamlProperties;
//import com.whyc.dto.Response;
//import com.whyc.service.VideoService;
//import org.springframework.beans.factory.annotation.Autowired;
//
//import javax.servlet.ServletContext;
//import javax.servlet.ServletContextEvent;
//import javax.servlet.ServletContextListener;
//import javax.servlet.annotation.WebListener;
//import java.util.List;
//
//import static java.lang.Thread.sleep;
//
///**
// * 应用启动时初始化
// * 应用关闭时销毁
// */
//@WebListener
//public class ApplicationListener implements ServletContextListener {
//
//    @Autowired
//    private VideoService videoService;
//
//    /**
//     * 1.初始化,开启视频流并启动录像存储
//     * @param servletContextEvent
//     */
//    @Override
//    public void contextInitialized(ServletContextEvent servletContextEvent) {
//        ServletContext application = servletContextEvent.getServletContext();
//        //考虑意外情况:突然程序死机或者电脑断电重启,需要延时启动录像,因为视频推流服务还未完成.
//        try {
//            //延时20s
//            sleep(20000);
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
//
//
//        //1.录像存储
//        //获取所有的流id
//        List<String> videoStreamIds = YamlProperties.videoStreamIds;
//        //开启录像存储
//        videoStreamIds.forEach(streamId -> {
//            //添加流
//            Response<String> response = videoService.addStreamProxy(streamId);
//
//            //TODO 判断是否在录像,不在的话,开启录像
//
//            Response response2 = videoService.startRecord(streamId);
//            if(!(response2.getCode() ==1 && ((boolean) response2.getData()))){
//                System.out.println("流id为:"+streamId+"的信息:"+response2.getMsg());
//            }else{
//                System.out.println("流id为:"+streamId+"的信息:"+response2.getData());
//            }
//        });
//
//    }
//
//    @Override
//    public void contextDestroyed(ServletContextEvent servletContextEvent) {
//        //关闭所有流
//        //videoService.closeStreams();
//    }
//}
src/main/java/com/whyc/schedule/VideoScheduleService.java
@@ -1,11 +1,23 @@
package com.whyc.schedule;
import com.whyc.constant.YamlProperties;
import com.whyc.dto.Response;
import com.whyc.dto.Response4Http;
import com.whyc.factory.ThreadPoolExecutorFactory;
import com.whyc.service.VideoService;
import com.whyc.util.DateUtil;
import com.whyc.util.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@EnableScheduling
@Component
@@ -14,19 +26,71 @@
    @Autowired
    private VideoService service;
    /**凌晨0点执行一次,录制视频流*/
    @Scheduled(cron = "0 0 0 * * ? ")
    public void getAndSaveB247(){
    /**
     * 1.监控录制,频次为2s.
     * 2.视频录制的判断逻辑是:
     *  是否存在流
     *  是否在录制
     * 3.考虑意外情况:突然程序死机或者电脑断电重启,需要延时启动录像,因为视频推流服务还未完成,延时20s开始检测
     *
     * */
    //@Scheduled(cron = "0/2 * * * * ? ")
    @Scheduled(fixedRate = 2000,initialDelay = 20000)
    public void startRecordAndCheck(){
        ThreadPoolExecutorFactory.getPoolExecutor().execute(()->{
            //service.getAndSaveB247();
            List<String> videoStreamIds = YamlProperties.videoStreamIds;
            Response4Http streamIdsOnlineRes = service.getVideoStreamIds();
            List<String> streamIdsOnline = (List<String>) streamIdsOnlineRes.getData2()==null?new ArrayList<>():(List<String>) streamIdsOnlineRes.getData2();
            if(streamIdsOnlineRes.getCode() == 1 && ((boolean) streamIdsOnlineRes.getData())){
                videoStreamIds.forEach(streamId->{
                    if(!streamIdsOnline.contains(streamId)){ //流不存在
                        //添加流
                        Response4Http<String> response = service.addStreamProxy(streamId);
                        Response4Http response2 = service.startRecord(streamId);
                        if(!(response2.getCode() ==1 && ((boolean) response2.getData()))){
                            System.out.println("流id为:"+streamId+"的信息:"+response2.getMsg());
                        }else{
                            System.out.println("流id为:"+streamId+"的信息:"+response2.getData());
                        }
                    }else{ //流存在
                        //检查是否在录制状态
                        Response4Http recordingRes = service.isRecording(streamId);
                        if(!(boolean)recordingRes.getData()){ //不在录制,则进行录制
                            Response4Http response2 = service.startRecord(streamId);
                            if(!(response2.getCode() ==1 && ((boolean) response2.getData()))){
                                System.out.println("流id为:"+streamId+"的信息:"+response2.getMsg());
                            }else{
                                System.out.println("流id为:"+streamId+"的信息:"+response2.getData());
                            }
                        }
                    }
                });
            }
        });
    }
    /**凌晨0点0分2秒执行一次,停止上次的录制视频流*/
    @Scheduled(cron = "2 0 0 * * ? ")
    public void getAndSaveA250(){
        ThreadPoolExecutorFactory.getPoolExecutor().execute(()->{
            //service.getAndSaveA250();
    /**
     * 录像保持3天
     */
    @Scheduled(cron= "0 0 3 * * ?")
    public void recordRecycle(){
        System.out.println("-----------执行录像循环----------:"+ DateUtil.YYYY_MM_DD_HH_MM_SS.format(new Date()));
        //文件夹路径 /battery_system/video_system/Debug/www/record/rtp/{streamId}/{day}}
        List<String> videoStreamIds = YamlProperties.videoStreamIds;
        videoStreamIds.forEach(streamId ->{
            String dirPath = "/battery_system/video_system/Debug/www/record/rtp/"+streamId;
            File dirFile = new File(dirPath);
            String[] dirList = dirFile.list();
            List<String> dirList2 = Arrays.asList(dirList);
            for (int i = 0; i < dirList2.size()-3; i++) {
                //按顺序删除,保留最后3个day的视频录像文件夹
                String dirPath2Remove = dirPath + File.separator + dirList2.get(i);
                File dir2Remove = new File(dirPath2Remove);
                FileUtil.deleteFile(dir2Remove);
            }
        });
    }
src/main/java/com/whyc/service/VideoService.java
@@ -1,13 +1,17 @@
package com.whyc.service;
import com.google.gson.internal.LinkedTreeMap;
import com.whyc.dto.Mp4FileDTO;
import com.whyc.dto.Response;
import com.whyc.util.ActionUtil;
import com.whyc.dto.Response4Http;
import com.whyc.util.HttpUtil;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.whyc.util.HttpUtil.urlEncode;
@@ -21,70 +25,143 @@
     * 获取视频流id
     * @return
     */
    public List<String> getVideoStreamIds() {
    public Response4Http getVideoStreamIds() {
        Response4Http responseResult = new Response4Http<>();
        Map<String, Object> params = new HashMap<>();//组合参数
        params.put("pageIndex", 1);
        params.put("pageSize", 1);
        params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj");
        String queryParams = urlEncode(params);
        String httpUrl ="http://192.168.10.133:9092/index/api/getMediaList";
        String httpUrl ="http://127.0.0.1:9092/index/api/getMediaList";
        Response response = HttpUtil.doGet(httpUrl, queryParams);
        Integer httpResponseCode = response.getCode();
        String responseJson = (String) response.getData();
        if(httpResponseCode == 1) { //请求成功
            Response responseHttp = HttpUtil.getGson().fromJson(responseJson, Response.class);
            if(responseHttp.getCode() == 1) {
                //TODO 需要实际调试,目前返回的数据结构未确定
                return HttpUtil.getGson().fromJson(responseHttp.getData().toString(), List.class);
            }else{
                return null;
            Response4Http responseHttp = HttpUtil.getGson().fromJson(responseJson, Response4Http.class);
            if(responseHttp.getCode() == 0 ) { //接口返回状态码为成功
                if(responseHttp.getData()!=null) {
                    List<LinkedTreeMap<String, Object>> list = (List) responseHttp.getData();
                    Stream<LinkedTreeMap<String, Object>> linkedTreeMapStream = list.stream().filter(item -> ((String) item.get("schema")).equals("rtsp"));
                    return responseResult.setII(1,true,linkedTreeMapStream.map(item -> (String) item.get("stream")).collect(Collectors.toList()),null);
                }{
                    return responseResult.set(1,true,"未查询到已开启的流");
                }
            }else{ //接口返回状态码为失败,获取msg
                return responseResult.set(1,false,responseHttp.getMsg());
            }
        }else{
            return null;
        }else{ //请求失败
            return responseResult.set(0,response.getData(),response.getMsg());
        }
    }
    public void startRecord(String streamId){
    /**
     * 1个小时录制为视频录制单个时长 :
     *  max_second = 1*60*60
     *
     * @param streamId
     * @return
     */
    public Response4Http startRecord(String streamId){
        Map<String, Object> params = new HashMap<>();//组合参数
        params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj");
        params.put("type", 1);
        params.put("vhost", "__defaultVhost__");
        params.put("app", "rtp");
        params.put("stream", streamId);
        String queryParams = urlEncode(params);
        String httpUrl ="http://192.168.10.133:9092/index/api/startRecord";
        Response response = HttpUtil.doGet(httpUrl, queryParams);
        Integer code = response.getCode();
        String responseJson = (String) response.getData();
        if(code == 1) { //请求成功
            Response responseHttp = HttpUtil.getGson().fromJson(responseJson, Response.class);
            if(responseHttp.getCode() == 0 && responseHttp.getMsg().equals("success")) { //请求成功
            }else{
                System.out.println(responseHttp.getMsg());
            }
        }
        params.put("max_second",3600);
        String httpUrl ="http://127.0.0.1:9092/index/api/startRecord";
        //Response response = HttpUtil.doGet(httpUrl, queryParams);
        //Integer code = response.getCode();
        //String responseJson = (String) response.getData();
        return HttpUtil.doGet(httpUrl,params);
    }
    public void stopRecord(String streamId){
    public Response4Http stopRecord(String streamId){
        Map<String, Object> params = new HashMap<>();//组合参数
        params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj");
        params.put("type", 1);
        params.put("vhost", "__defaultVhost__");
        params.put("app", "rtp");
        params.put("stream", streamId);
        String queryParams = urlEncode(params);
        String httpUrl ="http://192.168.10.133:9092/index/api/stopRecord";
        String httpUrl ="http://127.0.0.1:9092/index/api/stopRecord";
        return HttpUtil.doGet(httpUrl,params);
        /*String queryParams = urlEncode(params);
        String httpUrl ="http://127.0.0.1:9092/index/api/stopRecord";
        Response response = HttpUtil.doGet(httpUrl, queryParams);
        Integer code = response.getCode();
        String responseJson = (String) response.getData();
        if(code == 1) { //请求成功
            Response responseHttp = HttpUtil.getGson().fromJson(responseJson, Response.class);
            Response4Http responseHttp = HttpUtil.getGson().fromJson(responseJson, Response4Http.class);
            if(responseHttp.getCode() == 0 && responseHttp.getMsg().equals("success")) { //请求成功
            }else{
                System.out.println(responseHttp.getMsg());
            }
        }
        }*/
    }
    /**
     * getMp4RecordFile
     */
    public Response4Http<String> getMp4RecordFile(String streamId, String period){
        Map<String, Object> params = new HashMap<>();//组合参数
        params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj");
        params.put("type", 1);
        params.put("vhost", "__defaultVhost__");
        params.put("app", "rtp");
        params.put("stream", streamId);
        params.put("period",period);
        String httpUrl ="http://127.0.0.1:9092/index/api/getMp4RecordFile";
        Response4Http response4Http = HttpUtil.doGet(httpUrl, params);
        //data格式为:"data" : {
        //      "paths" : [ "2020-01-25", "2020-01-24" ],
        //      "rootPath" : "/www/record/live/ss/"
        //   }
        String dataStr = (String) response4Http.getData2();
        Mp4FileDTO mp4FileDTO = HttpUtil.getGson().fromJson(dataStr, Mp4FileDTO.class);
        response4Http.setData2(mp4FileDTO);
        return response4Http;
        /*if(code == 1) { //请求成功
            Response responseHttp = HttpUtil.getGson().fromJson(responseJson, Response.class);
            if(responseHttp.getCode() == 0 && responseHttp.getMsg().equals("success")) { //请求成功
                System.out.println(responseHttp.getData());
                return responseJson;
            }else{
                System.out.println(responseHttp.getMsg());
            }
        }*/
    }
    public Response4Http<String> openRtpServer(String streamId) {
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("port", 0);
        paramMap.put("tcp_mode", 1);
        paramMap.put("stream_id", streamId);
        paramMap.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj");
        return HttpUtil.doGet("http://127.0.0.1:9092/index/api/openRtpServer", paramMap);
    }
    public Response4Http<String> addStreamProxy(String streamId) {
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("vhost", "__defaultVhost__");
        paramMap.put("app", "rtp");
        paramMap.put("stream", streamId);
        paramMap.put("url", "rtsp://127.0.0.1:554/rtp/"+streamId);
        paramMap.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj");
        return HttpUtil.doGet("http://127.0.0.1:9092/index/api/addStreamProxy", paramMap);
    }
    public Response4Http isRecording(String streamId){
        Map<String, Object> params = new HashMap<>();//组合参数
        params.put("secret", "TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj");
        params.put("type", 1);
        params.put("vhost", "__defaultVhost__");
        params.put("app", "rtp");
        params.put("stream", streamId);
        String httpUrl ="http://127.0.0.1:9092/index/api/isRecording";
        return HttpUtil.doGet(httpUrl, params);
    }
}
src/main/java/com/whyc/util/FileUtil.java
New file
@@ -0,0 +1,30 @@
package com.whyc.util;
import java.io.File;
public class FileUtil {
    public static Boolean deleteFile(File file) {
        //判断文件不为null或文件目录存在
        if (file == null || !file.exists()) {
            System.out.println("文件删除失败,请检查文件是否存在以及文件路径是否正确");
            return false;
        }
        //获取目录下子文件
        File[] files = file.listFiles();
        //遍历该目录下的文件对象
        for (File f : files) {
            //判断子目录是否存在子目录,如果是文件则删除
            if (f.isDirectory()) {
                //递归删除目录下的文件
                deleteFile(f);
            } else {
                //文件删除
                f.delete();
                //打印文件名
            }
        }
        //文件夹删除
        file.delete();
        return true;
    }
}
src/main/java/com/whyc/util/HttpUtil.java
@@ -4,6 +4,7 @@
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;
import com.whyc.dto.Response;
import com.whyc.dto.Response4Http;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -265,4 +266,43 @@
        result = result.substring(0, result.lastIndexOf("&"));
        return result;
    }
    /**
     * 执行GET请求,传入Map参数和Url,获取响应
     */
    public static Response4Http doGet(String httpUrl, Map<String, ?> params) {
        Response4Http responseResult = new Response4Http<>();
        String queryParams = urlEncode(params);
        Response response = HttpUtil.doGet(httpUrl, queryParams);
        Integer httpResponseCode = response.getCode();
        String responseJson = (String) response.getData();
        if(httpResponseCode == 1) { //请求成功
            Response4Http responseHttp = HttpUtil.getGson().fromJson(responseJson, Response4Http.class);
            if(responseHttp.getCode() == 0 ) { //接口返回状态码为成功
                //返回信息有 data属性
                if(responseHttp.getData()!=null) {
                    return responseResult.setII(1,true,responseHttp.getData(),null);
                }
                //返回信息有 status属性
                else if(responseHttp.getStatus() !=null){
                    return responseResult.setStatus(1,true,responseHttp.getStatus());
                }
                //返回信息有 result属性
                else if(responseHttp.getResult() !=null){
                    responseResult.setResult(responseHttp.getResult());
                    return responseResult.set(1,true);
                }
                else{
                    return responseResult.set(1,true,"请求成功且返回数据正常,无数据信息");
                }
            }else{ //接口返回状态码为失败
                // 返回信息有 msg属性
                return responseResult.set(1,false,responseHttp.getMsg());
            }
        }else{ //请求失败
            return responseResult.set(0,response.getData(),response.getMsg());
        }
    }
}    
src/main/resources/config/application-dev.yml
@@ -3,7 +3,7 @@
  type: 1
#服务端口号
server:
  port: 8088
  port: 8087
  serverHeader:
  servlet:
    context-path: /br
@@ -20,9 +20,14 @@
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.highgo.jdbc.Driver
    url: jdbc:highgo://192.168.10.183:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
    url: jdbc:highgo://192.168.10.133:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
    username: sysdba
    password: Lmx&8688139
    password: Fg001@HDW
#    type: com.alibaba.druid.pool.DruidDataSource
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://localhost:3360/db_user?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false
#    username: root
#    password: lmx8688139
    maxIdel: 60
    initialPoolSize: 2
    minPoolSize: 5
@@ -86,3 +91,28 @@
    defaultKey: ENC(KdXXhvt6v7BDw7MgsR4J1OgahZgjl3kEil10+147oGA=)
    iv: ENC(Gtzf6s+BRoC1iQsRLMswSlBDSMom0kWtx5+SMJgaVDg=)
  i18n: zh-CN
#视频流的id
video:
  streamIds:
     "34020000001110000001_34020000001320000001,
      34020000001110000001_34020000001320000002,
      34020000001110000001_34020000001320000003,
      34020000001110000002_34020000001320000001,
      34020000001110000002_34020000001320000002,
      34020000001110000002_34020000001320000003,
      34020000001320000001_34020000001320000001,
      34020000001320000001_34020000001320000002,
      34020000001320000002_34020000001320000001,
      34020000001320000002_34020000001320000002,
      34020000001320000003_34020000001320000001,
      34020000001320000003_34020000001320000002,
      34020000001320000004_34020000001320000001,
      34020000001320000004_34020000001320000002,
      34020000001320000005_34020000001320000001,
      34020000001320000005_34020000001320000002,
      34020000001320000006_34020000001320000001,
      34020000001320000006_34020000001320000002,
      34020000001320000007_34020000001320000001,
      34020000001320000007_34020000001320000002,
      34020000001320000008_34020000001320000001,
      34020000001320000008_34020000001320000002"
src/main/resources/config/application-prod.yml
@@ -24,15 +24,18 @@
      datasource:
        master:
          type: com.alibaba.druid.pool.DruidDataSource
#          driver-class-name: com.mysql.cj.jdbc.Driver
#          url: jdbc:mysql://localhost:3360/db_user?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false
#          username: root
#          password: lmx8688139
          driver-class-name: com.highgo.jdbc.Driver
          #    url: jdbc:highgo://localhost:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
          url: jdbc:highgo://192.168.10.183:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
          url: jdbc:highgo://localhost:5866/highgo?rewriteBatchedStatements=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
          username: sysdba
          password: Lmx&8688139
        db2:
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: org.sqlite.JDBC
          url: jdbc:sqlite:E:\2软件下载包\easydarwin\EasyDarwin-windows-8.2.2-24031216\data\db\EasyDarwin.db?date_string_format=yyyy-MM-dd HH:mm:ss
          password: Fg001@HDW
#        db2:
#          type: com.alibaba.druid.pool.DruidDataSource
#          driver-class-name: org.sqlite.JDBC
#          url: jdbc:sqlite:E:\2软件下载包\easydarwin\EasyDarwin-windows-8.2.2-24031216\data\db\EasyDarwin.db?date_string_format=yyyy-MM-dd HH:mm:ss
    #      url: jdbc:sqlite:\2软件下载包\easydarwin\EasyDarwin-windows-8.2.2-24031216\data\db\EasyDarwin.db?date_string_format=yyyy-MM-dd HH:mm:ss
    maxIdel: 60
    initialPoolSize: 2
@@ -97,4 +100,27 @@
    defaultKey: ENC(KdXXhvt6v7BDw7MgsR4J1OgahZgjl3kEil10+147oGA=)
    iv: ENC(Gtzf6s+BRoC1iQsRLMswSlBDSMom0kWtx5+SMJgaVDg=)
  i18n: zh-CN
video:
  streamIds:
     "34020000001110000001_34020000001320000001,
      34020000001110000001_34020000001320000002,
      34020000001110000001_34020000001320000003,
      34020000001110000002_34020000001320000001,
      34020000001110000002_34020000001320000002,
      34020000001110000002_34020000001320000003,
      34020000001320000001_34020000001320000001,
      34020000001320000001_34020000001320000002,
      34020000001320000002_34020000001320000001,
      34020000001320000002_34020000001320000002,
      34020000001320000003_34020000001320000001,
      34020000001320000003_34020000001320000002,
      34020000001320000004_34020000001320000001,
      34020000001320000004_34020000001320000002,
      34020000001320000005_34020000001320000001,
      34020000001320000005_34020000001320000002,
      34020000001320000006_34020000001320000001,
      34020000001320000006_34020000001320000002,
      34020000001320000007_34020000001320000001,
      34020000001320000007_34020000001320000002,
      34020000001320000008_34020000001320000001,
      34020000001320000008_34020000001320000002"
src/main/resources/config/application.yml
@@ -1,7 +1,7 @@
spring:
  profiles:
    active: dev
#    active: prod
#    active: dev
    active: prod
#    active: dev-mysql