From f4f4fc53260eb67483dce406a963628273786a61 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Sat, 30 May 2026 17:22:17 +0800
Subject: [PATCH] 优化
---
ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hp/service/HpSDK.java | 102 +++++++++++++++++++++++++--------------------------
1 files changed, 50 insertions(+), 52 deletions(-)
diff --git a/ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hp/service/HpSDK.java b/ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hp/service/HpSDK.java
index b6119ac..d38ed90 100644
--- a/ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hp/service/HpSDK.java
+++ b/ard-modules/ard-modules-work/src/main/java/com/ard/work/sdk/hp/service/HpSDK.java
@@ -5,6 +5,7 @@
import com.ard.common.core.exception.ServiceException;
import com.ard.common.core.exception.device.CameraSDKException;
import com.ard.common.core.utils.StringUtils;
+import com.ard.common.core.utils.file.FileMultipartFile;
import com.ard.common.core.utils.file.FileUtils;
import com.ard.common.core.utils.file.MimeTypeUtils;
import com.ard.common.redis.service.RedisService;
@@ -25,7 +26,6 @@
import com.ard.work.sdk.model.PtzScope;
import com.ard.work.utils.ArdTool;
import com.ard.work.utils.FFmpegUtils;
-import com.ard.work.utils.file.MultipartFileUtil;
import com.ard.work.utils.gis.GisUtil;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
@@ -37,6 +37,7 @@
import org.springframework.util.StopWatch;
import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@@ -1079,12 +1080,6 @@
return ptzDto;
}
- //获取高精度ptz信息
- @Override
- public PtzDto getPtzHigh(CameraCmd cmd) {
- return getPtz(cmd);
- }
-
//设置ptz信息
@Override
public Boolean setPtz(CameraCmd cmd) {
@@ -1210,18 +1205,6 @@
return bytes;
}
- //设置高精度ptz信息
- @Override
- public Boolean setPtzHighT(CameraCmd cmd) {
- return setPtz(cmd);
- }
-
- //非透传 旧设备使用 新固件会导致2通道不自动聚焦
- @Override
- public Boolean setPtzHigh(CameraCmd cmd) {
- return setPtz(cmd);
- }
-
//设置零方位角
@Override
public Boolean setZeroPtz(CameraCmd cmd) {
@@ -1284,7 +1267,7 @@
targetPositions.validate(); // 校验目标位置
PtzDto targetPTZ = GisUtil.getCameraPTZ(cameraPosition, targetPositions, 20, 150);
//若为车载光电,需要根据修改P值
- if (ardCamera.getType().equals("4")) {
+ if ("4".equals(ardCamera.getType())) {
targetPTZ.setP((targetPTZ.getP() - baseYaw + 360) % 360);
}
// pt校验范围
@@ -1398,69 +1381,84 @@
private String hikRecordStop(CameraCmd cmd) {
String url = "";
+ File videoFile = null;
+ File transcodeFile = null;
+
try {
String cameraId = cmd.getCameraId();
Integer chanNo = cmd.getChanNo();
String name = cameraId + "_" + chanNo;
+
// 本地临时录像地址
String path = FileUtils.createFile(tempDir + "/record/" + name + ".mp4");
+
Long userId = redisService.getCacheMapValue(CacheConstants.CAMERA_ONLINE, cameraId);
if (userId == null) {
throw new ServiceException("设备离线");
}
- //region 强制I帧
- NET_DVR_I_FRAME netDvrIFrame = new NET_DVR_I_FRAME(); //新建结构体对象
- netDvrIFrame.read();
- netDvrIFrame.dwChannel = chanNo;//因为上文代码中设置了通道号,按照上文中的设置
- netDvrIFrame.byStreamType = 0;
- netDvrIFrame.dwSize = netDvrIFrame.size();
- netDvrIFrame.write();
- if (!hCNetSDK.NET_DVR_RemoteControl(userId.intValue(), 3402, netDvrIFrame.getPointer(),
- netDvrIFrame.dwSize)) {
- log.error("强制I帧 错误码为:{}", hCNetSDK.NET_DVR_GetLastError());
- }
- //endregion
- //region 预览参数
- NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO();
- previewInfo.read();
- previewInfo.lChannel = chanNo;
- previewInfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
- previewInfo.dwLinkMode = 0;//连接方式:0-TCP方式,1-UDP方式,2-多播方式,3-RTP方式,4-RTP/RTSP,5-RTP/HTTP,6-HRUDP(可靠传输),7
- // -RTSP/HTTPS,8-NPQ
- previewInfo.hPlayWnd = null;//播放窗口的句柄,为NULL表示不解码显示。
- previewInfo.bBlocked = 0;//0- 非阻塞取流,1-阻塞取流
- previewInfo.byNPQMode = 0;//NPQ模式:0-直连模式,1-过流媒体模式
- previewInfo.write();
- //endregion
+
+ // 停止录像
if (GlobalVariable.previewMap.containsKey(name)) {
Integer lRealHandle = (Integer) GlobalVariable.previewMap.get(name);
hCNetSDK.NET_DVR_StopRealPlay(lRealHandle);
GlobalVariable.previewMap.remove(name);
}
log.debug("录像停止");
- //ffmpeg转码
+
+ // 检查原录像文件是否存在
+ videoFile = new File(path);
+ if (!videoFile.exists() || videoFile.length() == 0) {
+ log.error("录像文件不存在或为空: {}", path);
+ return "";
+ }
+
+ // ffmpeg转码
StopWatch watchStop = new StopWatch();
watchStop.start();
String newpath = FileUtils.createFile(tempDir + "/record/" + name + "_c.mp4");
+ transcodeFile = new File(newpath);
FFmpegUtils.transcodeToMP4(path, newpath);
watchStop.stop();
log.warn("转码耗时:{}", watchStop.getTotalTimeMillis());
- //存入minio
+
+ // 检查转码后的文件是否存在
+ if (!transcodeFile.exists() || transcodeFile.length() == 0) {
+ log.error("转码文件不存在或为空: {}", newpath);
+ return "";
+ }
+
+ // 存入minio - 使用 FileMultipartFile
String bucketName = "record";
- String objectName = cameraId + "_" + chanNo;
- String type = cmd.getType();
- MultipartFile multipartFile = MultipartFileUtil.filePathToMultipartFile(newpath, objectName,
- MimeTypeUtils.VIDEO_MP4);
+ String objectName = cameraId + "_" + chanNo + ".mp4";
+ String type = cmd.getType() == null ? "record" : cmd.getType();
+
+ MultipartFile multipartFile = new FileMultipartFile(transcodeFile, objectName, MimeTypeUtils.VIDEO_MP4);
R<SysFile> sysFileR = remoteFileService.upload(multipartFile, bucketName, type);
+
if (sysFileR.getCode() == R.SUCCESS) {
url = sysFileR.getData().getUrl();
log.info("上传文件成功:{}", url);
}
return url;
+
} catch (Exception ex) {
log.error("录像异常:{}", ex.getMessage());
return "";
+ } finally {
+ // 清理临时文件
+ try {
+ if (videoFile != null && videoFile.exists()) {
+ videoFile.delete();
+ log.debug("删除原录像文件: {}", videoFile.getPath());
+ }
+ if (transcodeFile != null && transcodeFile.exists()) {
+ transcodeFile.delete();
+ log.debug("删除转码文件: {}", transcodeFile.getPath());
+ }
+ } catch (Exception e) {
+ log.warn("删除临时文件失败", e);
+ }
}
}
@@ -1535,7 +1533,7 @@
channel.setVideoCode(videoCfg.getVideoEncType());
}
String rtspUrl = buildRtspUrlForType1(node, chanNo);
- channel.setRtspUrl(rtspUrl);
+ channel.setLiveAddress(rtspUrl);
} else if ("2".equals(node.getNodeType())) {
channel.setDeviceId(camera.getId()); // 归属父设备 ID
@@ -1544,7 +1542,7 @@
channel.setVideoCode("h264"); // 写死通道编码格式
// 【新增】构建 rtspUrl - 类型2
String rtspUrl = buildRtspUrlForType2(node);
- channel.setRtspUrl(rtspUrl);
+ channel.setLiveAddress(rtspUrl);
}
channelList.add(channel);
}
--
Gitblit v1.9.3