From 9958bc1501d0daee954d9bba383475e55e24ebab Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Thu, 14 May 2026 08:18:07 +0800
Subject: [PATCH] 优化
---
ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java | 83 +++++++++++++++++++++++++++++++++++++++--
1 files changed, 78 insertions(+), 5 deletions(-)
diff --git a/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java b/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java
index e6c636f..e95947c 100644
--- a/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java
+++ b/ard-modules/ard-modules-zlm/src/main/java/com/ard/zlm/service/impl/MediaServerServiceImpl.java
@@ -8,10 +8,13 @@
import com.ard.common.core.domain.RtpServerParam;
import com.ard.common.core.enums.LiveStreamType;
import com.ard.common.core.utils.DateUtils;
+import com.ard.common.core.utils.file.FileMultipartFile;
import com.ard.gb28181.api.RemoteGb28181Service;
import com.ard.gb28181.api.domain.Device;
import com.ard.qs.api.RemoteQsDeviceService;
import com.ard.qs.api.domain.QsDevice;
+import com.ard.system.api.RemoteFileService;
+import com.ard.system.api.domain.SysFile;
import com.ard.work.api.RemoteCameraService;
import com.ard.work.api.RemoteChannelService;
import com.ard.work.api.domian.ArdChannel;
@@ -50,7 +53,12 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.DigestUtils;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
+import java.io.FileInputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.util.*;
/**
@@ -64,7 +72,8 @@
@Slf4j
@Service
public class MediaServerServiceImpl implements IMediaServerService {
-
+ @Resource
+ private RemoteFileService remoteFileService;
@Resource
private MediaServerMapper mediaServerMapper;
@@ -787,6 +796,28 @@
* @param app app
* @param stream 流id
*/
+ //@Override
+// public String snapOnPlay1(ZlmMediaServer mediaServer, String app, String stream) {
+// String fileName = app + "-" + stream + ".jpg";
+// // 请求截图
+// log.info("[请求截图]: " + fileName);
+//
+// IMediaNodeServerService mediaNodeServerService = nodeServerServiceMap.get(mediaServer.getType());
+// if (mediaNodeServerService == null) {
+// log.info("[getSnap] 失败, mediaServer的类型: {},未找到对应的实现类", mediaServer.getType());
+// throw new RuntimeException("[getSnap] 失败, mediaServer的类型: " + mediaServer.getType() + ",未找到对应的实现类");
+// }
+// String filePath = fileDomain + filePrefix + "/snap/" + fileName;
+// mediaNodeServerService.getSnap(mediaServer, app, stream, 30, 300, this.filePath + "/snap", fileName);
+// return filePath;
+// }
+ /**
+ * 点播成功时调用截图
+ *
+ * @param mediaServer media
+ * @param app app
+ * @param stream 流id
+ */
@Override
public String snapOnPlay(ZlmMediaServer mediaServer, String app, String stream) {
String fileName = app + "-" + stream + ".jpg";
@@ -798,11 +829,53 @@
log.info("[getSnap] 失败, mediaServer的类型: {},未找到对应的实现类", mediaServer.getType());
throw new RuntimeException("[getSnap] 失败, mediaServer的类型: " + mediaServer.getType() + ",未找到对应的实现类");
}
- String filePath = fileDomain + filePrefix + "/snap/" + fileName;
- mediaNodeServerService.getSnap(mediaServer, app, stream, 30, 300, this.filePath + "/snap", fileName);
- return filePath;
- }
+ // 生成临时文件路径(用于 FFmpeg 截图)
+ String tempDir = System.getProperty("java.io.tmpdir") + "/snap_temp/";
+ File tempDirFile = new File(tempDir);
+ if (!tempDirFile.exists()) {
+ tempDirFile.mkdirs();
+ }
+ String tempFilePath = tempDir + fileName;
+
+ try {
+ // 1. 获取截图到临时文件
+ mediaNodeServerService.getSnap(mediaServer, app, stream, 30, 300, tempDir, fileName);
+ // 2. 检查临时文件是否存在
+ File tempFile = new File(tempFilePath);
+ if (!tempFile.exists()) {
+ log.error("[截图失败] 临时文件不存在: {}", tempFilePath);
+ return null;
+ }
+
+ // 3. 使用 FileMultipartFile 转换为 MultipartFile
+ MultipartFile multipartFile = new FileMultipartFile(
+ tempFile,
+ fileName,
+ "image/jpeg"
+ );
+
+ // 3. 调用文件上传接口,上传到 MinIO(bucketName 可以固定为 "snap" 或动态传入)
+ R<SysFile> result = remoteFileService.upload(multipartFile, "snap");
+
+ // 4. 清理临时文件
+ Files.deleteIfExists(Paths.get(tempFilePath));
+
+ // 5. 返回 URL
+ if (result.getCode() == Constants.SUCCESS && result.getData() != null) {
+ String url = result.getData().getUrl();
+ log.info("[截图上传成功] URL: {}", url);
+ return url;
+ } else {
+ log.error("[截图上传失败] {}", result.getMsg());
+ return null;
+ }
+
+ } catch (Exception e) {
+ log.error("[截图失败] ", e);
+ return null;
+ }
+ }
/**
* 获取截图
*
--
Gitblit v1.9.3