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