From 1f7962d0545de446e96ccaa81b33bbf71a69b41b Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 星期三, 06 九月 2023 12:29:26 +0800
Subject: [PATCH] 增加sdk接口getGisInfo 调整ptz的websocket上传增加视场角

---
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java                         |   14 +
 ard-work/src/main/java/com/ruoyi/inspect/mapper/ArdVideoInspectRecordMapper.java            |    4 
 ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectRecordServiceImpl.java |    9 
 ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java                               |   11 -
 ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java                                |    6 
 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java                               |    8 
 ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java                            |   47 +++++
 ruoyi-ui/package-lock.json                                                                  |  145 ++++++++++++++++++++
 ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java               |    2 
 ard-work/src/main/resources/templates/preview.html                                          |   26 ++-
 ruoyi-ui/package.json                                                                       |    1 
 ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java                |    9 +
 ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java       |   52 ++++++
 lib/mediamtx/mediamtx.exe                                                                   |    0 
 ruoyi-ui/node_modules/.package-lock.json                                                    |   75 ++++++++++
 ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectRecordController.java    |    3 
 lib/mediamtx/mediamtx.yml                                                                   |    2 
 17 files changed, 359 insertions(+), 55 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
index a0f602b..6d48ea2 100644
--- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
+++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/controller/SdkController.java
@@ -326,4 +326,13 @@
         String path = sdk.record(cmd);
         return toAjaxString(path, "鎵嬪姩褰曞儚");
     }
+    @ApiOperation("鑾峰彇鐩告満鏋惰鍙傛暟")
+    @PostMapping("/getCameraSetupCFG")
+    @Log(title = "鑾峰彇鐩告満鏋惰鍙傛暟", businessType = BusinessType.CONTROL)
+    @ApiOperationSupport(includeParameters = {"cmd.cameraId", "cmd.channelNum", "cmd.enable"})
+    public @ResponseBody
+    AjaxResult getCameraSetupCFG(@RequestBody CameraCmd cmd) {
+        cmd.setOperator(SecurityUtils.getUserId());
+        return AjaxResult.success(sdk.getGisInfo(cmd));
+    }
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java
index a1baa8f..d3dbd9f 100644
--- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java
+++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/sdk/HCNetSDK.java
@@ -530,9 +530,9 @@
     public static final int NET_DVR_SET_DDNSCFG_EX = 275;//璁剧疆鎵╁睍DDNS鍙傛暟
     public static final int NET_DVR_SET_PTZPOS = 292;    //浜戝彴璁剧疆PTZ浣嶇疆
     public static final int NET_DVR_GET_PTZPOS = 293;    //浜戝彴鑾峰彇PTZ浣嶇疆
-    public static final int NET_DVR_SET_PTZLOCKCFG=3288;//璁剧疆浜戝彴閿佸畾淇℃伅
-    public static final int NET_DVR_GET_PTZLOCKCFG=3287;//鑾峰彇浜戝彴閿佸畾淇℃伅
-    public static final int NET_DVR_PTZ_INITIALPOSITIONCTRL=3283;//闆舵柟浣嶈鎺у埗
+    public static final int NET_DVR_SET_PTZLOCKCFG = 3288;//璁剧疆浜戝彴閿佸畾淇℃伅
+    public static final int NET_DVR_GET_PTZLOCKCFG = 3287;//鑾峰彇浜戝彴閿佸畾淇℃伅
+    public static final int NET_DVR_PTZ_INITIALPOSITIONCTRL = 3283;//闆舵柟浣嶈鎺у埗
     public static final int NET_DVR_GET_PTZSCOPE = 294;//浜戝彴鑾峰彇PTZ鑼冨洿
     public static final int NET_DVR_SET_BASICPARAMCFG = 3271;//璁剧疆PTZ鍩烘湰鍙傛暟淇℃伅
     public static final int NET_DVR_COMPLETE_RESTORE_CTRL = 3420;    //璁剧疆瀹屽叏鎭㈠鍑哄巶鍊�
@@ -717,6 +717,7 @@
     public static final int NET_DVR_GET_CURTRIGGERMODE = 3130;   //鑾峰彇璁惧褰撳墠瑙﹀彂妯″紡
     public static final int NET_ITC_GET_TRIGGERCFG = 3003;  //鑾峰彇瑙﹀彂鍙傛暟
     public static final int NET_ITC_SET_TRIGGERCFG = 3004;  //璁剧疆瑙﹀彂鍙傛暟
+    public static final int NET_DVR_CAMERA_SETUPCFG = 3007;  //鑾峰彇鐩告満鏋惰鍙傛暟
     public static final int NET_ITC_GET_VIDEO_TRIGGERCFG = 3017;  //鑾峰彇瑙嗛鐢佃瑙﹀彂鍙傛暟
     public static final int NET_ITC_SET_VIDEO_TRIGGERCFG = 3018;  //璁剧疆瑙嗛鐢佃瑙﹀彂鍙傛暟
 
@@ -3781,19 +3782,43 @@
         public short wTiltPos;//鍨傜洿鍙傛暟
         public short wZoomPos;//鍙樺�嶅弬鏁�
     }
+
     //PTZ閿佸畾淇℃伅
     public static class NET_DVR_PTZ_LOCKCFG extends HIKSDKStructure {
         public int dwSize;//缁撴瀯浣撳ぇ灏�
         public byte byWorkMode;//浜戝彴閿佸畾鎺у埗锛�0- 瑙i攣锛�1- 閿佸畾
         public byte[] byRes = new byte[127];
     }
+
+    //鐩告満鏋惰淇℃伅
+    public static class NET_DVR_GET_CAMERA_SETUPCFG extends HIKSDKStructure {
+        public int dwSize;//缁撴瀯浣撳ぇ灏�
+        public short wSetupHeight;//鏋惰楂樺害锛屽彇鍊艰寖鍥达細[0,20]
+        public byte byLensType;//闀滃ご鐒﹁窛绫诲瀷锛�0- 鏈煡锛�1- 8mm锛�2- 12mm锛�3- 16mm锛�4- 25mm锛�5- 35mm锛�6- 50mm
+        public byte bySetupHeightUnit;//鏋惰楂樺害鍗曚綅锛�0- 绫�(m)锛�1- 鍘樼背(cm)
+        public int dwSceneDis;//鍥惧儚涓嬭竟缂樹綅缃笌鐩告満涔嬮棿鐨勬按骞宠窛绂伙紝鍗曚綅锛氬帢绫�
+        public float fPitchAngle;//鐩告満淇话瑙掑害锛屽彇鍊艰寖鍥达細[-180, 180]锛屽崟浣嶏細搴�
+        public float fInclineAngle;//鐩告満鍊炬枩瑙掑害锛屽彇鍊艰寖鍥达細[-180, 180]锛屽崟浣嶏細搴�
+        public float fRotateAngle;//鐩告満鏃嬭浆瑙掑害锛屽彇鍊艰寖鍥达細[-180, 180]锛屽崟浣嶏細搴�
+        public short wVideoDetCoefficient;//瑙嗛娴嬭瘯绯绘暟锛屽彇鍊艰寖鍥达細[0,300]
+        public byte byErectMethod;//鏋惰鏂瑰紡锛�0-姝h锛�1-渚ц
+        public byte byCameraViewAngle;//鎽勫儚鏈哄畨瑁呰閲庤搴︼細0- 鍨傜洿锛堥粯璁わ級锛�1- 鍊炬枩
+        public int dwHorizontalDistance;//鎽勫儚鏈轰笌鍑哄叆鍙f按骞宠窛绂伙紝鍙栧�艰寖鍥达細1~1000锛岄粯璁わ細30锛屽崟浣嶏細cm锛屾憚鍍忔満瑙掑害涓哄�炬枩鏃舵湁鏁�
+        public byte byDetailLensType;//闀滃ご绫诲瀷锛屽彇鍊艰寖鍥达細1~100锛岄粯璁わ細28锛屽崟浣嶏細0.1mm
+        public byte[] byRes = new byte[3];
+        public float fHorFieldAngle;//鎽勫儚鏈烘按骞宠鍦鸿瑙掑害锛屽彇鍊艰寖鍥达細[0,360]锛屽崟浣嶏細搴�
+        public float fVerFieldAngle;//鎽勫儚鏈哄瀭鐩磋鍦鸿瑙掑害锛屽彇鍊艰寖鍥达細[0,360]锛屽崟浣嶏細搴�
+        public byte[] byRes1 = new byte[24];
+    }
+
     //闆舵柟浣嶈鎺у埗淇℃伅
     public static class NET_DVR_INITIALPOSITIONCTRL extends HIKSDKStructure {
-        public int dwSize ;//缁撴瀯浣撳ぇ灏�
+        public int dwSize;//缁撴瀯浣撳ぇ灏�
         public short dwChan;//璁惧閫氶亾鍙�
         public byte byWorkMode;//宸ヤ綔妯″紡锛�0- 璁剧疆锛�1- 璋冪敤锛�2- 娓呴櫎
         public byte[] byRes = new byte[127];
     }
+
     //鐞冩満浣嶇疆淇℃伅
     public static class NET_DVR_PTZ_BASICPARAMCFG extends HIKSDKStructure {
         public short dwSize;//缁撴瀯浣撳ぇ灏�
@@ -10243,14 +10268,16 @@
     boolean NET_DVR_InquiryRecordTimeSpan(int lUserID, int dwChannel, NET_DVR_RECORD_TIME_SPAN_INQUIRY lpInquiry, NET_DVR_RECORD_TIME_SPAN lpResult);
 
     boolean NET_DVR_StartGetDevState(NET_DVR_CHECK_DEV_STATE pParams);
+
     //寮哄埗I甯у弬鏁扮粨鏋勪綋銆�
-    public static class NET_DVR_I_FRAME extends HIKSDKStructure{
+    public static class NET_DVR_I_FRAME extends HIKSDKStructure {
         public int dwSize;
         public byte[] sStreamID = new byte[32];  //娴両Ds    SDK 涓  STREAM_ID_LEN杩涜浜嗗畾涔夛紝璧嬪��32
         public int dwChannel;//閫氶亾鍙�
         public byte byStreamType; //鐮佹祦绫诲瀷锛�0-涓荤爜娴侊紝1-瀛愮爜娴侊紝2-鐮佹祦3锛�3-铏氭嫙鐮佹祦锛屼互姝ょ被鎺�
         public byte[] byRes = new byte[63];  //淇濈暀锛岀疆涓�0    鎸夌収SDK瑕佹眰杩涜瀵瑰簲璧嬪��
     }
+
     //gps鐩稿叧缁撴瀯瀹氫箟
     public static class TimeSegParam extends HIKSDKStructure {
         //GPS鏁版嵁鏌ユ壘璧峰鏃堕棿
@@ -10521,8 +10548,8 @@
     }
 
     public static final int NET_DVR_GET_GISINFO = 3711;
-    //GIS淇℃伅
 
+    //GIS淇℃伅
     public static class NET_DVR_GIS_INFO extends HIKSDKStructure {
         public int dwSize;
         public float fAzimuth;
@@ -10544,6 +10571,13 @@
         public float fMinVerticalValue;
         public float fMaxVerticalValue;
         public byte[] byRes = new byte[220];
+    }
+
+    public static class NET_DVR_CHANNEL extends HIKSDKStructure {
+        public short wDVRPort;
+        public byte[] byRes1 = new byte[2];
+        public int dwChannel;
+        public byte[] byRes2 = new byte[32];
     }
 
     //GBT28181鍗忚鐨勮澶囩紪鐮侀�氶亾閰嶇疆
@@ -10584,6 +10618,7 @@
         public byte[] byRes = new byte[6];
     }
 }
+
 //鎾斁搴撳嚱鏁板0鏄�,PlayCtrl.dll
 interface PlayCtrl extends Library {
     public static final int STREAME_REALTIME = 0;
diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
index 4826aba..95464a3 100644
--- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
+++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/IHikClientService.java
@@ -109,4 +109,6 @@
 
     //鑾峰彇鐩告満閫氶亾淇℃伅
     public List<ArdChannel> getCameraChannelList(ArdCameras camera);
+    //鑾峰彇GIS淇℃伅鏁版嵁
+    public Map<String,Object> getGisInfo(CameraCmd cmd);
 }
diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
index a051843..d03fb83 100644
--- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -385,8 +385,8 @@
         NET_DVR_FOCUSMODE_CFG focusmodeCfg = new NET_DVR_FOCUSMODE_CFG();
         Pointer point = focusmodeCfg.getPointer();
         IntByReference ibrBytesReturned = new IntByReference(0);
-        focusmodeCfg.byFocusMode=1;
-        focusmodeCfg.byAutoFocusMode=0;
+        focusmodeCfg.byFocusMode = 1;
+        focusmodeCfg.byAutoFocusMode = 0;
         focusmodeCfg.write();
         boolean bool = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_FOCUSMODECFG, channelNum, point, focusmodeCfg.size(), ibrBytesReturned);
         if (bool) {
@@ -975,6 +975,7 @@
         log.debug("璁剧疆鑱氱劍妯″紡鎴愬姛");
         return bool;
     }
+
     /**
      * @鎻忚堪 鑾峰彇鑱氱劍妯″紡
      * @鍙傛暟 [userId, channelNum]
@@ -1343,7 +1344,7 @@
             log.debug("褰曞儚鍋滄");
             //瀛樺叆minio
             String BucketName = cmd.getRecordBucketName();
-            String ObjectName = cmd.getRecordObjectName()+".mp4";
+            String ObjectName = cmd.getRecordObjectName() + ".mp4";
             FileInputStream stream = new FileInputStream(path);
             boolean b = MinioUtil.uploadObject(BucketName, ObjectName, stream, stream.available(), "video/MP4");
             if (b) {
@@ -1409,7 +1410,7 @@
                 // 鑾峰彇閫氶亾鍙�
                 for (int iChannum = 0; iChannum < chanNum; iChannum++) {
                     ArdChannel ardChannel = new ArdChannel();
-                    int channum = iChannum + startDChan+1;
+                    int channum = iChannum + startDChan + 1;
                     HCNetSDK.NET_DVR_PICCFG_V40 strPicCfg = new HCNetSDK.NET_DVR_PICCFG_V40();
                     strPicCfg.dwSize = strPicCfg.size();
                     strPicCfg.write();
@@ -1433,4 +1434,47 @@
         }
         return channelList;
     }
+
+    /**
+     * @鎻忚堪 鑾峰彇GIS淇℃伅鏁版嵁
+     * @鍙傛暟 [userId, channelNum]
+     * @杩斿洖鍊� boolean
+     * @鍒涘缓浜� 鍒樿嫃涔�
+     * @鍒涘缓鏃堕棿 2023/1/17 16:36
+     * @淇敼浜哄拰鍏跺畠淇℃伅 0-瑙i攣 1-閿佸畾
+     */
+    @Override
+    public Map<String, Object> getGisInfo(CameraCmd cmd) {
+        String cameraId = cmd.getCameraId();
+        Integer channelNum = cmd.getChannelNum();
+        if (!GlobalVariable.loginMap.containsKey(cameraId)) {
+            return new HashMap<>();
+        }
+        // 鑾峰彇鍙傛暟
+        Integer userId = GlobalVariable.loginMap.get(cameraId);
+        HCNetSDK.NET_DVR_STD_CONFIG struStdCfg = new HCNetSDK.NET_DVR_STD_CONFIG();
+        HCNetSDK.NET_DVR_GIS_INFO struGisInfo = new HCNetSDK.NET_DVR_GIS_INFO();
+        struStdCfg.read();
+        IntByReference lchannel = new IntByReference(channelNum);
+        struStdCfg.lpCondBuffer = lchannel.getPointer();
+        struStdCfg.dwCondSize = 4;
+        struStdCfg.lpOutBuffer = struGisInfo.getPointer();
+        struStdCfg.dwOutSize = struGisInfo.size();
+        struStdCfg.write();//璁剧疆鍓嶄箣鍓嶈write()
+        boolean bool = hCNetSDK.NET_DVR_GetSTDConfig(userId, NET_DVR_GET_GISINFO, struStdCfg);
+        if (!bool) {
+            int code = hCNetSDK.NET_DVR_GetLastError();
+            log.error("鑾峰彇GIS淇℃伅鏁版嵁澶辫触,璇风◢鍚庨噸璇�" + code);
+            return new HashMap<>();
+        } else {
+            struGisInfo.read();
+            Map<String, Object> map = new HashMap<>();
+            map.put("p", struGisInfo.struPtzPos.fPanPos);
+            map.put("t", struGisInfo.struPtzPos.fTiltPos<0?struGisInfo.struPtzPos.fTiltPos+360:struGisInfo.struPtzPos.fTiltPos);
+            map.put("z", struGisInfo.struPtzPos.fZoomPos);
+            map.put("fHorFieldAngle", struGisInfo.fHorizontalValue);// 姘村钩瑙嗗満瑙�
+            map.put("fVerFieldAngle", struGisInfo.fVerticalValue);// 鍨傜洿瑙嗗満瑙�
+            return map;
+        }
+    }
 }
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectRecordController.java b/ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectRecordController.java
index fbd225b..6455a6b 100644
--- a/ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectRecordController.java
+++ b/ard-work/src/main/java/com/ruoyi/inspect/controller/ArdVideoInspectRecordController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.inspect.controller;
 
+import java.util.HashMap;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
@@ -42,7 +43,7 @@
     @GetMapping("/listByStartTime")
     public TableDataInfo listByStartTime(ArdVideoInspectRecord ardVideoInspectRecord) {
         startPage();
-        List list = ardVideoInspectRecordService.selectArdVideoInspectRecordListByStartTime(ardVideoInspectRecord);
+        List<HashMap> list = ardVideoInspectRecordService.selectArdVideoInspectRecordListByStartTime(ardVideoInspectRecord);
         return getDataTable(list);
     }
 
diff --git a/ard-work/src/main/java/com/ruoyi/inspect/mapper/ArdVideoInspectRecordMapper.java b/ard-work/src/main/java/com/ruoyi/inspect/mapper/ArdVideoInspectRecordMapper.java
index 7ff8fea..cb938b8 100644
--- a/ard-work/src/main/java/com/ruoyi/inspect/mapper/ArdVideoInspectRecordMapper.java
+++ b/ard-work/src/main/java/com/ruoyi/inspect/mapper/ArdVideoInspectRecordMapper.java
@@ -1,5 +1,6 @@
 package com.ruoyi.inspect.mapper;
 
+import java.util.HashMap;
 import java.util.List;
 import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
 
@@ -26,8 +27,9 @@
      * @return 瑙嗛宸℃璁板綍闆嗗悎
      */
     public List<ArdVideoInspectRecord> selectArdVideoInspectRecordList(ArdVideoInspectRecord ardVideoInspectRecord);
+
     @SuppressWarnings("MybatisXMapperMethodInspection")
-    public List selectArdVideoInspectRecordListByStartTime(ArdVideoInspectRecord ardVideoInspectRecord);
+    public List<HashMap> selectArdVideoInspectRecordListByStartTime(ArdVideoInspectRecord ardVideoInspectRecord);
 
     /**
      * 鏂板瑙嗛宸℃璁板綍
diff --git a/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectRecordServiceImpl.java b/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectRecordServiceImpl.java
index c33dfa4..1b00910 100644
--- a/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectRecordServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectRecordServiceImpl.java
@@ -1,13 +1,12 @@
 package com.ruoyi.inspect.service.impl;
 
+import java.util.HashMap;
 import java.util.List;
-
-import com.ruoyi.common.utils.SecurityUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.inspect.mapper.ArdVideoInspectRecordMapper;
 import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
 import com.ruoyi.inspect.service.IArdVideoInspectRecordService;
+import javax.annotation.Resource;
 
 /**
  * 瑙嗛宸℃璁板綍Service涓氬姟灞傚鐞�
@@ -17,7 +16,7 @@
  */
 @Service
 public class ArdVideoInspectRecordServiceImpl implements IArdVideoInspectRecordService {
-    @Autowired
+    @Resource
     private ArdVideoInspectRecordMapper ardVideoInspectRecordMapper;
 
     /**
@@ -43,7 +42,7 @@
     }
 
     @Override
-    public List selectArdVideoInspectRecordListByStartTime(ArdVideoInspectRecord ardVideoInspectRecord) {
+    public List<HashMap>  selectArdVideoInspectRecordListByStartTime(ArdVideoInspectRecord ardVideoInspectRecord) {
         return ardVideoInspectRecordMapper.selectArdVideoInspectRecordListByStartTime(ardVideoInspectRecord);
     }
 
diff --git a/ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java b/ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java
index 4a93637..2dcf2b0 100644
--- a/ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java
+++ b/ard-work/src/main/java/com/ruoyi/test/ReadAccessDatabase.java
@@ -8,19 +8,10 @@
  * @Version: 1.0
  **/
 
-import com.ruoyi.common.utils.ConfigUtils;
-import com.ruoyi.common.utils.DictUtils;
-import com.ruoyi.common.utils.file.ImageUtils;
-import com.sun.imageio.plugins.common.ImageUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
 import java.sql.*;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+
 
 @Slf4j
 @Component
diff --git a/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java b/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
index c13197b..6a2b4db 100644
--- a/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
+++ b/ard-work/src/main/java/com/ruoyi/utils/forest/UavClient.java
@@ -12,13 +12,13 @@
     public static String IP = "http://112.98.126.2:7030/";
 
     @Get(IP + "${url}")
-    String GET(@DataVariable("url") String url, @Header("x-auth-token") String token, @JSONBody String body);
+    String GET(@Var("url") String url, @Header("x-auth-token") String token, @JSONBody String body);
 
     @Post(IP + "${url}")
-    String POST(@DataVariable("url") String url,  @Header("x-auth-token")  String token, @JSONBody String body);
+    String POST(@Var("url") String url,  @Header("x-auth-token")  String token, @JSONBody String body);
 
     @Delete(IP + "${url}")
-    String DELETE(@DataVariable("url") String url,  @Header("x-auth-token") String token, @JSONBody String body);
+    String DELETE(@Var("url") String url,  @Header("x-auth-token") String token, @JSONBody String body);
 
 
 
diff --git a/ard-work/src/main/resources/templates/preview.html b/ard-work/src/main/resources/templates/preview.html
index 9845351..1a57d63 100644
--- a/ard-work/src/main/resources/templates/preview.html
+++ b/ard-work/src/main/resources/templates/preview.html
@@ -132,11 +132,11 @@
             video.addEventListener('loadedmetadata', function () {
                 adjustGridItemSize(gridItem, gridItem.videoWidth, gridItem.videoHeight);
             });
-            video.addEventListener("click", function() {
+            video.addEventListener("click", function () {
                 loadingMessage.style.display = "block";
-                video.play().then(function() {
+                video.play().then(function () {
                     loadingMessage.style.display = "none";
-                }).catch(function(error) {
+                }).catch(function (error) {
                     console.error("Error playing the video:", error);
                     loadingMessage.style.display = "none";
                 });
@@ -148,18 +148,19 @@
     }
 
 
+    let mediamtxHost = "192.168.1.12"
     var chanMap = new Map();
     window.onload = function () {
         changeGrid(2, 2);
-        chanMap.set("video1", "http://127.0.0.1:8889/164/");
-        chanMap.set("video2", "http://127.0.0.1:8889/165/");
-        chanMap.set("video3", "http://127.0.0.1:8889/245/");
-        chanMap.set("video4", "http://127.0.0.1:8889/164/");
-        chanMap.set("video5", "http://127.0.0.1:8889/165/");
-        chanMap.set("video6", "http://127.0.0.1:8889/245/");
-        chanMap.set("video7", "http://127.0.0.1:8889/164/");
-        chanMap.set("video8", "http://127.0.0.1:8889/165/");
-        chanMap.set("video9", "http://127.0.0.1:8889/245/");
+        chanMap.set("video1", "http://" + mediamtxHost + ":8889/164/");
+        chanMap.set("video2", "http://" + mediamtxHost + ":8889/165/");
+        chanMap.set("video3", "http://" + mediamtxHost + ":8889/245/");
+        chanMap.set("video4", "http://" + mediamtxHost + ":8889/164/");
+        chanMap.set("video5", "http://" + mediamtxHost + ":8889/165/");
+        chanMap.set("video6", "http://" + mediamtxHost + ":8889/245/");
+        chanMap.set("video7", "http://" + mediamtxHost + ":8889/164/");
+        chanMap.set("video8", "http://" + mediamtxHost + ":8889/165/");
+        chanMap.set("video9", "http://" + mediamtxHost + ":8889/245/");
         console.log(chanMap);
     }
     const linkToIceServers = (links) => (
@@ -421,6 +422,7 @@
         })
     }
 
+
 </script>
 </body>
 </html>
diff --git a/lib/mediamtx/mediamtx.exe b/lib/mediamtx/mediamtx.exe
index 69dc5b3..eebaa64 100644
--- a/lib/mediamtx/mediamtx.exe
+++ b/lib/mediamtx/mediamtx.exe
Binary files differ
diff --git a/lib/mediamtx/mediamtx.yml b/lib/mediamtx/mediamtx.yml
index 9598640..4be3390 100644
--- a/lib/mediamtx/mediamtx.yml
+++ b/lib/mediamtx/mediamtx.yml
@@ -207,7 +207,7 @@
   # needed when server and clients are on different LANs.
   # TURN/TURNS servers are needed when a direct connection between server and
   # clients is not possible. All traffic is routed through them. stun:stun.l.google.com:19302
-- url: stun:stun.l.google.com:19302
+- url: stun:192.168.1.15:3478
   # if user is "AUTH_SECRET", then authentication is secret based.
   # the secret must be inserted into the password field.
   username: ''
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java
index a009f10..7ec73cc 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RongCloudTask.java
@@ -39,12 +39,16 @@
             List<SysUser> SysUserList = sysUserService.selectAllAppUserList(new SysUser());
             if (SysUserList.size() > 0) {
                 for (SysUser sysUser : SysUserList) {
-                    Boolean appOnlineState = sysUser.getAppOnlineState().equals("1");
-                    Boolean online = rongCloudService.checkOnline(sysUser.getUserId());
-                    if (!appOnlineState.equals(online)) {
-                        sysUser.setAppOnlineState(online ? "1" : "0");
-                        sysUserService.updateUserProfile(sysUser);
+                    String state = sysUser.getAppOnlineState();//鑾峰彇褰撳墠鐢ㄦ埛鐨勫湪绾跨姸鎬�
+                    Boolean online = rongCloudService.checkOnline(sysUser.getUserId());//浠庤瀺浜戣幏鍙栧湪绾跨姸鎬�
+                    if (state != null) {
+                        Boolean appOnlineState = state.equals("1");
+                        if (appOnlineState == online) {
+                            continue;
+                        }
                     }
+                    sysUser.setAppOnlineState(online ? "1" : "0");
+                    sysUserService.updateUserProfile(sysUser);
                 }
             }
         } catch (Exception ex) {
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java
index ae59c72..e477f43 100644
--- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/SdkTask.java
@@ -41,12 +41,14 @@
             RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
             IHikClientService hikClientService = SpringUtils.getBean(IHikClientService.class);
             List<Map<String, Object>> list = new ArrayList<>();
-            ArdCameras ardCameras = new ArdCameras();
-            ardCameras.setGdtype("1");
             List<Object> Objects = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY);
             if (Objects.size() > 0) {
                 for (Object obj : Objects) {
                     ArdCameras camera = (ArdCameras) obj;
+                    if(!"1".equals(camera.getGdtype()))
+                    {
+                        continue;
+                    }
                     CameraCmd cmd = new CameraCmd();
                     cmd.setCameraId(camera.getId());
                     cmd.setChannelNum(1);
@@ -55,7 +57,7 @@
                     {
                         continue;
                     }
-                    Map<String, Object> ptz = hikClientService.getPtz(cmd);
+                    Map<String, Object> ptz = hikClientService.getGisInfo(cmd);
                     if (StringUtils.isNull(ptz)) {
                         continue;
                     }
diff --git a/ruoyi-ui/node_modules/.package-lock.json b/ruoyi-ui/node_modules/.package-lock.json
index 863e3c8..92b1ef7 100644
--- a/ruoyi-ui/node_modules/.package-lock.json
+++ b/ruoyi-ui/node_modules/.package-lock.json
@@ -1750,6 +1750,25 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@dailymotion/vast-client": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@dailymotion/vast-client/-/vast-client-4.0.1.tgz",
+      "integrity": "sha512-oRUCc06bWdX/1f2Eha/od5WCj+MLHiD6rgyAudgjOUyWXhCcbkUTZeejBSQsLft0nFnd+5nrDqGkBD8mrEVd/Q==",
+      "dependencies": {
+        "@xmldom/xmldom": "^0.8.3"
+      },
+      "engines": {
+        "node": ">=12.22.1"
+      }
+    },
+    "node_modules/@dailymotion/vmap": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@dailymotion/vmap/-/vmap-3.3.1.tgz",
+      "integrity": "sha512-0+JbHbK/ePKtQYAyrZWr7q/ec2hA355hOm5qwlNUt175ml6IBqKsSSjpz9cLe+0sYCKZGega7ED6gc+uoR5pbQ==",
+      "engines": {
+        "node": ">=12.22.1"
+      }
+    },
     "node_modules/@eslint/eslintrc": {
       "version": "0.2.2",
       "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
@@ -1813,6 +1832,53 @@
       "engines": {
         "node": ">=8"
       }
+    },
+    "node_modules/@eyevinn/csai-manager": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@eyevinn/csai-manager/-/csai-manager-0.1.2.tgz",
+      "integrity": "sha512-ZehCxXlSIHF5Ej1n/WZEaLa6sLIH5zrE1ZB71yyT/KbFoeDsDDoo+jw61xzzT+pKBb4vNBtKQRgaVDGZdT2L/g==",
+      "dependencies": {
+        "@dailymotion/vast-client": "^4.0.0",
+        "@dailymotion/vmap": "^3.3.0",
+        "@eyevinn/video-event-filter": "^2.0.0",
+        "mitt": "^3.0.0"
+      }
+    },
+    "node_modules/@eyevinn/csai-manager/node_modules/mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
+    },
+    "node_modules/@eyevinn/video-event-filter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@eyevinn/video-event-filter/-/video-event-filter-2.0.0.tgz",
+      "integrity": "sha512-S5pECmymqg7WqlAeerhtPVEFxWhLY3cz3DTuhuljZreVDLnEBV6/DlWI6SWDnKdpDJMgD6VjPfaRJssmGatNBg==",
+      "dependencies": {
+        "mitt": "^2.1.0"
+      }
+    },
+    "node_modules/@eyevinn/video-event-filter/node_modules/mitt": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz",
+      "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg=="
+    },
+    "node_modules/@eyevinn/webrtc-player": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@eyevinn/webrtc-player/-/webrtc-player-0.12.0.tgz",
+      "integrity": "sha512-xzb0wl/wVmuzv4yvOF3+fUtvv14oj9+pQ0Va0CTBAz2VYRsVdqtDacwq8aMolfsDqdwIyouj5Qji5XWz9tdW3A==",
+      "dependencies": {
+        "@eyevinn/csai-manager": "^0.1.2",
+        "@eyevinn/whpp-client": "^0.1.2",
+        "events": "^3.3.0"
+      },
+      "engines": {
+        "node": ">=18.15.0"
+      }
+    },
+    "node_modules/@eyevinn/whpp-client": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@eyevinn/whpp-client/-/whpp-client-0.1.2.tgz",
+      "integrity": "sha512-Mau11ykVIZudy+7Qz2tJZbV2cuj8Un7eT2QRBGFA42RPL8djfEi/RIZ+6b9C1Bc1EAppl26zoh28D8/KstFioQ=="
     },
     "node_modules/@gar/promisify": {
       "version": "1.1.3",
@@ -3004,6 +3070,14 @@
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/wast-parser": "1.9.0",
         "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@xmldom/xmldom": {
+      "version": "0.8.10",
+      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
+      "engines": {
+        "node": ">=10.0.0"
       }
     },
     "node_modules/@xtuc/ieee754": {
@@ -6883,7 +6957,6 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "dev": true,
       "engines": {
         "node": ">=0.8.x"
       }
diff --git a/ruoyi-ui/package-lock.json b/ruoyi-ui/package-lock.json
index 0e50563..3609762 100644
--- a/ruoyi-ui/package-lock.json
+++ b/ruoyi-ui/package-lock.json
@@ -9,6 +9,7 @@
       "version": "3.8.5",
       "license": "MIT",
       "dependencies": {
+        "@eyevinn/webrtc-player": "^0.12.0",
         "@riophae/vue-treeselect": "0.4.0",
         "axios": "0.24.0",
         "clipboard": "2.0.8",
@@ -1803,6 +1804,25 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@dailymotion/vast-client": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@dailymotion/vast-client/-/vast-client-4.0.1.tgz",
+      "integrity": "sha512-oRUCc06bWdX/1f2Eha/od5WCj+MLHiD6rgyAudgjOUyWXhCcbkUTZeejBSQsLft0nFnd+5nrDqGkBD8mrEVd/Q==",
+      "dependencies": {
+        "@xmldom/xmldom": "^0.8.3"
+      },
+      "engines": {
+        "node": ">=12.22.1"
+      }
+    },
+    "node_modules/@dailymotion/vmap": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@dailymotion/vmap/-/vmap-3.3.1.tgz",
+      "integrity": "sha512-0+JbHbK/ePKtQYAyrZWr7q/ec2hA355hOm5qwlNUt175ml6IBqKsSSjpz9cLe+0sYCKZGega7ED6gc+uoR5pbQ==",
+      "engines": {
+        "node": ">=12.22.1"
+      }
+    },
     "node_modules/@eslint/eslintrc": {
       "version": "0.2.2",
       "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
@@ -1866,6 +1886,53 @@
       "engines": {
         "node": ">=8"
       }
+    },
+    "node_modules/@eyevinn/csai-manager": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@eyevinn/csai-manager/-/csai-manager-0.1.2.tgz",
+      "integrity": "sha512-ZehCxXlSIHF5Ej1n/WZEaLa6sLIH5zrE1ZB71yyT/KbFoeDsDDoo+jw61xzzT+pKBb4vNBtKQRgaVDGZdT2L/g==",
+      "dependencies": {
+        "@dailymotion/vast-client": "^4.0.0",
+        "@dailymotion/vmap": "^3.3.0",
+        "@eyevinn/video-event-filter": "^2.0.0",
+        "mitt": "^3.0.0"
+      }
+    },
+    "node_modules/@eyevinn/csai-manager/node_modules/mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
+    },
+    "node_modules/@eyevinn/video-event-filter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@eyevinn/video-event-filter/-/video-event-filter-2.0.0.tgz",
+      "integrity": "sha512-S5pECmymqg7WqlAeerhtPVEFxWhLY3cz3DTuhuljZreVDLnEBV6/DlWI6SWDnKdpDJMgD6VjPfaRJssmGatNBg==",
+      "dependencies": {
+        "mitt": "^2.1.0"
+      }
+    },
+    "node_modules/@eyevinn/video-event-filter/node_modules/mitt": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz",
+      "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg=="
+    },
+    "node_modules/@eyevinn/webrtc-player": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@eyevinn/webrtc-player/-/webrtc-player-0.12.0.tgz",
+      "integrity": "sha512-xzb0wl/wVmuzv4yvOF3+fUtvv14oj9+pQ0Va0CTBAz2VYRsVdqtDacwq8aMolfsDqdwIyouj5Qji5XWz9tdW3A==",
+      "dependencies": {
+        "@eyevinn/csai-manager": "^0.1.2",
+        "@eyevinn/whpp-client": "^0.1.2",
+        "events": "^3.3.0"
+      },
+      "engines": {
+        "node": ">=18.15.0"
+      }
+    },
+    "node_modules/@eyevinn/whpp-client": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@eyevinn/whpp-client/-/whpp-client-0.1.2.tgz",
+      "integrity": "sha512-Mau11ykVIZudy+7Qz2tJZbV2cuj8Un7eT2QRBGFA42RPL8djfEi/RIZ+6b9C1Bc1EAppl26zoh28D8/KstFioQ=="
     },
     "node_modules/@gar/promisify": {
       "version": "1.1.3",
@@ -3057,6 +3124,14 @@
         "@webassemblyjs/ast": "1.9.0",
         "@webassemblyjs/wast-parser": "1.9.0",
         "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@xmldom/xmldom": {
+      "version": "0.8.10",
+      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
+      "engines": {
+        "node": ">=10.0.0"
       }
     },
     "node_modules/@xtuc/ieee754": {
@@ -6936,7 +7011,6 @@
       "version": "3.3.0",
       "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "dev": true,
       "engines": {
         "node": ">=0.8.x"
       }
@@ -19138,6 +19212,19 @@
         "to-fast-properties": "^2.0.0"
       }
     },
+    "@dailymotion/vast-client": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/@dailymotion/vast-client/-/vast-client-4.0.1.tgz",
+      "integrity": "sha512-oRUCc06bWdX/1f2Eha/od5WCj+MLHiD6rgyAudgjOUyWXhCcbkUTZeejBSQsLft0nFnd+5nrDqGkBD8mrEVd/Q==",
+      "requires": {
+        "@xmldom/xmldom": "^0.8.3"
+      }
+    },
+    "@dailymotion/vmap": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@dailymotion/vmap/-/vmap-3.3.1.tgz",
+      "integrity": "sha512-0+JbHbK/ePKtQYAyrZWr7q/ec2hA355hOm5qwlNUt175ml6IBqKsSSjpz9cLe+0sYCKZGega7ED6gc+uoR5pbQ=="
+    },
     "@eslint/eslintrc": {
       "version": "0.2.2",
       "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
@@ -19188,6 +19275,54 @@
           "dev": true
         }
       }
+    },
+    "@eyevinn/csai-manager": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@eyevinn/csai-manager/-/csai-manager-0.1.2.tgz",
+      "integrity": "sha512-ZehCxXlSIHF5Ej1n/WZEaLa6sLIH5zrE1ZB71yyT/KbFoeDsDDoo+jw61xzzT+pKBb4vNBtKQRgaVDGZdT2L/g==",
+      "requires": {
+        "@dailymotion/vast-client": "^4.0.0",
+        "@dailymotion/vmap": "^3.3.0",
+        "@eyevinn/video-event-filter": "^2.0.0",
+        "mitt": "^3.0.0"
+      },
+      "dependencies": {
+        "mitt": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+          "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
+        }
+      }
+    },
+    "@eyevinn/video-event-filter": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@eyevinn/video-event-filter/-/video-event-filter-2.0.0.tgz",
+      "integrity": "sha512-S5pECmymqg7WqlAeerhtPVEFxWhLY3cz3DTuhuljZreVDLnEBV6/DlWI6SWDnKdpDJMgD6VjPfaRJssmGatNBg==",
+      "requires": {
+        "mitt": "^2.1.0"
+      },
+      "dependencies": {
+        "mitt": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz",
+          "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg=="
+        }
+      }
+    },
+    "@eyevinn/webrtc-player": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@eyevinn/webrtc-player/-/webrtc-player-0.12.0.tgz",
+      "integrity": "sha512-xzb0wl/wVmuzv4yvOF3+fUtvv14oj9+pQ0Va0CTBAz2VYRsVdqtDacwq8aMolfsDqdwIyouj5Qji5XWz9tdW3A==",
+      "requires": {
+        "@eyevinn/csai-manager": "^0.1.2",
+        "@eyevinn/whpp-client": "^0.1.2",
+        "events": "^3.3.0"
+      }
+    },
+    "@eyevinn/whpp-client": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/@eyevinn/whpp-client/-/whpp-client-0.1.2.tgz",
+      "integrity": "sha512-Mau11ykVIZudy+7Qz2tJZbV2cuj8Un7eT2QRBGFA42RPL8djfEi/RIZ+6b9C1Bc1EAppl26zoh28D8/KstFioQ=="
     },
     "@gar/promisify": {
       "version": "1.1.3",
@@ -20196,6 +20331,11 @@
         "@webassemblyjs/wast-parser": "1.9.0",
         "@xtuc/long": "4.2.2"
       }
+    },
+    "@xmldom/xmldom": {
+      "version": "0.8.10",
+      "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="
     },
     "@xtuc/ieee754": {
       "version": "1.2.0",
@@ -23435,8 +23575,7 @@
     "events": {
       "version": "3.3.0",
       "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "dev": true
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
     },
     "eventsource": {
       "version": "2.0.2",
diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json
index b133df5..38cb85c 100644
--- a/ruoyi-ui/package.json
+++ b/ruoyi-ui/package.json
@@ -36,6 +36,7 @@
     "url": "https://gitee.com/y_project/RuoYi-Vue.git"
   },
   "dependencies": {
+    "@eyevinn/webrtc-player": "^0.12.0",
     "@riophae/vue-treeselect": "0.4.0",
     "axios": "0.24.0",
     "clipboard": "2.0.8",

--
Gitblit v1.9.3