diff --git a/bin/start-rtsp-server.bat b/bin/start-rtsp-server.bat
new file mode 100644
index 0000000..977208e
--- /dev/null
+++ b/bin/start-rtsp-server.bat
@@ -0,0 +1,20 @@
+@echo off
+echo 启动RTSP测试服务器...
+echo.
+echo 请确保已安装FFmpeg
+echo.
+
+REM 使用FFmpeg创建一个简单的RTSP服务器
+REM 这里使用测试视频文件,你可以替换为实际的视频文件路径
+set VIDEO_FILE=test.mp4
+
+REM 如果没有测试视频,创建一个测试模式
+if not exist "%VIDEO_FILE%" (
+ echo 创建测试视频流...
+ ffmpeg -f lavfi -i testsrc=duration=3600:size=640x480:rate=25 -f rtsp rtsp://localhost:8554/11
+) else (
+ echo 使用视频文件: %VIDEO_FILE%
+ ffmpeg -re -i "%VIDEO_FILE%" -c copy -f rtsp rtsp://localhost:8554/11
+)
+
+pause
\ No newline at end of file
diff --git a/bin/start-rtsp-server.sh b/bin/start-rtsp-server.sh
new file mode 100644
index 0000000..34d3496
--- /dev/null
+++ b/bin/start-rtsp-server.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+echo "启动RTSP测试服务器..."
+echo
+
+# 检查FFmpeg是否安装
+if ! command -v ffmpeg &> /dev/null; then
+ echo "错误: FFmpeg未安装,请先安装FFmpeg"
+ echo "Ubuntu/Debian: sudo apt install ffmpeg"
+ echo "CentOS/RHEL: sudo yum install ffmpeg"
+ exit 1
+fi
+
+# 视频文件路径
+VIDEO_FILE="test.mp4"
+
+# 如果没有测试视频,创建一个测试模式
+if [ ! -f "$VIDEO_FILE" ]; then
+ echo "创建测试视频流..."
+ ffmpeg -f lavfi -i testsrc=duration=3600:size=640x480:rate=25 -c:v libx264 -preset ultrafast -f rtsp rtsp://localhost:8554/11
+else
+ echo "使用视频文件: $VIDEO_FILE"
+ ffmpeg -re -i "$VIDEO_FILE" -c copy -f rtsp rtsp://localhost:8554/11
+fi
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 532173d..c20c466 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,7 +42,7 @@
org.bytedeco
javacv-platform
- 1.5.9
+ 1.5.10
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 37872e7..1450169 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -63,9 +63,8 @@
spring-context
- org.bytedeco
- javacv-platform
- 1.5.9
+ org.springframework
+ spring-context
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index e0a5952..daa28a0 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -152,3 +152,17 @@ mediasServer:
arcFace:
appId: '替换成你的appId'
sdkKey: '替换成你的sdkKey'
+
+# 视频分析配置
+video:
+ # 是否启用AI检测功能
+ detection:
+ enabled: false
+ # RTSP配置
+ rtsp:
+ # 连接超时时间(微秒)
+ timeout: 10000000
+ # 传输协议 tcp/udp
+ transport: tcp
+ # 重试次数
+ retryCount: 3
diff --git a/ruoyi-video/pom.xml b/ruoyi-video/pom.xml
index 7700158..cce0a47 100644
--- a/ruoyi-video/pom.xml
+++ b/ruoyi-video/pom.xml
@@ -18,11 +18,6 @@
-
- org.bytedeco
- javacv-platform
- 1.5.9
-
com.ruoyi
@@ -35,17 +30,17 @@
1.18.24
-
- org.bytedeco
- javacv
- 1.5.5
-
+
+
+
+
+
-
- org.bytedeco
- ffmpeg-platform
- 4.3.2-1.5.5
-
+
+
+
+
+
cn.hutool
@@ -94,12 +89,12 @@
jackson-databind
2.17.1
-
-
- org.bytedeco
- javacv-platform
- 1.5.10
-
+
+
+
+
+
+
@@ -107,6 +102,11 @@
opencv-platform
4.9.0-1.5.10
+
+ org.bytedeco
+ ffmpeg-platform
+ 6.1.1-1.5.10
+
diff --git a/ruoyi-video/src/main/java/com/ruoyi/video/service/impl/InspectionTaskServiceImpl.java b/ruoyi-video/src/main/java/com/ruoyi/video/service/impl/InspectionTaskServiceImpl.java
index 0a2f639..7f92fdf 100644
--- a/ruoyi-video/src/main/java/com/ruoyi/video/service/impl/InspectionTaskServiceImpl.java
+++ b/ruoyi-video/src/main/java/com/ruoyi/video/service/impl/InspectionTaskServiceImpl.java
@@ -181,7 +181,7 @@ public class InspectionTaskServiceImpl implements InspectionTaskService {
// 初始化模型管理器
if (modelManager == null) {
modelManager = new ModelManager();
- URL json = getClass().getResource("/models/models.json");
+ URL json = getClass().getResource("/libs/models/models.json");
if (json != null) {
modelManager.load(json);
}
diff --git a/ruoyi-video/src/main/java/com/ruoyi/video/thread/MediaTransferFlvByJavacv.java b/ruoyi-video/src/main/java/com/ruoyi/video/thread/MediaTransferFlvByJavacv.java
index e76400a..1dc5c76 100644
--- a/ruoyi-video/src/main/java/com/ruoyi/video/thread/MediaTransferFlvByJavacv.java
+++ b/ruoyi-video/src/main/java/com/ruoyi/video/thread/MediaTransferFlvByJavacv.java
@@ -69,7 +69,7 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
/*** ====== 新增:推理相关字段 ====== ***/
// 开关:是否启用检测(可对外提供 setter)
- private boolean enableDetection = true;
+ private boolean enableDetection = false; // 默认关闭,避免启动错误
// 模型与推理
private ModelManager modelManager;
@@ -98,7 +98,12 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
private void initDetectors() throws Exception {
if (!enableDetection) return;
modelManager = new ModelManager();
- URL json = getClass().getResource("/models/models.json");
+ URL json = getClass().getResource("/libs/models/models.json");
+ if (json == null) {
+ log.warn("模型配置文件未找到,禁用检测功能");
+ enableDetection = false;
+ return;
+ }
modelManager.load(json);
// 单模型: detector = modelManager.get("person-helmet");
@@ -130,10 +135,14 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
grabber.setOption("loglevel", "error"); // 稳定后压低日志
if (cameraDto.getUrl().toLowerCase().startsWith("rtsp://")) {
- grabber.setOption("rtsp_transport", "tcp"); // 你要测 UDP 再改
+ // 尝试TCP传输,如果失败则尝试UDP
+ grabber.setOption("rtsp_transport", "tcp");
grabber.setOption("allowed_media_types", "video");
grabber.setOption("max_delay", "500000");
grabber.setOption("user_agent", "Lavf/60");
+ // 添加更多RTSP选项以提高兼容性
+ grabber.setOption("rtsp_flags", "prefer_tcp");
+ grabber.setOption("timeout", "10000000"); // 10秒超时
} else if (cameraDto.getUrl().toLowerCase().startsWith("rtmp://")) {
grabber.setOption("rtmp_buffer", "1000");
} else if ("desktop".equalsIgnoreCase(cameraDto.getUrl())) {
diff --git a/ruoyi-video/src/main/resources/models/detection-config.json b/ruoyi-video/src/main/resources/models/detection-config.json
new file mode 100644
index 0000000..9ab8e10
--- /dev/null
+++ b/ruoyi-video/src/main/resources/models/detection-config.json
@@ -0,0 +1,33 @@
+{
+ "models": [
+ {
+ "name": "yolo",
+ "type": "object_detection",
+ "modelPath": "models/yolo.onnx",
+ "configPath": "models/yolo.cfg",
+ "weightsPath": "models/yolo.weights",
+ "classNames": [
+ "person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck",
+ "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench",
+ "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra",
+ "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
+ "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove",
+ "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup",
+ "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange",
+ "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "sofa",
+ "pottedplant", "bed", "diningtable", "toilet", "tvmonitor", "laptop", "mouse",
+ "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink",
+ "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier",
+ "toothbrush"
+ ],
+ "inputSize": {
+ "width": 640,
+ "height": 640
+ },
+ "threshold": 0.5,
+ "nmsThreshold": 0.4
+ }
+ ],
+ "enabled": true,
+ "defaultModel": "yolo"
+}
\ No newline at end of file