From a919d7e0383efa211bb006f7ec22e5c9c36aa59e Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: Sat, 20 Apr 2024 10:17:54 +0800
Subject: [PATCH] 优化本地录像

---
 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java   |   39 ++++++++++---------
 ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java               |    2 +
 ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java |    2 
 ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java        |   62 +++++++++++++++++-------------
 4 files changed, 59 insertions(+), 46 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java b/ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
index 1568ce7..8835bad 100644
--- a/ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
+++ b/ard-work/src/main/java/com/ruoyi/device/camera/controller/CameraSdkController.java
@@ -407,7 +407,7 @@
     @ApiOperation("本地录像停止")
     @PostMapping("/localRecordStop")
     @Log(title = "本地录像停止", businessType = BusinessType.CONTROL)
-    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo"})
+    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.chanNo", "cmd.lRealHandle"})
     public @ResponseBody
     void localRecordStop(@RequestBody CameraCmd cmd, HttpServletResponse response) throws IOException {
         cmd.setOperator(SecurityUtils.getUserId());
diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java b/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
index 0469bff..59b8e3a 100644
--- a/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
+++ b/ard-work/src/main/java/com/ruoyi/device/camera/domain/CameraCmd.java
@@ -52,4 +52,6 @@
     String recordBucketName;
     /*录像文件名称*/
     String recordObjectName;
+
+    Long recordId;
 }
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
index 85e0da4..fd31780 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -587,31 +587,31 @@
         try {
             String cameraId = cmd.getCameraId();
             Integer chanNo = cmd.getChanNo();
-            String path = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+
             if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                 return AjaxResult.error("设备未登录");
             }
             LLong loginId = (LLong) GlobalVariable.loginMap.get(cameraId);
-            LLong lRealHandle;
-            if (GlobalVariable.previewMap.containsKey(cameraId)) {
-                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
-                RealPlayModule.stopRealPlay(lRealHandle);
-                GlobalVariable.previewMap.remove(cameraId);
-                log.debug("停止当前录像");
-            }
-            lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo - 1, path);
+            //if (GlobalVariable.previewMap.containsKey(cameraId)) {
+            //    lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
+            //    RealPlayModule.stopRealPlay(lRealHandle);
+            //    GlobalVariable.previewMap.remove(cameraId);
+            //    log.debug("停止当前录像");
+            //}
+            String path = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+            LLong lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo - 1, path);
             if (lRealHandle.longValue() <= 0) {
                 log.error("取流失败" + getErrorCodePrint());
             }
             log.debug("本地录像开始取流成功");
-            GlobalVariable.previewMap.put(cameraId, lRealHandle.intValue());
-            GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName());
+            //GlobalVariable.previewMap.put(cameraId, lRealHandle.intValue());
+            //GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName());
             //if (!netsdk.CLIENT_SaveRealData(lRealHandle, path)) {
             //    log.error("保存视频文件到临时文件夹失败 错误码为:  " +getErrorCodePrint());
             //    return false;
             //}
             log.debug("本地录像开始");
-            return AjaxResult.success("本地录像开始,录像ID:"+lRealHandle);
+            return AjaxResult.success("本地录像开始",lRealHandle);
         } catch (Exception ex) {
             log.error("本地录像开始异常" + ex.getMessage());
             return AjaxResult.error("本地录像开始异常" + ex.getMessage());
@@ -622,24 +622,32 @@
     public AjaxResult localRecordStop(CameraCmd cmd) {
         try {
             String cameraId = cmd.getCameraId();
+            LLong lRealHandle = new LLong(cmd.getRecordId());
             if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                 return AjaxResult.error("设备未登录");
             }
-            LLong lRealHandle;
-            if (GlobalVariable.previewMap.containsKey(cameraId)) {
-                lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
-                RealPlayModule.stopRealPlay(lRealHandle);
-                GlobalVariable.previewMap.remove(cameraId);
-                log.debug("本地录像停止");
-                String recordPath = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
-                byte[] imageBytes = Files.readAllBytes(Paths.get(recordPath));
-               // OutputStream outputStream = response.getOutputStream();
-               // outputStream.write(imageBytes);
-                return AjaxResult.success(imageBytes);
-            }
-            else {
-                return AjaxResult.error("设备未开始录像");
-            }
+
+            RealPlayModule.stopRealPlay(lRealHandle);
+            log.debug("本地录像停止");
+            String recordPath = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+            byte[] imageBytes = Files.readAllBytes(Paths.get(recordPath));
+            // OutputStream outputStream = response.getOutputStream();
+            // outputStream.write(imageBytes);
+            return AjaxResult.success(imageBytes);
+            //if (GlobalVariable.previewMap.containsKey(cameraId)) {
+            //    lRealHandle = new LLong(GlobalVariable.previewMap.get(cameraId));
+            //    RealPlayModule.stopRealPlay(lRealHandle);
+            //    GlobalVariable.previewMap.remove(cameraId);
+            //    log.debug("本地录像停止");
+            //    String recordPath = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+            //    byte[] imageBytes = Files.readAllBytes(Paths.get(recordPath));
+            //   // OutputStream outputStream = response.getOutputStream();
+            //   // outputStream.write(imageBytes);
+            //    return AjaxResult.success(imageBytes);
+            //}
+            //else {
+            //    return AjaxResult.error("设备未开始录像");
+            //}
         } catch (Exception ex) {
             log.error("本地录像停止异常" + ex.getMessage());
             return AjaxResult.error("本地录像停止异常" + ex.getMessage());
diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
index b8dcd9c..77f2a33 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -1523,7 +1523,7 @@
             // 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中
             boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(userId, channelNum, jpeg, jpegBuffer, 1024 * 1024, a);
             //log.debug("-----------这里开始图片存入内存----------" + is);
-           // OutputStream outputStream = response.getOutputStream();
+            // OutputStream outputStream = response.getOutputStream();
             //outputStream.write(jpegBuffer.array());
             //Base64.Encoder decoder = Base64.getEncoder();
             //  BASE64Encoder encoder = new BASE64Encoder();
@@ -1965,12 +1965,12 @@
             previewinfo.bBlocked = 0;//0- 非阻塞取流,1-阻塞取流
             previewinfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
             previewinfo.write();
-            if (GlobalVariable.previewMap.containsKey(cameraId)) {
-                Integer lRealHandle = GlobalVariable.previewMap.get(cameraId);
-                hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
-                GlobalVariable.previewMap.remove(cameraId);
-                log.debug("停止当前录像");
-            }
+            //if (GlobalVariable.previewMap.containsKey(cameraId)) {
+            //    Integer lRealHandle = GlobalVariable.previewMap.get(cameraId);
+            //    hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
+            //    GlobalVariable.previewMap.remove(cameraId);
+            //    log.debug("停止当前录像");
+            //}
             int lRealHandle = hCNetSDK.NET_DVR_RealPlay_V40(userId, previewinfo, null, null);
             if (lRealHandle == -1) {
                 int code = hCNetSDK.NET_DVR_GetLastError();
@@ -1978,15 +1978,15 @@
                 return AjaxResult.error("本地录像取流失败: errorCode:" + code + " errorInfo:" + SdkErrorCodeEnum.getDescByCode(code));
             }
             log.debug("本地录像取流成功");
-            GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName());
-            GlobalVariable.previewMap.put(cameraId, lRealHandle);
-            if (!hCNetSDK.NET_DVR_SaveRealData_V30(GlobalVariable.previewMap.get(cameraId), 2, path)) {
+            //GlobalVariable.threadMap.put(cameraId, Thread.currentThread().getName());
+            //GlobalVariable.previewMap.put(cameraId, lRealHandle);
+            if (!hCNetSDK.NET_DVR_SaveRealData_V30(lRealHandle, 2, path)) {
                 int code = hCNetSDK.NET_DVR_GetLastError();
                 log.error("保存视频文件到临时文件夹失败 错误码为:  " + hCNetSDK.NET_DVR_GetLastError());
                 return AjaxResult.error("本地录像取流失败: errorCode:" + code + " errorInfo:" + SdkErrorCodeEnum.getDescByCode(code));
             }
             log.debug("本地录像开始");
-            return AjaxResult.success("录像开始,录像ID:" + lRealHandle);
+            return AjaxResult.success("录像开始", lRealHandle);
         } catch (Exception ex) {
             log.error("本地录像开始异常" + ex.getMessage());
             return AjaxResult.error("本地录像开始异常" + ex.getMessage());
@@ -1999,7 +1999,8 @@
         try {
             String cameraId = cmd.getCameraId();
             Integer channelNum = cmd.getChanNo();
-            String recordPath = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
+            Integer lRealHandle = cmd.getRecordId().intValue();
+
             if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                 return AjaxResult.error("设备未登录");
             }
@@ -2026,19 +2027,21 @@
             previewinfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
             previewinfo.write();
             //endregion
-            if (GlobalVariable.previewMap.containsKey(cameraId)) {
-                Integer lRealHandle = GlobalVariable.previewMap.get(cameraId);
-                hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
-                GlobalVariable.previewMap.remove(cameraId);
-            }
+            //if (GlobalVariable.previewMap.containsKey(cameraId)) {
+            //    Integer lRealHandle = GlobalVariable.previewMap.get(cameraId);
+            //    hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
+            //    GlobalVariable.previewMap.remove(cameraId);
+            //}
+            hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
             log.debug("本地录像停止");
+            String recordPath = FileUtils.createFile("D:/LocalRecordTemp/" + cameraId + ".mp4");
             byte[] recordBytes = Files.readAllBytes(Paths.get(recordPath));
             //OutputStream outputStream = response.getOutputStream();
             //outputStream.write(imageBytes);
             return AjaxResult.success(recordBytes);
         } catch (Exception ex) {
             log.error("本地录像停止异常" + ex.getMessage());
-            return AjaxResult.error("本地录像停止异常" +ex.getMessage());
+            return AjaxResult.error("本地录像停止异常" + ex.getMessage());
         }
     }
 }

--
Gitblit v1.9.3