From 63573684595d15f373c869905c24df02c49ddae5 Mon Sep 17 00:00:00 2001
From: JR <3573153686@qq.com>
Date: Fri, 8 Aug 2025 14:35:11 +0800
Subject: [PATCH] =?UTF-8?q?feat(camera):=20=E6=B7=BB=E5=8A=A0=E6=91=84?=
=?UTF-8?q?=E5=83=8F=E5=A4=B4=E6=B5=81=E5=AA=92=E4=BD=93=E6=8B=89=E6=B5=81?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在 CameraConfig 中添加 apiSecret 配置项- 实现摄像头 FLV 流地址生成和自动拉流功能- 添加 fastjson 依赖用于 JSON 解析
- 优化摄像头流媒体管理接口
---
klp-admin/src/main/resources/application.yml | 1 +
.../com/klp/common/config/CameraConfig.java | 1 +
klp-wms/pom.xml | 6 +++
.../WmsCameraManagementController.java | 43 ++++++++++++++-----
4 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/klp-admin/src/main/resources/application.yml b/klp-admin/src/main/resources/application.yml
index bb9b0595..c4ea4a25 100644
--- a/klp-admin/src/main/resources/application.yml
+++ b/klp-admin/src/main/resources/application.yml
@@ -335,3 +335,4 @@ sales:
camera:
media-server-host: http://47.117.71.33:15218 # ZLMediaKit 控制台地址
+ api-secret: kuQV244gFXu7fBev9UBFkm0IrslUC2A9 # 必须与ZLMediaKit的config.ini一致
diff --git a/klp-common/src/main/java/com/klp/common/config/CameraConfig.java b/klp-common/src/main/java/com/klp/common/config/CameraConfig.java
index ed8d3af2..38d7c4ab 100644
--- a/klp-common/src/main/java/com/klp/common/config/CameraConfig.java
+++ b/klp-common/src/main/java/com/klp/common/config/CameraConfig.java
@@ -9,4 +9,5 @@ import org.springframework.stereotype.Component;
@Data
public class CameraConfig {
private String mediaServerHost;
+ private String apiSecret;
}
diff --git a/klp-wms/pom.xml b/klp-wms/pom.xml
index 00773272..0894fdc5 100644
--- a/klp-wms/pom.xml
+++ b/klp-wms/pom.xml
@@ -35,5 +35,11 @@
2.0.29
+
+ com.alibaba
+ fastjson
+ 1.2.83
+
+
diff --git a/klp-wms/src/main/java/com/klp/controller/WmsCameraManagementController.java b/klp-wms/src/main/java/com/klp/controller/WmsCameraManagementController.java
index 2a1d6378..f2060f8f 100644
--- a/klp-wms/src/main/java/com/klp/controller/WmsCameraManagementController.java
+++ b/klp-wms/src/main/java/com/klp/controller/WmsCameraManagementController.java
@@ -1,12 +1,15 @@
package com.klp.controller;
+import java.net.URLEncoder;
import java.util.List;
import java.util.Arrays;
+import com.alibaba.fastjson.JSON;
+import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
+
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
@@ -23,6 +26,7 @@ import com.klp.domain.bo.WmsCameraManagementBo;
import com.klp.service.IWmsCameraManagementService;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.config.CameraConfig;
+import org.springframework.web.client.RestTemplate;
/**
* 摄像头管理
@@ -69,20 +73,39 @@ public class WmsCameraManagementController extends BaseController {
}
/**
- * 获取摄像头FLV流地址(前端可用flv.js播放)
+ * 获取 FLV地址并自动拉流
*/
@GetMapping("/stream/{cameraId}")
public R getCameraStream(@PathVariable Long cameraId) {
+ // 1. 查询摄像头RTSP地址
WmsCameraManagementVo camera = iWmsCameraManagementService.queryById(cameraId);
- if (camera == null) {
- return R.fail("摄像头不存在");
+ if (camera == null || StringUtils.isBlank(camera.getRtspUrl())) {
+ return R.fail("摄像头配置错误");
+ }
+
+ // 2. 生成FLV播放地址
+ String flvUrl = String.format("%s/live/%s.flv",
+ cameraConfig.getMediaServerHost(),
+ camera.getCameraCode());
+
+ // 3. 调用ZLMediaKit拉流
+ String apiUrl = String.format("%s/index/api/addStreamProxy?&vhost=__defaultVhost__&app=live&stream=%s&url=%s&secret=%s",
+ cameraConfig.getMediaServerHost(),
+ camera.getCameraCode(),
+ camera.getRtspUrl(),
+ cameraConfig.getApiSecret());
+ System.out.println("拉流API地址: " + apiUrl);
+
+ try {
+ String result = new RestTemplate().getForObject(apiUrl, String.class);
+ if (!JSON.parseObject(result).getInteger("code").equals(0)) {
+ return R.fail("拉流失败: " + JSON.parseObject(result).getString("msg"));
+ }
+ camera.setHttpFmp4(flvUrl);
+ return R.ok(camera);
+ } catch (Exception e) {
+ return R.fail("API调用失败: " + e.getMessage());
}
- // 组装ZLMediaKit的FLV播放地址
- String app = "live";
- String stream = camera.getCameraCode();
- String flvUrl = cameraConfig.getMediaServerHost() + "/" + app + "/" + stream + ".flv";
- camera.setHttpFmp4(flvUrl); // 复用已有字段存flvUrl,前端用httpFmp4字段接收
- return R.ok(camera);
}
/**