From b1084891961232e3c697ea9fc52f127cdccffb6b Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: 星期四, 11 七月 2024 17:28:44 +0800
Subject: [PATCH] 优化:流媒体

---
 ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java |  133 +++++++++++++++++++++++++++++++++++++++----
 1 files changed, 119 insertions(+), 14 deletions(-)

diff --git a/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java b/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java
index 91e8103..f0be3d3 100644
--- a/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java
+++ b/ard-work/src/main/java/com/ruoyi/media/service/impl/VtduServiceImpl.java
@@ -3,10 +3,18 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.device.camera.domain.ArdCameras;
+import com.ruoyi.device.camera.domain.CameraCmd;
+import com.ruoyi.device.camera.factory.CameraSDK;
+import com.ruoyi.device.camera.factory.CameraSDKFactory;
+import com.ruoyi.device.channel.domain.ArdChannel;
+import com.ruoyi.media.domain.StreamInfo;
 import com.ruoyi.media.service.IMediaService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import com.ruoyi.media.mapper.VtduMapper;
 import com.ruoyi.media.domain.Vtdu;
@@ -28,7 +36,10 @@
     private VtduMapper vtduMapper;
     @Resource
     private IMediaService mediaService;
-
+    @Resource
+    private CameraSDKFactory cameraSDKFactory;
+    @Value("${mediamtx.host}")
+    String mediamtxHost;
     /**
      * 鏌ヨ娴佸獟浣撶鐞�
      *
@@ -37,7 +48,6 @@
      */
     @Override
     public Vtdu selectVtduByName(String name) {
-
         return vtduMapper.selectVtduByName(name);
     }
 
@@ -60,17 +70,6 @@
      */
     @Override
     public int insertVtdu(Vtdu vtdu) {
-        log.debug("娴佸獟浣撱��" + vtdu.getName() + "銆戦�氶亾娣诲姞");
-        Map<String, String> map = mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
-        vtdu.setRtspUrl(map.get("rtspUrl"));
-        vtdu.setRtmpUrl(map.get("rtmpUrl"));
-        vtdu.setWebrtcUrl(map.get("webrtcUrl"));
-
-        vtdu.setName(vtdu.getName());
-        vtdu.setRtspSource(vtdu.getRtspSource());
-        vtdu.setIsCode(vtdu.getIsCode());
-        vtdu.setMode(vtdu.getMode());
-        vtdu.setCreateTime(DateUtils.getNowDate());
         return vtduMapper.insertVtdu(vtdu);
     }
 
@@ -82,7 +81,6 @@
      */
     @Override
     public int updateVtdu(Vtdu vtdu) {
-        log.debug("娴佸獟浣撱��" + vtdu.getName() + "銆戦�氶亾鏇存柊");
         Map<String, String> map = mediaService.editPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
         vtdu.setName(vtdu.getName());
         vtdu.setRtspSource(vtdu.getRtspSource());
@@ -141,4 +139,111 @@
         }
         return vtduMapper.deleteVtduByCameraId(cameraId);
     }
+
+    /**
+     * @return
+     * @Author 鍒樿嫃涔�
+     * @Description 娓呴櫎鎵�鏈夋祦濯掍綋鏁版嵁
+     * @Date 2024/7/10 13:31
+     * @Param
+     */
+    public void clearVtdu() {
+        vtduMapper.clearVtdu();
+    }
+
+
+    //闇�瑕佹洿鏂扮殑锛堟祦濯掍綋鍜寁tdu鐩稿悓锛�
+    @Override
+    public List<Vtdu> sameList(List<Vtdu> vtdus, List<String> names) {
+        return vtdus.stream().filter(vtdu -> names.contains(vtdu.getName())).collect(Collectors.toList());
+    }
+
+    //闇�瑕佸垹闄ょ殑锛堟祦濯掍綋涓鐨勶級
+    @Override
+    public List<String> diffListToDel(List<Vtdu> vtdus, List<String> names) {
+        if (vtdus.size() >= names.size()) {
+            List<String> nameList = vtdus.stream().map(Vtdu::getName)
+                    .filter(item -> !names.contains(item))
+                    .collect(Collectors.toList());
+            return nameList;
+        } else {
+            List<String> nameList = names.stream().filter(item -> !vtdus.stream().map(Vtdu::getName).collect(Collectors.toList()).contains(item))
+                    .collect(Collectors.toList());
+            return nameList;
+        }
+    }
+
+    //闇�瑕佹柊澧炵殑锛堟祦濯掍綋涓皯鐨勶級
+    @Override
+    public List<Vtdu> diffListToAdd(List<Vtdu> vtdus, List<String> names) {
+        return vtdus.stream().filter(vtdu -> !names.contains(vtdu.getName())).collect(Collectors.toList());
+    }
+
+    /**
+     * @return
+     * @Author 鍒樿嫃涔�
+     * @Description 鍚屾鏈湴vtdu搴撳拰娴佸獟浣撲腑鐨勬暟鎹�
+     * @Date 2024/7/10 15:26
+     * @Param vtdus vtdu搴撶殑闆嗗悎
+     * @Param names 娴佸獟浣撶殑name闆嗗悎
+     */
+    @Override
+    public void asyncVtdu(List<Vtdu> vtdus, List<String> names) {
+        //闇�瑕佹洿鏂扮殑鏁版嵁,鍙傛暟椤哄簭娉ㄦ剰
+        sameList(vtdus, names).stream().forEach(vtdu -> {
+            StreamInfo streamInfo = mediaService.getPathInfo(vtdu.getName());
+            if (!streamInfo.getRtspSource().equals(vtdu.getRtspSource())) {
+                mediaService.editPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
+            }
+        });
+        //闇�瑕佸垹闄ょ殑鏁版嵁
+        diffListToDel(vtdus, names).stream().forEach(name -> {
+            mediaService.removePath(name);
+        });
+        //闇�瑕佹柊澧炵殑鏁版嵁
+        diffListToAdd(vtdus, names).stream().forEach(vtdu -> {
+            mediaService.addPath(vtdu.getName(), vtdu.getRtspSource(), vtdu.getMode(), vtdu.getIsCode());
+        });
+    }
+    @Override
+    public void addChanToVtdu(ArdCameras camera, ArdChannel channel) {
+        String name = camera.getId() + "_" + channel.getChanNo();
+        String rtspSource="";
+        switch (camera.getFactory())
+        {
+            case "1": rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream";break;
+            case "2": rtspSource = "rtsp://" + camera.getUsername() + ":" + camera.getPassword() + "@" + camera.getIp() + ":" + camera.getRtspPort() + "/cam/realmonitor?channel=" + channel.getChanNo() + "&subtype=0";break;
+        }
+
+        //鍒犻櫎娴佸獟浣�
+        if (selectVtduByName(name) != null) {
+            deleteVtduByName(name);
+        }
+        //娣诲姞鍒版祦濯掍綋
+        CameraCmd cmd = new CameraCmd(camera.getId(), channel.getChanNo());
+        CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(camera.getFactory());
+        Map<String, Object> videoCompressionCfg = cameraSDK.getVideoCompressionCfg(cmd);
+        Vtdu vtdu = new Vtdu();
+        if (videoCompressionCfg.get("videoEncType") != null) {
+            if (videoCompressionCfg.get("videoEncType").equals("鏍囧噯h264")) {
+                vtdu.setIsCode("0");//榛樿涓嶈浆鐮�
+            } else {
+                vtdu.setIsCode("1");//榛樿杞爜
+            }
+        } else {
+            vtdu.setIsCode("0");//榛樿涓嶈浆鐮�
+        }
+        vtdu.setRtspSource(rtspSource);
+        vtdu.setName(name);
+        vtdu.setMode("1");//榛樿CPU杞В鐮�
+        vtdu.setCameraId(camera.getId());
+        String rtspUrl = "rtsp://" + mediamtxHost + ":8554/" + name;
+        String rtmpUrl = "rtmp://" + mediamtxHost + ":1935/" + name;
+        String webrtcUrl = "http://" + mediamtxHost + ":8889/" + name;
+        vtdu.setRtmpUrl(rtmpUrl);
+        vtdu.setWebrtcUrl(webrtcUrl);
+        vtdu.setRtspUrl(rtspUrl);
+        insertVtdu(vtdu);
+    }
+
 }

--
Gitblit v1.9.3