gao.qiang 1 سال پیش
والد
کامیت
618370aad5

+ 70 - 93
business-service/src/main/java/com/ozs/utils/CameraUtil.java

@@ -279,13 +279,14 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
      * @param channel    相机通道
      * @return
      */
-    public static String getPlayFlvRtsp(String cameraCode, String channel, boolean flay, String state) {
-        if (state.contains("master")) {
-            log.info("-----getPlayFlvRtsp------11------>" + bakUrlRtsp + "/master/hdl/" + cameraCode + "/" + channel + ".flv");
-            return bakUrlRtsp + "/master/hdl/" + cameraCode + "/" + channel + "/h264_720.flv";
-        }
-        log.info("-------getPlayFlvRtsp----22------>" + bakUrlRtsp + "/slave/hdl/" + cameraCode + "/" + channel + ".flv");
-        return bakUrlRtsp + "/slave/hdl/" + cameraCode + "/" + channel + "/h264_1080.flv";
+    public static String getPlayFlvRtsp(String cameraCode, String channel, boolean flay, String url) {
+            if (url.contains("10.48.31.84")) {
+                log.info("-----getPlayFlvRtsp------11------>" + bakUrlRtsp + "/master/hdl/" + cameraCode + "/" + channel + ".flv");
+                return bakUrlRtsp + "/master/hdl/" + cameraCode + "/" + channel + "/h264_720.flv";
+            }else {
+                log.info("-------getPlayFlvRtsp----22------>" + bakUrlRtsp + "/slave/hdl/" + cameraCode + "/" + channel + ".flv");
+                return bakUrlRtsp + "/slave/hdl/" + cameraCode + "/" + channel + "/h264_720.flv";
+            }
 
 
 //        if (!flay) {
@@ -365,7 +366,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
                      */
                     CamerasVo camerasVo = new CamerasVo();
                     camerasVo.setCameraIndexCode(cameraCode);
-                    String urLs = previewURLs(camerasVo, channel);
+                    String urLs = previewURLs(camerasVo, channel,httpUrl);
                     log.info("web实时流---"+urLs);
                     if (!urLs.contains("无视频")) {
                         return getPlayFlv(cameraCode, channel, true, urLs);
@@ -376,7 +377,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
             } else {
                 CamerasVo camerasVo = new CamerasVo();
                 camerasVo.setCameraIndexCode(cameraCode);
-                String urLs = previewURLs(camerasVo, channel);
+                String urLs = previewURLs(camerasVo, channel,httpUrl);
                 log.info("web实时流---"+urLs);
                 if (!urLs.contains("无视频")) {
                     return getPlayFlv(cameraCode, channel, true, urLs);
@@ -387,7 +388,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         } else {
             CamerasVo camerasVo = new CamerasVo();
             camerasVo.setCameraIndexCode(cameraCode);
-            String urLs = previewURLs(camerasVo, channel);
+            String urLs = previewURLs(camerasVo, channel,httpUrl);
             if (!urLs.contains("无视频")) {
                 return getPlayFlv(cameraCode, channel, true, urLs);
             }else {
@@ -396,15 +397,20 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         }
     }
 
-    public String heartbeatgetPlayFlv(String cameraCode, String channel, boolean type) {
+    public  String heartbeatgetPlayFlv(String cameraCode, String channel, boolean type) {
         int maxRetries = 3;
         int retryCount = 0;
         boolean success = false;
         JSONArray jsonArray = null;
         List<String> pathList = new ArrayList<>();
+        //从redis中获取该相机的IP地址
+        String cacheObject = redisCache.getCacheObject(cameraCode);
+        if(StringUtils.isEmpty(cacheObject)){
+            cacheObject=httpUrl;
+        }
         while (!success && retryCount < maxRetries) {
             try {
-                String data = HttpUtils.sendGet(webUrl + "/rtsp/api/list");
+                String data = HttpUtils.sendGet(cacheObject + "/rtsp/api/list");
                 log.info("data------------------>" + data);
                 if (StringUtils.isNotEmpty(data)) {
                     jsonArray = JSONArray.parseArray(data);
@@ -427,8 +433,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
             if (!contains) {
                 return null;
             } else {
-                String cacheObject = redisCache.getCacheObject(cameraCode);
-                return getPlayFlvRtsp(cameraCode, channel, type, cacheObject);
+                return getPlayFlvRtsp(cameraCode, channel,type, cacheObject);
             }
         }
         return null;
@@ -454,18 +459,17 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         return null;
     }
 
-    public String heartbeatgetUrl(String cameraCode, String channel, boolean type) throws Exception {
+    public String heartbeatgetUrl(String cameraCode, String channel, boolean type,String url) throws Exception {
         CamerasVo camerasVo = new CamerasVo();
         camerasVo.setCameraIndexCode(cameraCode);
-        String s = previewURLs(camerasVo, channel);
+        String s = previewURLs(camerasVo, channel,url);
         log.info("-------heartbeatgetUrl---------" + s);
         if (s.contains("无视频")) {
             log.info("-------无视频---------");
             return s;
         } else {
-            log.info("-------getPlayFlvRtsp---------" + getPlayFlvRtsp(cameraCode, channel, type, s));
-            redisCache.setCacheObject(cameraCode, s, 2000, TimeUnit.SECONDS);
-            return getPlayFlvRtsp(cameraCode, channel, type, s);
+            log.info("-------getPlayFlvRtsp---------" + getPlayFlvRtsp(cameraCode, channel, type, url));
+            return getPlayFlvRtsp(cameraCode, channel, type, url);
         }
     }
 
@@ -473,7 +477,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
             CamerasVo camerasVo = new CamerasVo();
             camerasVo.setCameraIndexCode(cameraCode);
-            String s = previewURLs(camerasVo, channel);
+            String s = previewURLs(camerasVo, channel,httpUrl);
             if (s.contains("无视频")) {
                 return s;
             } else {
@@ -1233,7 +1237,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
      * @param camerasVo
      * @param channel
      */
-    public static String previewURLs(CamerasVo camerasVo, String channel) {
+    public static String previewURLs(CamerasVo camerasVo, String channel,String url) {
         /**
          *  jsonBody.put("cameraIndexCode", "01ea43e6676f4e47bd6c5cd9e02aa006");
          *         jsonBody.put("streamType", 0);
@@ -1258,41 +1262,15 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
             String urls = data.getString("url");
             log.info("urls----->" + urls);
             try {
-                //两个流媒体的个数
-                //第一个是性能高的
-                int urlCount = urlCount(httpUrl);
-                //第二个是性能低的
-                int urlCounts = urlCount(httpUrls);
-                if (urlCount == 0) {
-                    log.info("httpUrl---------->" + httpUrl + "/rtsp/api/pull?target=" + urls + "&streamPath=" + camerasVo.getCameraIndexCode() + "/" + channel + "&save=0");
-                    String msg = HttpUtils.sendGet(httpUrl + "/rtsp/api/pull?target=" + urls + "&streamPath=" + camerasVo.getCameraIndexCode() + "/" + channel + "&save=0");
+                    log.info("httpUrl---------->" + url + "/rtsp/api/pull?target=" + urls + "&streamPath=" + camerasVo.getCameraIndexCode() + "/" + channel + "&save=0");
+                    String msg = HttpUtils.sendGet(url + "/rtsp/api/pull?target=" + urls + "&streamPath=" + camerasVo.getCameraIndexCode() + "/" + channel + "&save=0");
                     log.info("msg---------->" + msg);
                     log.info("boolen--------------" + msg.contains("ok"));
                     if (!msg.contains("ok")) {
                         return "暂无视频-" + camerasVo.getCameraIndexCode();
                     }
-                    return "master";
-                } else {
-                    if (urlCounts * 2 > urlCount) {
-                        log.info("httpUrl---------->" + httpUrl + "/rtsp/api/pull?target=" + urls + "&streamPath=" + camerasVo.getCameraIndexCode() + "/" + channel + "&save=0");
-                        String msg = HttpUtils.sendGet(httpUrl + "/rtsp/api/pull?target=" + urls + "&streamPath=" + camerasVo.getCameraIndexCode() + "/" + channel + "&save=0");
-                        log.info("msg---------->" + msg);
-                        log.info("boolen--------------" + msg.contains("ok"));
-                        if (!msg.contains("ok")) {
-                            return "暂无视频-" + camerasVo.getCameraIndexCode();
-                        }
-                        return "master";
-                    } else {
-                        log.info("httpUrl---------->" + httpUrls + "/rtsp/api/pull?target=" + urls + "&streamPath=" + camerasVo.getCameraIndexCode() + "/" + channel + "&save=0");
-                        String msg = HttpUtils.sendGet(httpUrls + "/rtsp/api/pull?target=" + urls + "&streamPath=" + camerasVo.getCameraIndexCode() + "/" + channel + "&save=0");
-                        log.info("msg---------->" + msg);
-                        log.info("boolen--------------" + msg.contains("ok"));
-                        if (!msg.contains("ok")) {
-                            return "暂无视频-" + camerasVo.getCameraIndexCode();
-                        }
-                        return "slave";
-                    }
-                }
+                    rc.setCacheObject(camerasVo.getCameraIndexCode(),url);
+                    return "ok";
             } catch (Exception e) {
                 return "暂无视频-" + camerasVo.getCameraIndexCode();
             }
@@ -1460,7 +1438,6 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
                     success = true;
                 }
             } catch (Exception e) {
-                log.info("Exception caught: " + e.getMessage());
                 // 增加重试计数
                 retryCount++;
             }
@@ -1652,47 +1629,47 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
      *
      * @return
      */
-    public static int urlCount(String url) {
-        long begin = System.currentTimeMillis();
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        log.info("urlCountf方法开始时间: " + sdf.format(new Date(begin)));
-        int maxRetries = 5;
-        int retryCount = 0;
-        int count = 0;
-        boolean success = false;
-        JSONArray streamArray = null;
-        while (!success && retryCount < maxRetries) {
-            try {
-                String data = HttpClientUtil.gets(url + "/api/summary");
-                log.info("data------------------>" + data);
-                if (StringUtils.isNotEmpty(data)) {
-                    JSONObject jsonObject = JSONObject.parseObject(data);
-                    streamArray = jsonObject.getJSONArray("Streams");
-                    success = true;
-                }
-            } catch (Exception e) {
-                log.info("Exception caught: " + e.getMessage());
-                // 增加重试计数
-                retryCount++;
-            }
-        }
-        long zhong = System.currentTimeMillis();
-        log.info("urlCountf方法循环时间: " + sdf.format(new Date(zhong)));
-        if (!ObjectUtils.isEmpty(streamArray)) {
-//            for (int i = 0; i < streamArray.size(); i++) {
-//                JSONObject subObj = streamArray.getJSONObject(i);
-//                String PathValue = subObj.getString("Path");
-//                if (PathValue.contains("/h264_720")) {
-//                    count++;
+//    public static int urlCount(String url) {
+//        long begin = System.currentTimeMillis();
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        log.info("urlCountf方法开始时间: " + sdf.format(new Date(begin)));
+//        int maxRetries = 5;
+//        int retryCount = 0;
+//        int count = 0;
+//        boolean success = false;
+//        JSONArray streamArray = null;
+//        while (!success && retryCount < maxRetries) {
+//            try {
+//                String data = HttpClientUtil.gets(url + "/api/summary");
+//                log.info("data------------------>" + data);
+//                if (StringUtils.isNotEmpty(data)) {
+//                    JSONObject jsonObject = JSONObject.parseObject(data);
+//                    streamArray = jsonObject.getJSONArray("Streams");
+//                    success = true;
 //                }
+//            } catch (Exception e) {
+//                log.info("Exception caught: " + e.getMessage());
+//                // 增加重试计数
+//                retryCount++;
 //            }
-            long end = System.currentTimeMillis();
-            log.info("urlCountf方法结束时间: " + sdf.format(new Date(end)));
-            return streamArray.size();
-        } else {
-            long end = System.currentTimeMillis();
-            log.info("urlCountf方法结束时间: " + sdf.format(new Date(end)));
-            return count;
-        }
-    }
+//        }
+//        long zhong = System.currentTimeMillis();
+//        log.info("urlCountf方法循环时间: " + sdf.format(new Date(zhong)));
+//        if (!ObjectUtils.isEmpty(streamArray)) {
+////            for (int i = 0; i < streamArray.size(); i++) {
+////                JSONObject subObj = streamArray.getJSONObject(i);
+////                String PathValue = subObj.getString("Path");
+////                if (PathValue.contains("/h264_720")) {
+////                    count++;
+////                }
+////            }
+//            long end = System.currentTimeMillis();
+//            log.info("urlCountf方法结束时间: " + sdf.format(new Date(end)));
+//            return streamArray.size();
+//        } else {
+//            long end = System.currentTimeMillis();
+//            log.info("urlCountf方法结束时间: " + sdf.format(new Date(end)));
+//            return count;
+//        }
+//    }
 }

+ 248 - 92
vehicle-sdk/src/main/java/com/ozs/controller/upload/GeoHazardMonitorTokenController.java

@@ -161,6 +161,13 @@ public class GeoHazardMonitorTokenController {
     private String env;
     @Value("${sdk.publish}")
     private String sdkUrl;
+
+    @Value("${base.httpUrl}")
+    public String httpUrl;
+
+    @Value("${base.httpUrls}")
+    public String httpUrls;
+
     @Autowired
     private ISysDictTypeService dictTypeService;
     @Resource
@@ -498,10 +505,9 @@ public class GeoHazardMonitorTokenController {
         long begin = System.currentTimeMillis();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         log.info("接受心跳时间: " + sdf.format(new Date(begin)));
-        Map<String, Object> twoMap = new HashMap<>();
-        String playFlv1 = null;
         int distance = 0;
         boolean type = true;
+        String playFlv1 = null;
         RespHeartbeatVo respHeartbeatVo = new RespHeartbeatVo();
         String token = apiTokenUtils.getGeoHazardMonitorToken(request);
         log.info("token:{}", token);
@@ -682,27 +688,35 @@ public class GeoHazardMonitorTokenController {
                                     log.info("------------graphicsCard-------" + graphicsCard);
                                 }
                             }
-                            playFlv1 = cameraUtil.heartbeatgetPlayFlv(code, graphicsCard, type);
-                            if (StringUtils.isEmpty(playFlv1)) {
-                                playFlv1 = cameraUtil.heartbeatgetUrl(code, graphicsCard, type);
-                                if (playFlv1.contains("无视频")) {
-                                    AjaxResults1 = new AjaxResults(0, playFlv1);
-                                    return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                            String finalCode = code;
+                            String finalGraphicsCard = graphicsCard;
+                            boolean finalType1 = type;
+                            CompletableFuture.runAsync(() -> {
+                                String playFlv = cameraUtil.heartbeatgetPlayFlv(finalCode, finalGraphicsCard, finalType1);
+                                log.info("-------playFlv--------" + playFlv);
+                                if (StringUtils.isEmpty(playFlv)) {
+                                    try {
+                                        cameraUtil.heartbeatgetUrl(finalCode, finalGraphicsCard, finalType1, httpUrl);
+                                    } catch (Exception e) {
+                                        e.printStackTrace();
+                                    }
                                 }
-                            }
-                            log.info("-------playFlv--------" + playFlv1);
+                            });
                             CameraVos cameraVos = new CameraVos();
                             cameraVos.setCameraCode(code);
-                            cameraVos.setCurrentStream(playFlv1);
+                            cameraVos.setCurrentStream(CameraUtil.getPlayFlvRtsp(code, graphicsCard, type, httpUrl));
                             List<CameraVos> cameraVosList = new ArrayList<>();
                             cameraVosList.add(cameraVos);
                             respHeartbeatVo.setCameraList(cameraVosList);
                             respHeartbeatVo.setIsAlarm(1);
-                            twoMap.put("currentStream", playFlv1);
-                            twoMap.put("cameraCode", baseCameraManagementList.get(0).getCameraCode());
                         } else {
-                            AjaxResults1 = new AjaxResults(0, "报警里程无可用相机", respHeartbeatVo);
-                            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                            CameraVos cameraVos = new CameraVos();
+                            cameraVos.setCameraCode("该里程位置,没有可用的报警相机");
+                            cameraVos.setCurrentStream("");
+                            List<CameraVos> cameraVosList = new ArrayList<>();
+                            cameraVosList.add(cameraVos);
+                            respHeartbeatVo.setCameraList(cameraVosList);
+                            respHeartbeatVo.setIsAlarm(1);
                         }
                         for (int i = 0; i < list.size(); i++) {
                             MsgHeartbeatAlarmMessage msgHearbeatAlarmMessage = new MsgHeartbeatAlarmMessage();
@@ -807,14 +821,26 @@ public class GeoHazardMonitorTokenController {
                         List<BaseCameraManagement> baseCameraManagementList1 = cameraUtil.getBaseCameraManagementList(baseCameraManagement.getId(), heartbeatVo.getLineDir());
                         if (!ObjectUtils.isEmpty(baseCameraManagementList1)) {
                             for (BaseCameraManagement cameraManagement : baseCameraManagementList1) {
-                                String playFlv = cameraUtil.heartbeatgetPlayFlv(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), type);
-                                if (StringUtils.isEmpty(playFlv)) {
-                                    String url = cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), type);
-                                    if (url.contains("无视频")) {
-                                        AjaxResults1 = new AjaxResults(0, url);
-                                        return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                                boolean finalType2 = type;
+                                CompletableFuture.runAsync(() -> {
+                                    int index = 0;
+                                    String url;
+                                    if (index < 2) {
+                                        url = httpUrl;
+                                        index++;
+                                    } else {
+                                        url = httpUrls;
+                                        index = 0;
                                     }
-                                }
+                                    String playFlv = cameraUtil.heartbeatgetPlayFlv(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType2);
+                                    if (StringUtils.isEmpty(playFlv)) {
+                                        try {
+                                            cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType2, url);
+                                        } catch (Exception e) {
+                                            e.printStackTrace();
+                                        }
+                                    }
+                                });
                             }
                         }
                     } else if (!"[]".equals(preAlarm.getPreAlarmList())) {
@@ -869,33 +895,72 @@ public class GeoHazardMonitorTokenController {
                                     }
                                     //添加预警信息
                                     preAlarmListResponse.setCameraCode(baseCameraManagement.getCameraCode());
-                                    preAlarmListResponse.setCameraStream(cameraUtil.heartbeatgetPlayFlv(baseCameraManagement.getCameraCode(), baseCameraManagement.getGraphicsCard(), type));
+                                    preAlarmListResponse.setCameraStream(CameraUtil.getPlayFlvRtsp(baseCameraManagement.getCameraCode(), baseCameraManagement.getGraphicsCard(), type, httpUrl));
                                 }
                                 if (i == 0) {
-                                    playFlv1 = cameraUtil.heartbeatgetPlayFlv(code, graphicsCard, type);
-                                    if (StringUtils.isEmpty(playFlv1)) {
-                                        playFlv1 = cameraUtil.heartbeatgetUrl(code, graphicsCard, type);
-                                        if (playFlv1.contains("无视频")) {
-                                            AjaxResults1 = new AjaxResults(0, playFlv1);
-                                            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                                    String finalCode = code;
+                                    String finalGraphicsCard = graphicsCard;
+                                    boolean finalType3 = type;
+                                    CompletableFuture.runAsync(() -> {
+                                        String playFlv = cameraUtil.heartbeatgetPlayFlv(finalCode, finalGraphicsCard, finalType3);
+                                        if (StringUtils.isEmpty(playFlv)) {
+                                            try {
+                                                cameraUtil.heartbeatgetUrl(finalCode, finalGraphicsCard, finalType3, httpUrl);
+                                            } catch (Exception e) {
+                                                e.printStackTrace();
+                                            }
                                         }
-                                    }
-                                    log.info("-------playFlv--------" + playFlv1);
+                                    });
                                     CameraVos cameraVos = new CameraVos();
                                     cameraVos.setCameraCode(code);
-                                    cameraVos.setCurrentStream(playFlv1);
-                                    preAlarmListResponse.setCameraCode(code);
-                                    preAlarmListResponse.setCameraStream(playFlv1);
+                                    cameraVos.setCurrentStream(CameraUtil.getPlayFlvRtsp(code, graphicsCard, type, httpUrl));
                                     List<CameraVos> cameraVosList = new ArrayList<>();
                                     cameraVosList.add(cameraVos);
                                     respHeartbeatVo.setCameraList(cameraVosList);
                                     respHeartbeatVo.setIsAlarm(1);
-                                    twoMap.put("currentStream", playFlv1);
-                                    twoMap.put("cameraCode", baseCameraManagementList.get(0).getCameraCode());
                                 }
                             } else {
-                                preAlarmListResponse.setCameraCode("");
-                                preAlarmListResponse.setCameraStream("");
+                                if (i == 0 && respHeartbeatVo.getCameraList().size() == 0) {
+                                    LambdaQueryWrapper<BaseCameraManagement> base = new LambdaQueryWrapper<>();
+                                    if (heartbeatVo.getLineDir() == 1) {
+                                        distance = heartbeatVo.getVisualDistance() + heartbeatVo.getCurrentMile();
+                                        base.ge(BaseCameraManagement::getInstallMile, distance);
+                                        base.in(BaseCameraManagement::getMonitoringDirection, 1, 3);
+                                        base.orderByAsc(BaseCameraManagement::getGrou).orderByAsc(BaseCameraManagement::getSort);
+                                        base.le(BaseCameraManagement::getInstallMile, (heartbeatVo.getCurrentMile() + 10000));
+                                    }
+                                    if (heartbeatVo.getLineDir() == 2) {
+                                        distance = heartbeatVo.getCurrentMile() - heartbeatVo.getVisualDistance();
+                                        base.le(BaseCameraManagement::getInstallMile, distance);
+                                        base.ge(BaseCameraManagement::getInstallMile, (heartbeatVo.getCurrentMile() - 10000));
+                                        base.in(BaseCameraManagement::getMonitoringDirection, 2, 3);
+                                        base.orderByDesc(BaseCameraManagement::getGrou).orderByDesc(BaseCameraManagement::getSort);
+                                    }
+                                    base.eq(BaseCameraManagement::getRailwayCode, heartbeatVo.getRailwayCode());
+                                    base.eq(BaseCameraManagement::getOnline, 2);
+                                    base.eq(BaseCameraManagement::getEnableOrNot, 1);
+                                    base.last("limit 1");
+                                    List<BaseCameraManagement> list1 = baseCameraManagementService.list(base);
+                                    CameraVos cameraVos = new CameraVos();
+                                    cameraVos.setCameraCode(list1.get(0).getCameraCode());
+                                    cameraVos.setCurrentStream(cameraUtil.getPlayFlvRtsp(list1.get(0).getCameraCode(), list1.get(0).getGraphicsCard(), type, httpUrl));
+                                    List<CameraVos> cameraVosList = new ArrayList<>();
+                                    cameraVosList.add(cameraVos);
+                                    respHeartbeatVo.setCameraList(cameraVosList);
+                                    respHeartbeatVo.setIsAlarm(1);
+                                    preAlarmListResponse.setCameraCode("");
+                                    preAlarmListResponse.setCameraStream("");
+                                } else {
+                                    preAlarmListResponse.setCameraCode("");
+                                    preAlarmListResponse.setCameraStream("");
+                                    CameraVos cameraVos = new CameraVos();
+                                    cameraVos.setCameraCode("该里程位置,没有可用的预警相机");
+                                    cameraVos.setCurrentStream("");
+                                    List<CameraVos> cameraVosList = new ArrayList<>();
+                                    cameraVosList.add(cameraVos);
+                                    respHeartbeatVo.setCameraList(cameraVosList);
+                                    respHeartbeatVo.setIsAlarm(1);
+                                }
                             }
                             BeanUtils.copyProperties(preAlarmList.get(i), preAlarmListResponse);
                             responseList.add(preAlarmListResponse);
@@ -954,14 +1019,23 @@ public class GeoHazardMonitorTokenController {
                                 List<BaseCameraManagement> baseCameraManagementList1 = cameraUtil.getBaseCameraManagementList(baseCameraManagement.getId(), heartbeatVo.getLineDir());
                                 if (!ObjectUtils.isEmpty(baseCameraManagementList1)) {
                                     for (BaseCameraManagement cameraManagement : baseCameraManagementList1) {
-                                        String flv = cameraUtil.heartbeatgetPlayFlv(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), type);
-                                        if (StringUtils.isEmpty(flv)) {
-                                            String url = cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), type);
-                                            if (url.contains("无视频")) {
-                                                AjaxResults1 = new AjaxResults(0, url);
-                                                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                                        boolean finalType4 = type;
+                                        CompletableFuture.runAsync(() -> {
+                                            int index = 0;
+                                            String url;
+                                            if (index < 2) {
+                                                url = httpUrl;
+                                                index++;
+                                            } else {
+                                                url = httpUrls;
+                                                index = 0;
                                             }
-                                        }
+                                            try {
+                                                cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType4, url);
+                                            } catch (Exception e) {
+                                                e.printStackTrace();
+                                            }
+                                        });
                                     }
                                 }
                                 BaseCameraManagement idOne = baseCameraManagementService.getById(list1.get(0).getId());
@@ -982,14 +1056,26 @@ public class GeoHazardMonitorTokenController {
                                 List<BaseCameraManagement> baseCameraManagementList1 = cameraUtil.getBaseCameraManagementList(list1.get(finalI).getId(), heartbeatVo.getLineDir());
                                 if (!ObjectUtils.isEmpty(baseCameraManagementList1)) {
                                     for (BaseCameraManagement cameraManagement : baseCameraManagementList1) {
-                                        String flv = cameraUtil.heartbeatgetPlayFlv(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType);
-                                        if (StringUtils.isEmpty(flv)) {
-                                            String url = cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType);
-                                            if (url.contains("无视频")) {
-                                                AjaxResults1 = new AjaxResults(0, url);
-                                                return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                                        boolean finalType5 = type;
+                                        CompletableFuture.runAsync(() -> {
+                                            int index = 0;
+                                            String url;
+                                            if (index < 2) {
+                                                url = httpUrl;
+                                                index++;
+                                            } else {
+                                                url = httpUrls;
+                                                index = 0;
                                             }
-                                        }
+                                            String playFlv2 = cameraUtil.heartbeatgetPlayFlv(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType5);
+                                            if (StringUtils.isEmpty(playFlv2)) {
+                                                try {
+                                                    cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType5, url);
+                                                } catch (Exception e) {
+                                                    e.printStackTrace();
+                                                }
+                                            }
+                                        });
                                     }
                                 }
                             }
@@ -998,16 +1084,22 @@ public class GeoHazardMonitorTokenController {
                         if (!ObjectUtils.isEmpty(baseCameraManagementList1)) {
                             List<CameraVos> cameraVosList = new ArrayList<>();
                             for (BaseCameraManagement baseCameraManagement : baseCameraManagementList1) {
+                                int index = 0;
+                                String url;
+                                if (index < 2) {
+                                    url = httpUrl;
+                                    index++;
+                                } else {
+                                    url = httpUrls;
+                                    index = 0;
+                                }
                                 CameraVos cameraVos = new CameraVos();
                                 cameraVos.setCameraCode(baseCameraManagement.getCameraCode());
-                                String cacheObject = redisCache.getCacheObject(baseCameraManagement.getCameraCode());
-                                cameraVos.setCurrentStream(CameraUtil.getPlayFlvRtsp(baseCameraManagement.getCameraCode(), baseCameraManagement.getGraphicsCard(), type, cacheObject));
+                                cameraVos.setCurrentStream(CameraUtil.getPlayFlvRtsp(baseCameraManagement.getCameraCode(), baseCameraManagement.getGraphicsCard(), type, url));
                                 cameraVosList.add(cameraVos);
                             }
                             respHeartbeatVo.setCameraList(cameraVosList);
                         }
-                        twoMap.put("currentStream", playFlv);
-                        twoMap.put("cameraCode", list1.get(0).getCameraCode());
                         respHeartbeatVo.setIsAlarm(2);
                     }
                 } else if (!"[]".equals(preAlarm.getPreAlarmList())) {
@@ -1062,33 +1154,73 @@ public class GeoHazardMonitorTokenController {
                                 }
                                 //添加预警信息
                                 preAlarmListResponse.setCameraCode(baseCameraManagement.getCameraCode());
-                                preAlarmListResponse.setCameraStream(cameraUtil.heartbeatgetPlayFlv(baseCameraManagement.getCameraCode(), baseCameraManagement.getGraphicsCard(), type));
+                                preAlarmListResponse.setCameraStream(CameraUtil.getPlayFlvRtsp(baseCameraManagement.getCameraCode(), baseCameraManagement.getGraphicsCard(), type, httpUrl));
                             }
                             if (i == 0) {
-                                playFlv1 = cameraUtil.heartbeatgetPlayFlv(code, graphicsCard, type);
-                                if (StringUtils.isEmpty(playFlv1)) {
-                                    playFlv1 = cameraUtil.heartbeatgetUrl(code, graphicsCard, type);
-                                    if (playFlv1.contains("无视频")) {
-                                        AjaxResults1 = new AjaxResults(0, playFlv1);
-                                        return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                                String finalCode = code;
+                                String finalGraphicsCard = graphicsCard;
+                                boolean finalType3 = type;
+                                CompletableFuture.runAsync(() -> {
+                                    String playFlv = cameraUtil.heartbeatgetPlayFlv(finalCode, finalGraphicsCard, finalType3);
+                                    if (StringUtils.isEmpty(playFlv)) {
+                                        try {
+                                            cameraUtil.heartbeatgetUrl(finalCode, finalGraphicsCard, finalType3, httpUrl);
+                                        } catch (Exception e) {
+                                            e.printStackTrace();
+                                        }
                                     }
-                                }
+                                });
                                 log.info("-------playFlv--------" + playFlv1);
                                 CameraVos cameraVos = new CameraVos();
                                 cameraVos.setCameraCode(code);
-                                cameraVos.setCurrentStream(playFlv1);
-                                preAlarmListResponse.setCameraCode(code);
-                                preAlarmListResponse.setCameraStream(playFlv1);
+                                cameraVos.setCurrentStream(cameraUtil.getPlayFlvRtsp(code, finalGraphicsCard, type, httpUrl));
                                 List<CameraVos> cameraVosList = new ArrayList<>();
                                 cameraVosList.add(cameraVos);
                                 respHeartbeatVo.setCameraList(cameraVosList);
                                 respHeartbeatVo.setIsAlarm(1);
-                                twoMap.put("currentStream", playFlv1);
-                                twoMap.put("cameraCode", baseCameraManagementList.get(0).getCameraCode());
                             }
                         } else {
-                            preAlarmListResponse.setCameraCode("");
-                            preAlarmListResponse.setCameraStream("");
+                            if (i == 0 && respHeartbeatVo.getCameraList().size() == 0) {
+                                LambdaQueryWrapper<BaseCameraManagement> base = new LambdaQueryWrapper<>();
+                                if (heartbeatVo.getLineDir() == 1) {
+                                    distance = heartbeatVo.getVisualDistance() + heartbeatVo.getCurrentMile();
+                                    base.ge(BaseCameraManagement::getInstallMile, distance);
+                                    base.in(BaseCameraManagement::getMonitoringDirection, 1, 3);
+                                    base.orderByAsc(BaseCameraManagement::getGrou).orderByAsc(BaseCameraManagement::getSort);
+                                    base.le(BaseCameraManagement::getInstallMile, (heartbeatVo.getCurrentMile() + 10000));
+                                }
+                                if (heartbeatVo.getLineDir() == 2) {
+                                    distance = heartbeatVo.getCurrentMile() - heartbeatVo.getVisualDistance();
+                                    base.le(BaseCameraManagement::getInstallMile, distance);
+                                    base.ge(BaseCameraManagement::getInstallMile, (heartbeatVo.getCurrentMile() - 10000));
+                                    base.in(BaseCameraManagement::getMonitoringDirection, 2, 3);
+                                    base.orderByDesc(BaseCameraManagement::getGrou).orderByDesc(BaseCameraManagement::getSort);
+                                }
+                                base.eq(BaseCameraManagement::getRailwayCode, heartbeatVo.getRailwayCode());
+                                base.eq(BaseCameraManagement::getOnline, 2);
+                                base.eq(BaseCameraManagement::getEnableOrNot, 1);
+                                base.last("limit 1");
+                                List<BaseCameraManagement> list1 = baseCameraManagementService.list(base);
+                                CameraVos cameraVos = new CameraVos();
+                                cameraVos.setCameraCode(list1.get(0).getCameraCode());
+                                cameraVos.setCurrentStream(cameraUtil.getPlayFlvRtsp(list1.get(0).getCameraCode(), list1.get(0).getGraphicsCard(), type, httpUrl));
+                                List<CameraVos> cameraVosList = new ArrayList<>();
+                                cameraVosList.add(cameraVos);
+                                respHeartbeatVo.setCameraList(cameraVosList);
+                                respHeartbeatVo.setIsAlarm(1);
+                                preAlarmListResponse.setCameraCode("");
+                                preAlarmListResponse.setCameraStream("");
+                            } else {
+                                preAlarmListResponse.setCameraCode("");
+                                preAlarmListResponse.setCameraStream("");
+                                CameraVos cameraVos = new CameraVos();
+                                cameraVos.setCameraCode("该里程位置,没有可用的预警相机");
+                                cameraVos.setCurrentStream("");
+                                List<CameraVos> cameraVosList = new ArrayList<>();
+                                cameraVosList.add(cameraVos);
+                                respHeartbeatVo.setCameraList(cameraVosList);
+                                respHeartbeatVo.setIsAlarm(1);
+                            }
                         }
                         BeanUtils.copyProperties(preAlarmList.get(i), preAlarmListResponse);
                         responseList.add(preAlarmListResponse);
@@ -1148,14 +1280,23 @@ public class GeoHazardMonitorTokenController {
                             List<BaseCameraManagement> baseCameraManagementList1 = cameraUtil.getBaseCameraManagementList(baseCameraManagement.getId(), heartbeatVo.getLineDir());
                             if (!ObjectUtils.isEmpty(baseCameraManagementList1)) {
                                 for (BaseCameraManagement cameraManagement : baseCameraManagementList1) {
-                                    String flv = cameraUtil.heartbeatgetPlayFlv(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType);
-                                    if (StringUtils.isEmpty(flv)) {
-                                        String url = cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType);
-                                        if (url.contains("无视频")) {
-                                            AjaxResults1 = new AjaxResults(0, url);
-                                            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                                    boolean finalType4 = type;
+                                    CompletableFuture.runAsync(() -> {
+                                        int index = 0;
+                                        String url;
+                                        if (index < 2) {
+                                            url = httpUrl;
+                                            index++;
+                                        } else {
+                                            url = httpUrls;
+                                            index = 0;
                                         }
-                                    }
+                                        try {
+                                            cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType4, url);
+                                        } catch (Exception e) {
+                                            e.printStackTrace();
+                                        }
+                                    });
                                 }
                             }
                             BaseCameraManagement idOne = baseCameraManagementService.getById(list1.get(0).getId());
@@ -1171,14 +1312,26 @@ public class GeoHazardMonitorTokenController {
                             List<BaseCameraManagement> baseCameraManagementList1 = cameraUtil.getBaseCameraManagementList(list1.get(i).getId(), heartbeatVo.getLineDir());
                             if (!ObjectUtils.isEmpty(baseCameraManagementList1)) {
                                 for (BaseCameraManagement cameraManagement : baseCameraManagementList1) {
-                                    String flv = cameraUtil.heartbeatgetPlayFlv(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), type);
-                                    if (StringUtils.isEmpty(flv)) {
-                                        String url = cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), type);
-                                        if (url.contains("无视频")) {
-                                            AjaxResults1 = new AjaxResults(0, url);
-                                            return SM4Utils.encryptData_ECB(JSONObject.toJSONString(AjaxResults1), key);
+                                    boolean finalType5 = type;
+                                    CompletableFuture.runAsync(() -> {
+                                        int index = 0;
+                                        String url;
+                                        if (index < 2) {
+                                            url = httpUrl;
+                                            index++;
+                                        } else {
+                                            url = httpUrls;
+                                            index = 0;
                                         }
-                                    }
+                                        String playFlv2 = cameraUtil.heartbeatgetPlayFlv(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType5);
+                                        if (StringUtils.isEmpty(playFlv2)) {
+                                            try {
+                                                cameraUtil.heartbeatgetUrl(cameraManagement.getCameraCode(), cameraManagement.getGraphicsCard(), finalType5, url);
+                                            } catch (Exception e) {
+                                                e.printStackTrace();
+                                            }
+                                        }
+                                    });
                                 }
                             }
                         }
@@ -1187,16 +1340,22 @@ public class GeoHazardMonitorTokenController {
                     if (!ObjectUtils.isEmpty(baseCameraManagementList1)) {
                         List<CameraVos> cameraVosList = new ArrayList<>();
                         for (BaseCameraManagement baseCameraManagement : baseCameraManagementList1) {
+                            int index = 0;
+                            String url;
+                            if (index < 2) {
+                                url = httpUrl;
+                                index++;
+                            } else {
+                                url = httpUrls;
+                                index = 0;
+                            }
                             CameraVos cameraVos = new CameraVos();
                             cameraVos.setCameraCode(baseCameraManagement.getCameraCode());
-                            String cacheObject = redisCache.getCacheObject(baseCameraManagement.getCameraCode());
-                            cameraVos.setCurrentStream(CameraUtil.getPlayFlvRtsp(baseCameraManagement.getCameraCode(), baseCameraManagement.getGraphicsCard(), type, cacheObject));
+                            cameraVos.setCurrentStream(CameraUtil.getPlayFlvRtsp(baseCameraManagement.getCameraCode(), baseCameraManagement.getGraphicsCard(), type, url));
                             cameraVosList.add(cameraVos);
                         }
                         respHeartbeatVo.setCameraList(cameraVosList);
                     }
-                    twoMap.put("currentStream", playFlv);
-                    twoMap.put("cameraCode", list1.get(0).getCameraCode());
                     respHeartbeatVo.setIsAlarm(2);
                 }
                 //赋值--股道
@@ -1227,10 +1386,7 @@ public class GeoHazardMonitorTokenController {
                     respHeartbeatVo.setRouteTrack("");
                     respHeartbeatVo.setStationCode("");
                 }
-                twoMap.put("visualDistance", heartbeatVo.getVisualDistance().toString());
-                String string = JSON.toJSONString(twoMap);
                 baseVideoTrainsService.save(baseVideoTrains);
-                heartbeatUtils.createHeartbeat(Constant.HERTBEA_KEY + heartbeatVo.getTerminalCode(), string);
                 log.info("---------data---结果-------" + respHeartbeatVo);
                 if (ObjectUtils.isEmpty(respHeartbeatVo.getPreAlarmList())) {
                     if (!ObjectUtils.isEmpty(respHeartbeatVo.getCameraList())) {