From e0e99fad10f6c8dedf4c11c065b10469cd47a1e8 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Tue, 30 Sep 2025 09:00:14 +0800
Subject: [PATCH] 优化流媒体接口实现机场和相机业务

---
 ard-admin/src/main/resources/logback.xml                                                 |    2 
 ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java |    2 
 ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java             |    5 
 ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java      |   12 +
 ard-vtdu/src/main/java/com/ard/vtdu/service/IArdMediaService.java                        |    2 
 ard-admin/src/main/java/com/ard/web/controller/vtdu/MediaMTXController.java              |    8 
 ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java                       |   19 +
 /dev/null                                                                                |  501 ---------------------------------------------
 ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java             |   17 -
 ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java                 |    5 
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java   |    9 
 ard-vtdu/src/main/resources/mapper/ArdVtduMapper.xml                                     |    2 
 ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java    |   31 ++
 ard-vtdu/src/main/java/com/ard/vtdu/domain/StreamInfo.java                               |   11 -
 14 files changed, 84 insertions(+), 542 deletions(-)

diff --git a/ard-admin/src/main/java/com/ard/web/controller/vtdu/MediaMTXController.java b/ard-admin/src/main/java/com/ard/web/controller/vtdu/MediaMTXController.java
index 6d7c082..490167d 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/vtdu/MediaMTXController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/vtdu/MediaMTXController.java
@@ -5,7 +5,7 @@
 import com.ard.common.core.page.TableDataInfo;
 import com.ard.vtdu.domain.ArdVtdu;
 import com.ard.vtdu.domain.Conf;
-import com.ard.vtdu.service.IArdMediaMTXService;
+import com.ard.vtdu.service.IArdMediaService;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -27,14 +27,14 @@
 public class MediaMTXController extends BaseController {
 
     @Resource
-    private IArdMediaMTXService mediaService;
+    private IArdMediaService mediaService;
 
     /**
      * 增加通道
      */
     @PostMapping()
     @ApiOperation("增加通道")
-    @ApiOperationSupport(includeParameters = {"ardVtdu.name", "ardVtdu.rtspSource", "ardVtdu.mode", "ardVtdu.isCode", "ardVtdu.isRecord"}, order = 1)
+    @ApiOperationSupport(includeParameters = {"ardVtdu.name", "ardVtdu.rtspSource"}, order = 1)
     public AjaxResult addPath(@RequestBody ArdVtdu ardVtdu) {
         if (StringUtils.isEmpty(ardVtdu.getName())) {
             return AjaxResult.error("通道名称不能为空");
@@ -50,7 +50,7 @@
      * 修改通道
      */
     @ApiOperation("修改通道")
-    @ApiOperationSupport(includeParameters = {"ardVtdu.name", "ardVtdu.rtspSource", "ardVtdu.mode", "ardVtdu.isCode", "ardVtdu.isRecord"}, order = 2)
+    @ApiOperationSupport(includeParameters = {"ardVtdu.name", "ardVtdu.rtspSource"}, order = 2)
     @PutMapping
     public AjaxResult edit(@RequestBody ArdVtdu ardVtdu) {
         return AjaxResult.success(mediaService.editPath(ardVtdu));
diff --git a/ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java b/ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java
index 77ccfff..53507d1 100644
--- a/ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java
+++ b/ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java
@@ -91,6 +91,25 @@
                 .securitySchemes(securitySchemes())
                 .securityContexts(securityContexts());
     }
+    @Bean
+    public Docket mediaMTXApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .enable(true)
+                .groupName("流媒体接口")   // 分组名
+                .apiInfo(apiInfo("流媒体管理接口"))
+                .select()
+                // 扫描指定包下,但只扫描加了 @ApiOperation 注解的方法
+                .apis(requestHandler ->
+                        requestHandler.declaringClass().getPackage().getName().startsWith("com.ard.web.controller" +
+                                ".vtdu") &&
+                                requestHandler.isAnnotatedWith(io.swagger.annotations.ApiOperation.class)
+                )
+                .paths(PathSelectors.any())
+                .build()
+                /* 设置安全模式,swagger可以设置访问token */
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts());
+    }
     /**
      * 安全模式,这里指定token通过Authorization头请求头传递
      */
diff --git a/ard-admin/src/main/resources/logback.xml b/ard-admin/src/main/resources/logback.xml
index 341861b..7c4d2e0 100644
--- a/ard-admin/src/main/resources/logback.xml
+++ b/ard-admin/src/main/resources/logback.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/home/ruoyi/logs" />
+	<property name="log.path" value="/home/ard/jar/logs" />
     <!-- 日志输出格式 -->
 	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 
diff --git a/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java b/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
index 129ceca..70674cb 100644
--- a/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
+++ b/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
@@ -25,6 +25,7 @@
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import javax.validation.Validator;
@@ -54,6 +55,7 @@
 
     @Resource
     protected Validator validator;
+
 
     @Override
     public void run(ApplicationArguments args) {
@@ -353,5 +355,32 @@
         // SDK 登录成功后写入 Redis
         redisService.setCacheObject(getCacheKey(camera.getId()), camera);
     }
-
+    /**
+     * 同步设备通道与本地通道库信息
+     *
+     * @author 刘苏义
+     * @date 2024/8/22 14:37
+     */
+    @Scheduled(cron = "0/10 * * * * ?")
+    public void syncChannel() {
+        try {
+            log.info("定时执行同步通道任务");
+            List<ArdCamera> ardCameraList = this.selectArdCameraList(new ArdCamera());
+            if (!ardCameraList.isEmpty()) {
+                ardCameraList
+                        .forEach(ardCamera -> {
+                            //SDK获取实际通道
+                            List<ArdChannel> ardChannelListSDK = cameraSDKService.getChannels(ardCamera);
+                            //数据库获取通道
+                            ArdChannel ardChannel = new ArdChannel();
+                            ardChannel.setDeviceId(ardCamera.getId());
+                            List<ArdChannel> ardChannelListDb = ardChannelService.selectArdChannelList(ardChannel);
+                            //同步通道
+                            asyncChannel(ardChannelListDb, ardChannelListSDK);
+                        });
+            }
+        } catch (Exception ex) {
+            log.error("定时执行同步通道任务异常:{}", ex.getMessage());
+        }
+    }
 }
\ No newline at end of file
diff --git a/ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java b/ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
index dcdb3e8..cca43e9 100644
--- a/ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
+++ b/ard-device/src/main/java/com/ard/device/component/sdk/hik/service/impl/HikVisionSDK.java
@@ -111,7 +111,7 @@
                         SdkErrorCodeEnum.getDescByCode(errorCode), errorCode);
                 return AjaxResult.warn("设备[" + camera.getIp() + ":" + camera.getPort() + "]登录失败: " + SdkErrorCodeEnum.getDescByCode(errorCode) + "(" + errorCode + ")");
             }
-            log.debug("Login Success 【 {}:{} 】", camera.getIp(), camera.getPort());
+            log.info("Login Success 【 {}:{} 】", camera.getIp(), camera.getPort());
 
             GlobalVariable.loginMap.put(camera.getId(), loginId);
             GlobalVariable.hikLoginMap.put(loginId, camera);
diff --git a/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java b/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
index c8858ae..6dee4ed 100644
--- a/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
+++ b/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDK.java
@@ -3,7 +3,10 @@
 import com.ard.common.core.domain.AjaxResult;
 import com.ard.device.camera.domain.ArdCamera;
 import com.ard.device.camera.domain.CameraCmd;
+import com.ard.device.channel.domain.ArdChannel;
 import com.ard.device.channel.domain.VideoCompressionCfg;
+
+import java.util.List;
 
 
 /**
@@ -25,4 +28,6 @@
     //获取码流压缩参数
     VideoCompressionCfg getVideoCompressionCfg(CameraCmd cmd);
 
+    //获取相机通道信息
+    public List<ArdChannel> getChannels(ArdCamera camera);
 }
diff --git a/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java b/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
index d06f34e..f292137 100644
--- a/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
+++ b/ard-device/src/main/java/com/ard/device/component/sdk/service/CameraSDKService.java
@@ -5,6 +5,7 @@
 import com.ard.common.core.redis.RedisCache;
 import com.ard.device.camera.domain.ArdCamera;
 import com.ard.device.camera.domain.CameraCmd;
+import com.ard.device.channel.domain.ArdChannel;
 import com.ard.device.channel.domain.VideoCompressionCfg;
 import com.ard.device.component.sdk.common.GlobalVariable;
 import com.ard.device.component.sdk.factory.CameraSDKFactory;
@@ -105,5 +106,14 @@
         }
     }
 
-
+    //获取通道列表
+    public List<ArdChannel> getChannels(ArdCamera camera) {
+        try {
+            CameraSDK cameraSDK = cameraSDKFactory.createCameraSDK(camera.getFactory());
+            return cameraSDK.getChannels(camera);
+        } catch (Exception ex) {
+            log.error("获取相机通道异常:{}", ex.getMessage());
+            return null;
+        }
+    }
 }
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java
index 4e8b140..b9faeb4 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LiveStreamServiceImpl.java
@@ -20,7 +20,7 @@
 import com.ard.sample.manage.service.ILiveStreamService;
 import com.ard.vtdu.config.MediamtxConfig;
 import com.ard.vtdu.domain.ArdVtdu;
-import com.ard.vtdu.service.IArdMediaMTXService;
+import com.ard.vtdu.service.IArdMediaService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -52,7 +52,7 @@
     private IMessageSenderService messageSender;
 
     @Resource
-    private IArdMediaMTXService mediaService;
+    private IArdMediaService ardMediaService;
     @Resource
     private MediamtxConfig mediamtxConfig;
 
@@ -118,7 +118,8 @@
             case RTMP:
                 ArdVtdu vtdu = new ArdVtdu();
                 vtdu.setName(liveParam.getVideoId());
-                vtdu = mediaService.addPath(vtdu);
+                vtdu.setRtspSource("publisher");
+                vtdu = ardMediaService.addPath(vtdu);
                 live.setRtmpUrl(vtdu.getRtmpUrl());
                 live.setRtspUrl(vtdu.getRtspUrl());
                 live.setWebrtcUrl(vtdu.getWebrtcUrl());
@@ -147,7 +148,7 @@
         if (receiveReply.getResult() != 0) {
             return ResponseResult.error(LiveErrorEnum.find(receiveReply.getResult()));
         }
-        mediaService.removePath(videoId);
+        ardMediaService.removePath(videoId);
         return ResponseResult.success();
     }
 
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/domain/StreamInfo.java b/ard-vtdu/src/main/java/com/ard/vtdu/domain/StreamInfo.java
index 1a7ab46..6b84817 100644
--- a/ard-vtdu/src/main/java/com/ard/vtdu/domain/StreamInfo.java
+++ b/ard-vtdu/src/main/java/com/ard/vtdu/domain/StreamInfo.java
@@ -67,17 +67,6 @@
     String remoteAddr;
 
     /**
-     * 解码模式
-     * 0-gpu硬解码 1-cpu软解码
-     */
-    Integer mode;
-
-    /**
-     * 是否转码
-     * 0-不转码 1-转码
-     */
-    Integer isCode;
-    /**
      * 媒体类型(webRTCSession/rtspSession)
      */
     String sessionType;
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/service/IArdMediaMTXService.java b/ard-vtdu/src/main/java/com/ard/vtdu/service/IArdMediaMTXService.java
deleted file mode 100644
index 66b53f3..0000000
--- a/ard-vtdu/src/main/java/com/ard/vtdu/service/IArdMediaMTXService.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.ard.vtdu.service;
-
-import com.ard.common.core.page.TableDataInfo;
-import com.ard.vtdu.domain.*;
-
-import java.util.List;
-
-public interface IArdMediaMTXService {
-    /**
-     * 增加路径
-     */
-    ArdVtdu addPath(ArdVtdu ardVtdu);
-
-    /**
-     * 修改路径
-     */
-    ArdVtdu editPath(ArdVtdu ardVtdu);
-
-    //获取通道配置
-    Conf getPathConfig(String name);
-
-    //获取通道配置列表
-    PathConfig getPathConfigs(Integer pageNum, Integer pageSize);
-
-    void removePath(String[] names);
-
-    void removePath(String name);
-
-    List<StreamInfo> paths(Integer pageNum, Integer pageSize);
-
-    List<String> getNameList();
-
-    boolean checkNameExist(String name);
-
-    RtspSession getRtspSessionById(String sessionId);
-
-    WebrtcSession getWebrtcSessionById(String sessionId);
-
-    RtmpSession getRtmpSessionById(String sessionId);
-
-    TableDataInfo getPushStreamList(Integer pageNum, Integer pageSize);
-
-    TableDataInfo getPullWebrtcStreamList(Integer pageNum, Integer pageSize);
-
-    TableDataInfo getPullRtspStreamList(Integer pageNum, Integer pageSize);
-
-    TableDataInfo getPullRtmpStreamList(Integer pageNum, Integer pageSize);
-
-    Boolean kickRtspSession(String sessionId);
-
-    Boolean kickRtmpSession(String sessionId);
-
-    Boolean kickWebrtcSession(String sessionId);
-
-    void clearAll();
-
-    //开启录像
-    String setRecord(Conf conf);
-
-    //获取全部录像分段列表
-    Paths recordingList(Integer pageNum, Integer pageSize);
-
-    //通过路径名获取录像分段列表
-    Item recordingListByName(String name);
-
-    //通过路径名和分段录像开始时间删除录像分段
-    String deleteSegment(String name, String start);
-
-
-}
\ No newline at end of file
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/service/IMediaService.java b/ard-vtdu/src/main/java/com/ard/vtdu/service/IArdMediaService.java
similarity index 97%
rename from ard-vtdu/src/main/java/com/ard/vtdu/service/IMediaService.java
rename to ard-vtdu/src/main/java/com/ard/vtdu/service/IArdMediaService.java
index 1c315d2..6ee11af 100644
--- a/ard-vtdu/src/main/java/com/ard/vtdu/service/IMediaService.java
+++ b/ard-vtdu/src/main/java/com/ard/vtdu/service/IArdMediaService.java
@@ -5,7 +5,7 @@
 
 import java.util.List;
 
-public interface IMediaService {
+public interface IArdMediaService {
     /**
      * 增加路径
      */
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdMediaServiceImpl.java b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java
similarity index 96%
rename from ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdMediaServiceImpl.java
rename to ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java
index bbdee95..60e4aa7 100644
--- a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdMediaServiceImpl.java
+++ b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java
@@ -5,7 +5,7 @@
 import com.ard.vtdu.client.MediaClient;
 import com.ard.vtdu.config.MediamtxConfig;
 import com.ard.vtdu.domain.*;
-import com.ard.vtdu.service.IMediaService;
+import com.ard.vtdu.service.IArdMediaService;
 import com.ard.vtdu.util.ArdTool;
 import com.dtflys.forest.exceptions.ForestRuntimeException;
 import lombok.extern.slf4j.Slf4j;
@@ -29,7 +29,7 @@
  **/
 @Service
 @Slf4j
-public class ArdMediaServiceImpl implements IMediaService {
+public class ArdArdMediaServiceImpl implements IArdMediaService {
 
     @Resource
     MediaClient mediaClient;
@@ -88,8 +88,8 @@
             String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + ardVtdu.getName();
 
             Conf conf = new Conf();
-            conf.setName(ardVtdu.getName());
             conf.setSource(ardVtdu.getRtspSource());
+            conf.setName(ardVtdu.getName());
             conf.setRunOnDemand("");
             conf.setRunOnDemandRestart(false);
             conf.setRunOnDemandCloseAfter("5s");
@@ -148,17 +148,8 @@
             if (StringUtils.isNotEmpty(conf.getRunOnDemand())) {
                 runOn = conf.getRunOnDemand();
             }
-            //RTSP源地址
-            Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn);
-            if (matcher.find()) {
-                info.setRtspSource(matcher.group());
-                info.setIsCode(1);
-            } else {
-                info.setRtspSource(conf.getSource());
-                info.setIsCode(0);
-            }
             //传输协议
-            matcher = Pattern.compile("-rtsp_transport\\s+(\\w+)").matcher(runOn);
+            Matcher matcher = Pattern.compile("-rtsp_transport\\s+(\\w+)").matcher(runOn);
             if (matcher.find()) {
                 info.setProtocol(matcher.group(1));
             }
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdMediaMTXServiceImpl.java b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdMediaMTXServiceImpl.java
deleted file mode 100644
index 9d3714b..0000000
--- a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdMediaMTXServiceImpl.java
+++ /dev/null
@@ -1,501 +0,0 @@
-package com.ard.vtdu.service.impl;
-
-import com.ard.common.constant.HttpStatus;
-import com.ard.common.core.page.TableDataInfo;
-import com.ard.vtdu.client.MediaClient;
-import com.ard.vtdu.config.MediamtxConfig;
-import com.ard.vtdu.domain.*;
-import com.ard.vtdu.service.IArdMediaMTXService;
-import com.ard.vtdu.util.ArdTool;
-import com.dtflys.forest.exceptions.ForestRuntimeException;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
-import java.time.OffsetDateTime;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @Description: 流媒体业务
- * @ClassName: MediaService
- * @Author: 刘苏义
- * @Date: 2023年07月13日9:28
- * @Version: 1.0
- **/
-@Service
-@Slf4j
-public class ArdMediaMTXServiceImpl implements IArdMediaMTXService {
-
-    @Resource
-    MediaClient mediaClient;
-
-    @Resource
-    private MediamtxConfig mediamtxConfig;
-
-    /**
-     * @return
-     * @Author 刘苏义
-     * @Description 添加流媒体
-     * name 相机ID
-     * sourceUrl rtsp推流地址
-     * isCode 0-不转码 1-转码
-     * mode 1-gpu硬解码 0-cpu软解码
-     * @Date 2024/7/3 8:45
-     * @Param
-     */
-    @Override
-    public ArdVtdu addPath(ArdVtdu ardVtdu) {
-        try {
-            String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + ardVtdu.getName();
-            String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + ardVtdu.getName();
-            String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
-            String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + ardVtdu.getName();
-
-            Conf conf = new Conf();
-            conf.setName(ardVtdu.getName());
-            conf.setSource("publisher");
-            conf.setRunOnDemandRestart(false);
-            conf.setRunOnDemandCloseAfter("5s");
-            conf.setMaxReaders(100);
-            conf.setSourceProtocol("tcp");
-
-            if (!checkNameExist(ardVtdu.getName())) {
-                mediaClient.addPath(ardVtdu.getName(), conf);
-            } else {
-                mediaClient.editPath(ardVtdu.getName(), conf);
-            }
-            ardVtdu.setCameraId(ardVtdu.getName().split("_")[0]);
-            ardVtdu.setRtspUrl(rtspUrl);
-            ardVtdu.setRtmpUrl(rtmpUrl);
-            ardVtdu.setWebrtcUrl(webrtcUrl);
-            return ardVtdu;
-        } catch (ForestRuntimeException ex) {
-            log.error("添加流媒体异常:" + ex.getMessage());
-        }
-        return null;
-    }
-
-    @Override
-    public ArdVtdu editPath(ArdVtdu ardVtdu) {
-        try {
-            String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + ardVtdu.getName();
-            String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + ardVtdu.getName();
-            String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
-            String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + ardVtdu.getName();
-            Conf conf = new Conf();
-            conf.setName(ardVtdu.getName());
-            conf.setSource("publisher");
-            conf.setRunOnDemand("");
-            conf.setRunOnDemandRestart(false);
-            conf.setRunOnDemandCloseAfter("5s");
-            conf.setMaxReaders(100);
-            conf.setSourceProtocol("tcp");
-
-            if (checkNameExist(ardVtdu.getName())) {
-                mediaClient.editPath(ardVtdu.getName(), conf);
-            }
-            ardVtdu.setRtspUrl(rtspUrl);
-            ardVtdu.setRtmpUrl(rtmpUrl);
-            ardVtdu.setWebrtcUrl(webrtcUrl);
-            return ardVtdu;
-        } catch (ForestRuntimeException ex) {
-            log.error("修改流媒体异常:" + ex.getMessage());
-        }
-        return null;
-    }
-
-    @Override
-    public void removePath(String[] names) {
-        try {
-            for (String name : names) {
-                if (checkNameExist(name)) {
-                    mediaClient.removePath(name);
-                }
-            }
-        } catch (Exception ex) {
-            log.error("批量移除流媒体异常:" + ex.getMessage());
-        }
-    }
-
-    @Override
-    public void removePath(String name) {
-        try {
-            if (checkNameExist(name)) {
-                mediaClient.removePath(name);
-            }
-        } catch (ForestRuntimeException ex) {
-            log.error("移除流媒体异常:" + ex.getMessage());
-        }
-    }
-
-    @Override
-    public List<StreamInfo> paths(Integer pageNum, Integer pageSize) {
-        Paths paths = mediaClient.paths(pageNum - 1, pageSize);
-        List<Item> items = paths.getItems();
-        List<StreamInfo> pathInfoList = new ArrayList<>();
-        for (Item item : items) {
-            StreamInfo info = new StreamInfo();
-            //ID
-            String name = item.getName();
-            info.setName(name);
-
-            Conf conf = mediaClient.getPathConfig(name);
-            String runOn = "";
-            if (StringUtils.isNotEmpty(conf.getRunOnDemand())) {
-                runOn = conf.getRunOnDemand();
-            }
-            //RTSP源地址
-            Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn);
-            if (matcher.find()) {
-                info.setRtspSource(matcher.group());
-                info.setIsCode(1);
-            } else {
-                info.setRtspSource(conf.getSource());
-                info.setIsCode(0);
-            }
-            //传输协议
-            matcher = Pattern.compile("-rtsp_transport\\s+(\\w+)").matcher(runOn);
-            if (matcher.find()) {
-                info.setProtocol(matcher.group(1));
-            }
-
-            pathInfoList.add(info);
-        }
-        return pathInfoList;
-    }
-
-    @Override
-    public RtspSession getRtspSessionById(String sessionId) {
-        RtspSession rtspSession = mediaClient.getRtspsessionById(sessionId);
-        return rtspSession;
-    }
-
-    @Override
-    public WebrtcSession getWebrtcSessionById(String sessionId) {
-        WebrtcSession webrtcSession = mediaClient.getWebrtcsessionById(sessionId);
-        return webrtcSession;
-    }
-
-    @Override
-    public RtmpSession getRtmpSessionById(String sessionId) {
-        RtmpSession rtmpSession = mediaClient.getRtmpsessionById(sessionId);
-        return rtmpSession;
-    }
-
-    /**
-     * 获取推流列表
-     * 刘苏义
-     * 2023/8/29 9:37:05
-     */
-    @Override
-    public TableDataInfo getPushStreamList(Integer pageNum, Integer pageSize) {
-        TableDataInfo tableDataInfo = new TableDataInfo();
-        List<StreamInfo> PushStreamInfoList = new ArrayList<>();
-        Paths paths = mediaClient.paths(pageNum - 1, pageSize);
-        int itemCount = paths.getItemCount();
-        tableDataInfo.setTotal(itemCount);
-        List<Item> items = paths.getItems();
-        for (Item item : items) {
-            StreamInfo info = new StreamInfo();
-            //ID
-            String name = item.getName();
-            info.setName(name);
-            Conf conf = mediaClient.getPathConfig(name);
-            //RTMP播放地址
-            String rtmpUrl = "rtmp://" + mediamtxConfig.getPlayHost() + ":1935/" + name;
-            info.setRtmpUrl(rtmpUrl);
-            //RTSP播放地址
-            String rtspUrl = "rtsp://" + mediamtxConfig.getPlayHost() + ":8554/" + name;
-            info.setRtspUrl(rtspUrl);
-            //WEBRTC播放地址
-            String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
-            String webrtcUrl = protocol + mediamtxConfig.getPlayHost() + ":8889/" + name;
-            info.setWebrtcUrl(webrtcUrl);
-            Source source = item.getSource();
-            if (source == null || source.getId().equals("")) {
-                //会话ID
-                info.setId("0");
-                //下行流量
-                long bytesReceived = item.getBytesReceived();
-                String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
-                info.setDownTraffic(formatReceivedSize);
-                //上行流量
-                long bytesSent = item.getBytesSent();
-                String formatSentdSize = ArdTool.formatFileSize(bytesSent);
-                info.setUpTraffic(formatSentdSize);
-                info.setBeginTime(item.getReadyTime());
-            } else {
-                RtspSession rtspSession = getRtspSessionById(source.getId());
-                //会话ID
-                info.setId(rtspSession.getId());
-                //开始推流时间
-                info.setBeginTime(rtspSession.getCreated());
-                //上行流量
-                long bytesReceived = rtspSession.getBytesReceived();
-                String formatReceivedSize = ArdTool.formatFileSize(bytesReceived);
-                info.setUpTraffic(formatReceivedSize);
-                //下行流量
-                long bytesSent = rtspSession.getBytesSent();
-                String formatSentSize = ArdTool.formatFileSize(bytesSent);
-                info.setDownTraffic(formatSentSize);
-                //推流服务器
-                info.setRemoteAddr(rtspSession.getRemoteAddr());
-            }
-            //RTSP源地址
-            String runOn = "";
-            if (StringUtils.isNotEmpty(conf.getRunOnDemand())) {
-                runOn = conf.getRunOnDemand();
-            }
-            Matcher matcher = Pattern.compile("rtsp://[^\\s\"]+").matcher(runOn);
-            if (matcher.find()) {
-                info.setRtspSource(matcher.group());
-            } else {
-                info.setRtspSource(conf.getSource());
-            }
-            //传输协议
-            info.setProtocol(conf.getSourceProtocol());
-            //拉流数量
-            List<Readers> readers = item.getReaders();
-            info.setNum(readers.size());
-
-            PushStreamInfoList.add(info);
-        }
-        tableDataInfo.setRows(PushStreamInfoList);
-        tableDataInfo.setCode(HttpStatus.SUCCESS);
-        tableDataInfo.setMsg("查询成功");
-        return tableDataInfo;
-    }
-
-    /**
-     * 获取webrtc拉流列表
-     * 刘苏义
-     * 2023/8/29 9:37:05
-     */
-    @Override
-    public TableDataInfo getPullWebrtcStreamList(Integer pageNum, Integer pageSize) {
-        TableDataInfo tableDataInfo = new TableDataInfo();
-        WebrtcSessions WebrtcSessions = mediaClient.webrtcsessions(pageNum - 1, pageSize);
-        List<WebrtcSession> items = WebrtcSessions.getItems();
-        items.forEach(
-                webrtcSession -> {
-                    webrtcSession.setUpStream(ArdTool.formatFileSize(webrtcSession.getBytesReceived()));
-                    webrtcSession.setDownStream(ArdTool.formatFileSize(webrtcSession.getBytesSent()));
-                    webrtcSession.setBeginTime(webrtcSession.getCreated());
-                }
-        );
-        tableDataInfo.setTotal(WebrtcSessions.getItemCount());
-        tableDataInfo.setRows(items);
-        tableDataInfo.setCode(HttpStatus.SUCCESS);
-        tableDataInfo.setMsg("查询成功");
-        return tableDataInfo;
-    }
-
-    /**
-     * 获取rtmp拉流列表
-     * 刘苏义
-     * 2023/8/29 9:37:05
-     */
-    @Override
-    public TableDataInfo getPullRtmpStreamList(Integer pageNum, Integer pageSize) {
-        TableDataInfo tableDataInfo = new TableDataInfo();
-        RtmpSessions rtmpSessions = mediaClient.rtmpsessions(pageNum - 1, pageSize);
-        List<RtmpSession> items = rtmpSessions.getItems();
-        items.stream().forEach(
-                webrtcSession -> {
-                    webrtcSession.setUpStream(ArdTool.formatFileSize(webrtcSession.getBytesReceived()));
-                    webrtcSession.setDownStream(ArdTool.formatFileSize(webrtcSession.getBytesSent()));
-                    webrtcSession.setBeginTime(webrtcSession.getCreated());
-                }
-        );
-        tableDataInfo.setTotal(rtmpSessions.getItemCount());
-        tableDataInfo.setRows(items);
-        tableDataInfo.setCode(HttpStatus.SUCCESS);
-        tableDataInfo.setMsg("查询成功");
-        return tableDataInfo;
-    }
-
-    /**
-     * 获取rtsp拉流列表
-     * 刘苏义
-     * 2023/8/29 9:37:05
-     */
-    @Override
-    public TableDataInfo getPullRtspStreamList(Integer pageNum, Integer pageSize) {
-        TableDataInfo tableDataInfo = new TableDataInfo();
-        RtspSessions rtspSessions = mediaClient.rtspsessions(pageNum - 1, pageSize);
-        List<RtspSession> items = rtspSessions.getItems();
-        items.stream().forEach(
-                webrtcSession -> {
-                    webrtcSession.setUpStream(ArdTool.formatFileSize(webrtcSession.getBytesReceived()));
-                    webrtcSession.setDownStream(ArdTool.formatFileSize(webrtcSession.getBytesSent()));
-                    webrtcSession.setBeginTime(webrtcSession.getCreated());
-                }
-        );
-        tableDataInfo.setTotal(rtspSessions.getItemCount());
-        tableDataInfo.setRows(items);
-        tableDataInfo.setCode(HttpStatus.SUCCESS);
-        tableDataInfo.setMsg("查询成功");
-        return tableDataInfo;
-    }
-
-    /**
-     * 踢出rtsp会话
-     * 刘苏义
-     * 2023/8/29 9:37:05
-     */
-    @Override
-    public Boolean kickRtspSession(String sessionId) {
-        try {
-            mediaClient.kickRtspSessions(sessionId);
-            return true;
-        } catch (Exception ex) {
-            return false;
-        }
-    }
-
-    /**
-     * 踢出rtmp会话
-     * 刘苏义
-     * 2023/8/29 9:37:05
-     */
-    @Override
-    public Boolean kickRtmpSession(String sessionId) {
-        try {
-            mediaClient.kickRtmpSessions(sessionId);
-            return true;
-        } catch (Exception ex) {
-            return false;
-        }
-    }
-
-    /**
-     * 踢出webrtc会话
-     * 刘苏义
-     * 2023/8/29 9:37:05
-     */
-    @Override
-    public Boolean kickWebrtcSession(String sessionId) {
-        try {
-            mediaClient.kickWebrtcSessions(sessionId);
-            return true;
-        } catch (Exception ex) {
-            return false;
-        }
-    }
-
-    /**
-     * 获取流媒体name列表
-     * 刘苏义
-     * 2023/10/13 14:19:07
-     */
-    @Override
-    public List<String> getNameList() {
-        List<String> nameList = new ArrayList<>();
-        try {
-            Paths paths = mediaClient.paths(0, 1000);
-            List<Item> items = paths.getItems();
-            for (Item item : items) {
-                nameList.add(item.getName());
-            }
-        } catch (Exception ex) {
-            log.error("获取流媒体name列表异常:" + ex.getMessage());
-        }
-        return nameList;
-    }
-
-    /**
-     * 检查name是否存在
-     * 刘苏义
-     * 2023/10/19 15:18:45
-     */
-    @Override
-    public boolean checkNameExist(String name) {
-        boolean result = false;
-        List<String> nameList = getNameList();
-        if (nameList.contains(name)) {
-            result = true;
-        }
-        return result;
-    }
-
-    /**
-     * 清空所有流媒体信息
-     *
-     * @author 刘苏义
-     * @date 2024/8/22 10:18
-     */
-    @Override
-    public void clearAll() {
-        List<String> nameList = getNameList();
-        nameList.stream().forEach(name -> {
-            removePath(name);
-        });
-    }
-
-    /**
-     * 开启录像
-     */
-    @Override
-    public String setRecord(Conf conf) {
-        return mediaClient.editPath(conf.getName(), conf);
-    }
-
-    /**
-     * 获取全部录像分段列表
-     */
-    @Override
-    public Paths recordingList(Integer pageNum, Integer pageSize) {
-        Paths paths = mediaClient.recordingList(pageNum - 1, pageSize);
-        paths.getItems().forEach(item -> {
-            item.getSegments().forEach(segment -> {
-                // 使用 OffsetDateTime 进行解析
-                OffsetDateTime offsetDateTime = OffsetDateTime.parse(segment.getStart());
-                // 转换为 java.util.Date
-                Date date = Date.from(offsetDateTime.toInstant());
-                segment.setStartTime(date);
-            });
-        });
-        return paths;
-    }
-
-    /**
-     * 指定路径名获取录像分段列表
-     */
-    @Override
-    public Item recordingListByName(String name) {
-        Item item = mediaClient.recordingListByName(name);
-        item.getSegments().forEach(segment -> {
-            // 使用 OffsetDateTime 进行解析
-            OffsetDateTime offsetDateTime = OffsetDateTime.parse(segment.getStart());
-            // 转换为 java.util.Date
-            Date date = Date.from(offsetDateTime.toInstant());
-            segment.setStartTime(date);
-        });
-        return item;
-    }
-
-    /**
-     * 通过路径名和分段录像开始时间删除录像分段
-     */
-    @Override
-    public String deleteSegment(String name, String start) {
-        return mediaClient.deleteSegment(name, start);
-    }
-
-    //获取通道配置
-    @Override
-    public Conf getPathConfig(String name) {
-        return mediaClient.getPathConfig(name);
-    }
-
-    //获取所有通道配置列表
-    @Override
-    public PathConfig getPathConfigs(Integer pageNum, Integer pageSize) {
-        return mediaClient.getPathConfigs(pageNum - 1, pageSize);
-    }
-
-}
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java
index 53211aa..3d02e9e 100644
--- a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java
+++ b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java
@@ -1,12 +1,11 @@
 package com.ard.vtdu.service.impl;
 
 import com.ard.common.utils.DateUtils;
-import com.ard.vtdu.config.MediamtxConfig;
 import com.ard.vtdu.domain.ArdVtdu;
 import com.ard.vtdu.domain.Conf;
 import com.ard.vtdu.mapper.ArdVtduMapper;
 import com.ard.vtdu.service.IArdVtduService;
-import com.ard.vtdu.service.IMediaService;
+import com.ard.vtdu.service.IArdMediaService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
@@ -29,7 +28,7 @@
     @Resource
     private ArdVtduMapper ardVtduMapper;
     @Resource
-    private IMediaService mediaService;
+    private IArdMediaService mediaService;
 
 
 
diff --git a/ard-vtdu/src/main/resources/mapper/ArdVtduMapper.xml b/ard-vtdu/src/main/resources/mapper/ArdVtduMapper.xml
index e377f5d..8214e3e 100644
--- a/ard-vtdu/src/main/resources/mapper/ArdVtduMapper.xml
+++ b/ard-vtdu/src/main/resources/mapper/ArdVtduMapper.xml
@@ -4,7 +4,7 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ard.vtdu.mapper.ArdVtduMapper">
 
-    <resultMap type="com.ard.vtdu.mapper.ArdVtduMapper" id="ArdVtduResult">
+    <resultMap type="ArdVtdu" id="ArdVtduResult">
         <result property="name" column="name"/>
         <result property="rtspSource" column="rtsp_source"/>
         <result property="rtspUrl" column="rtsp_url"/>

--
Gitblit v1.9.3