Browse Source

视频回放

hexiao 1 năm trước cách đây
mục cha
commit
7a573f52e2

+ 2 - 1
business-service/src/main/java/com/ozs/service/mapper/BaseCameraManagementMapper.java

@@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -25,5 +26,5 @@ public interface BaseCameraManagementMapper extends BaseMapper<BaseCameraManagem
 
     Integer countCamera(MsgAlarmVo msgAlarmVo);
 
-    String getCameraChannelByAlarmId(@Param("alarmId") String alarmId);
+    Map<String, Object> getCameraChannelByAlarmId(@Param("alarmId") String alarmId);
 }

+ 2 - 1
business-service/src/main/java/com/ozs/service/service/BaseCameraManagementService.java

@@ -9,6 +9,7 @@ import com.ozs.service.entity.vo.BaseCameraManagementVo;
 import com.ozs.service.entity.vo.BaseCameraManagementVos;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -38,5 +39,5 @@ public interface BaseCameraManagementService extends IService<BaseCameraManageme
 
     List<BaseCameraManagement> baseCameraManagementList(BaseCameraManagementVo baseCameraManagementVo);
 
-    String getCameraChannelByAlarmId(String alarmId);
+    Map<String, Object> getCameraChannelByAlarmId(String alarmId);
 }

+ 1 - 1
business-service/src/main/java/com/ozs/service/service/impl/BaseCameraManagementServiceImpl.java

@@ -311,7 +311,7 @@ public class BaseCameraManagementServiceImpl extends ServiceImpl<BaseCameraManag
     }
 
     @Override
-    public String getCameraChannelByAlarmId(String alarmId) {
+    public Map<String, Object> getCameraChannelByAlarmId(String alarmId) {
         return baseCameraManagementMapper.getCameraChannelByAlarmId(alarmId);
     }
 }

+ 6 - 2
business-service/src/main/resources/mapper/service/BaseCameraManagementMapper.xml

@@ -85,8 +85,12 @@
     </select>
 
 
-    <select id="getCameraChannelByAlarmId" resultType="java.lang.String">
-        select b.channel
+    <select id="getCameraChannelByAlarmId" resultType="java.util.Map ">
+        select b.channel,
+               b.camera_code    as cameraCode,
+               ma.is_lock       as isLock,
+               ma.released_time as releasedTime,
+               ma.alarm_time    as alarmTime
         from msg_alarm ma
                  left join
              base_camera_management b on ma.camera_code = b.camera_code

+ 27 - 11
hazard-admin/src/main/java/com/ozs/web/controller/accountmanagment/BaseCameraManagementController.java

@@ -65,6 +65,7 @@ import java.io.InputStream;
 import java.text.Collator;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -432,8 +433,8 @@ public class BaseCameraManagementController extends BaseController {
         String mils = AppendUtils.stringAppend(baseCameraManagement.getInstallMile());
         baseCameraManagement.setInstalls(mils);
         String en = AppendUtils.stringAppend(baseCameraManagement.getEndMile());
-        String beg= AppendUtils.stringAppend(baseCameraManagement.getBeginMile());
-        baseCameraManagement.setBegins(beg+"~"+en);
+        String beg = AppendUtils.stringAppend(baseCameraManagement.getBeginMile());
+        baseCameraManagement.setBegins(beg + "~" + en);
         return AjaxResult.success(baseCameraManagement);
     }
 
@@ -630,7 +631,7 @@ public class BaseCameraManagementController extends BaseController {
         if (ObjectUtils.isEmpty(one)) {
             throw new BaseException("相机编号【" + vo.getCameraCode() + "】不存在");
         }
-        String path = CameraUtil.historyPlayListStr(one.getChannel(), vo.getStartTime(), vo.getEntTime());
+        String path = CameraUtil.historyPlayListStr(one.getChannel(), vo.getStartTime(), vo.getEntTime(), false);
         if (org.apache.commons.lang3.StringUtils.isBlank(path)) {
             throw new BaseException("当前相机无视频录像");
         }
@@ -848,15 +849,30 @@ public class BaseCameraManagementController extends BaseController {
     public AjaxResult getRecordByAlarmId(@RequestParam("alarmId") String alarmId) {
         Object cacheObject = redisCache.getCacheObject("STREAMING_ALARM_VIDEO:" + alarmId);
         if (ObjectUtils.isEmpty(cacheObject)) {
-            Map<String, Object> map = redisCache.getCacheMap("WAIT_MERGE_VIDEO_ALARM_ID");
-            log.info("待合成视频的报警信息集合:{}", map);
-            if (ObjectUtils.isEmpty(map)) {
-                return error("报警UUID:" + alarmId + ",是属于旧数据。请用新数据测试");
-            }
-            if (!map.keySet().contains(alarmId)) {
-                return error("报警UUID:" + alarmId + ",是属于旧数据。请用新数据测试");
+            // 表示已经超过报警时间20分钟,可以合成视频
+            Map<String, Object> map = baseCameraManagementService.getCameraChannelByAlarmId(alarmId);
+            if (!ObjectUtils.isEmpty(map)
+                    && map.size() > 0
+                    && !org.apache.commons.lang3.StringUtils.isBlank(map.get("channel").toString())) {
+                String url = null;
+                if (map.get("isLock").toString().equals("1")) {
+                    url = com.ozs.web.core.util.CameraUtil.historyPlayListStr(map.get("channel").toString(),
+                            (Date) map.get("alarmTime"),
+                            (Date) map.get("releasedTime"),
+                            true);
+                    redisCache.setCacheObject("STREAMING_ALARM_VIDEO:" + alarmId, url);
+                    redisCache.expire("STREAMING_ALARM_VIDEO:" + alarmId, 365L, TimeUnit.DAYS);
+                } else {
+                    url = com.ozs.web.core.util.CameraUtil.historyPlayListStr(map.get("channel").toString(),
+                            (Date) map.get("alarmTime"),
+                            new Date(),
+                            false);
+                }
+                return new AjaxResult(200, "ok", serverConfig.getUrl() + url);
+            } else {
+                return error("参数错误");
             }
-            return error("报警UUID:" + alarmId + ",没有视频录像");
+
         } else {
             return new AjaxResult(200, "ok", serverConfig.getUrl() + cacheObject);
         }

+ 27 - 30
hazard-admin/src/main/java/com/ozs/web/core/util/CameraUtil.java

@@ -91,7 +91,7 @@ public class CameraUtil {
      * @return
      * @throws IOException
      */
-    public static String historyPlay(List<String> fromVideoFileList, String ph, String uuid) {
+    public static String historyPlay(List<String> fromVideoFileList, String ph, boolean flay) {
         // 视频服务映射路径
         String NewfilePath = BaseConfig.getProfile() + "/" + ph;
         log.info("NewfilePath:{}", NewfilePath);
@@ -103,7 +103,7 @@ public class CameraUtil {
             @Override
             public void run() {
                 try {
-                    txConvetor(fromVideoFileList, NewfilePath, uuid);
+                    txConvetor(fromVideoFileList, NewfilePath, flay);
                 } catch (IOException e) {
                     log.error(e.getMessage());
                     e.printStackTrace();
@@ -169,7 +169,7 @@ public class CameraUtil {
      * @param endTm   结束时间
      * @return
      */
-    public static String historyPlayListStr(String channel, Date startTm, Date endTm) {
+    public static String historyPlayListStr(String channel, Date startTm, Date endTm, boolean flay) {
         List<String> list = filterPlayList(channel, startTm, endTm, filePath);
         String uuid = UUID.randomUUID().toString();
         String ph = "record/flv/" + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, new Date())
@@ -177,7 +177,7 @@ public class CameraUtil {
                 + uuid + ".mp4";
         if (!ObjectUtils.isEmpty(list)) {
             try {
-                return historyPlay(list, ph, uuid);
+                return historyPlay(list, ph, flay);
             } catch (Exception e) {
                 log.error(e.getMessage());
                 e.printStackTrace();
@@ -371,11 +371,11 @@ public class CameraUtil {
     @SneakyThrows
     public static void txConvetor(List<String> fromVideoFileList,
                                   String newfilePath,
-                                  String uuid) throws IOException {
+                                  boolean fly) throws IOException {
         /*
         * ffmpeg -i 20230411_155847_155947-d4c2265d-d83e-11ed-8e7f-fa163e4e1e9f.flv -c:v copy 1.ts
 ffmpeg -i 20230411_155948_160048-f91fea03-d83e-11ed-8e7f-fa163e4e1e9f.flv -c:v copy 2.ts
-ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
+ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
         * */
 
         File file = new File(newfilePath);
@@ -393,8 +393,6 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
         for (int t = 0; t < fromVideoFileList.size(); t++) {
             File ft = new File(fromVideoFileList.get(t));
             if (ft.exists()) {
-                // ffmpeg -i 20230411_155847_155947-d4c2265d-d83e-11ed-8e7f-fa163e4e1e9f.flv -c:v copy 1.ts
-                // ffmpeg -i 20230411_155948_160048-f91fea03-d83e-11ed-8e7f-fa163e4e1e9f.flv -c:v copy 2.ts
                 log.info("file:{}", fromVideoFileList.get(t));
                 String substring = fromVideoFileList.get(t).substring(0, fromVideoFileList.get(t).lastIndexOf("."));
                 int x;//定义两变量
@@ -419,21 +417,21 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
             if (ObjectUtils.isEmpty(mergeVideoTsFile)) {
                 mergeVideoTsFile = new HashMap<>();
             }
+            if (!flay) {
+                // 如果没有解除,把生成的文件放入要删除的定时任务 redis key 中
+                fileTs.add(newfilePath);
+            }
             mergeVideoTsFile.put(new Date().getTime() + "", fileTs);
             rc.deleteObject(tsFilekey);
-            rc.setCacheMap(tsFilekey, mergeVideoTsFile);
+            if (mergeVideoTsFile.size() > 0) {
+                rc.setCacheMap(tsFilekey, mergeVideoTsFile);
+            }
 
             sm.append("-c copy " + newfilePath);
             log.info("合并命令:{}", sm.toString());
             cUtil.cmd(sm.toString());
         }
 
-//        for (String fileT : fileTs) {
-//            File ft = new File(fileT);
-//            if (ft.exists()) {
-//                ft.delete();
-//            }
-//        }
     }
 
     public static List<Map<String, Object>> getRecordList(String channel, Date startTm, Date endTm) {
@@ -442,6 +440,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
 
     /**
      * 定时任务参数flv文件
+     * -----------------------------废弃
      *
      * @throws IOException
      * @throws InterruptedException
@@ -569,15 +568,6 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
         return listFiles;
     }
 
-    public static void execute(String command) {
-        try {
-            ProcessBuilder process = new ProcessBuilder(command);
-            process.inheritIO().start().waitFor();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-    }
 
     /**
      * 定时任务:关闭录制视频
@@ -773,6 +763,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
 
     /**
      * 定时合成视频
+     * ----------------------------废弃
      */
     public void mergeVideo() {
         Date date = new Date();
@@ -793,10 +784,10 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
                     alarmTime = calendar.getTime(); //这个时间就是日期往后推一天的结果
                     if (date.compareTo(alarmTime) > 0) {
                         // 表示已经超过报警时间20分钟,可以合成视频
-                        String cameraChannelByAlarmId = baseCameraManagementService.getCameraChannelByAlarmId(alarmId);
-                        if (!StringUtils.isBlank(cameraChannelByAlarmId)) {
-                            log.info("报警UUID:{},相机通道:{},开始时间:{},结束时间:{}", alarmId, cameraChannelByAlarmId, (Date) oTime, date);
-                            String url = historyPlayListStr(cameraChannelByAlarmId, (Date) oTime, date);
+                        Map<String, Object> map = baseCameraManagementService.getCameraChannelByAlarmId(alarmId);
+                        if (!StringUtils.isBlank(map.get("channel").toString())) {
+                            log.info("报警UUID:{},相机通道:{},开始时间:{},结束时间:{}", alarmId, map.get("channel").toString(), (Date) oTime, date);
+                            String url = historyPlayListStr(map.get("channel").toString(), (Date) oTime, date, false);
 
                             redisCache.setCacheObject("STREAMING_ALARM_VIDEO:" + alarmId, url);
                             redisCache.expire("STREAMING_ALARM_VIDEO:" + alarmId, 365L, TimeUnit.DAYS);
@@ -818,6 +809,9 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
     }
 
 
+    /**
+     * 删除生成的临时文件  30分钟后
+     */
     public void deleteTsFile() {
         Date date = new Date();
         List<String> keys = new ArrayList<>();
@@ -828,7 +822,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
                 Object o = mergeVideoTsFile.get(s);
                 Date fileTime = new Date(Long.parseLong(s));
                 calendar.setTime(fileTime);
-                calendar.add(calendar.MINUTE, 30); //把日期往后增加10分钟,整数  往后推,负数往前移动
+                calendar.add(calendar.MINUTE, 30); //把日期往后增加30分钟,整数  往后推,负数往前移动
                 fileTime = calendar.getTime(); //这个时间就是日期往后推一天的结果
                 if (date.compareTo(fileTime) > 0) {
                     List<String> list = (List<String>) o;
@@ -851,6 +845,9 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.flv
         }
         log.info("mergeVideoTsFile:{}", mergeVideoTsFile);
         redisCache.deleteObject("mergeVideoTsFile");
-        redisCache.setCacheMap("mergeVideoTsFile", mergeVideoTsFile);
+        if (mergeVideoTsFile.size() > 0) {
+            redisCache.setCacheMap("mergeVideoTsFile", mergeVideoTsFile);
+        }
+
     }
 }