From 6531e781105e073a55a23529e2b7b31e85110951 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Mon, 03 Mar 2025 13:25:46 +0800
Subject: [PATCH] 优化流媒体同步
---
ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java | 26 ++++++------
ard-work/src/main/java/com/ard/tianyu/service/impl/UavStreamManager.java | 66 +++++++++++++++++++-------------
ard-work/src/main/java/com/ard/vtdu/client/MediaClient.java | 1
ard-admin/src/main/resources/application-dev.yml | 2
ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java | 2
5 files changed, 55 insertions(+), 42 deletions(-)
diff --git a/ard-admin/src/main/resources/application-dev.yml b/ard-admin/src/main/resources/application-dev.yml
index 0a10dd4..da01e00 100644
--- a/ard-admin/src/main/resources/application-dev.yml
+++ b/ard-admin/src/main/resources/application-dev.yml
@@ -42,7 +42,7 @@
accesskeysecret: 9c9f139f63b343b0a9ef42e05ed29b0b
# 天宇tcp服务器地址
tcpserver: 59.110.237.99
- tcpport: 8124
+ tcpport: 8125
#流媒体配置
mediamtx:
# 流媒体服务器地址
diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java
index c77853f..dabac76 100644
--- a/ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java
+++ b/ard-work/src/main/java/com/ard/tianyu/controller/UavManualFlyController.java
@@ -72,7 +72,7 @@
return AjaxResult.success();
}
- @ApiOperation("强制降落")
+ @ApiOperation(value = "强制降落",notes = "强制无人机在当前位置降落,不理会蔽障信息,调用此指令时需人工确定降落地点安全")
@ApiOperationSupport(order = 7)
@PostMapping("/landForced")
public AjaxResult landForced(@RequestBody LandForcedDTO landForcedDTO) {
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java
index 46494fb..8d8edb2 100644
--- a/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java
@@ -18,17 +18,17 @@
@AllArgsConstructor
@NoArgsConstructor
public class PlanLineData {
- private int finishedAction; // 结束航线后动作
- private float maxSpeed; // 最大飞行速度(单位:米/秒)
- private float autoSpeed; // 自动飞行速度(单位:米/秒)
- private List<PointData> points; // 坐标点数组
- private int loseAction; // 网络失联后动作
- private int homeHeight; // 返航高度
- private int isSaveEnergyMode; // 是否开启节能模式
- private HangarPoint takePoint; // 起飞点机库信息
- private HangarPoint landPoint; // 降落点机库信息
- private List<PointData> interests; // 兴趣点数组
- private NormalModel normalModel; // 普通建模
- private SurroundModel surroundModel; // 环绕建模
- private PointData takeOffPoint; // 起飞点
+ private int finishedAction; // 结束航线后动作(必填)
+ private float maxSpeed; // 最大飞行速度(单位:米/秒)
+ private float autoSpeed; // 自动飞行速度(单位:米/秒)
+ private List<PointData> points; // 坐标点数组(必填)
+ private int loseAction; // 网络失联后动作(必填)
+ private int homeHeight; // 返航高度(必填)
+ private int isSaveEnergyMode; // 是否开启节能模式
+ private HangarPoint takePoint; // 起飞点机库信息
+ private HangarPoint landPoint; // 降落点机库信息
+ private List<PointData> interests; // 兴趣点数组
+ private NormalModel normalModel; // 普通建模
+ private SurroundModel surroundModel; // 环绕建模
+ private PointData takeOffPoint; // 起飞点
}
diff --git a/ard-work/src/main/java/com/ard/tianyu/service/impl/UavStreamManager.java b/ard-work/src/main/java/com/ard/tianyu/service/impl/UavStreamManager.java
index eb3adc9..e3d03ca 100644
--- a/ard-work/src/main/java/com/ard/tianyu/service/impl/UavStreamManager.java
+++ b/ard-work/src/main/java/com/ard/tianyu/service/impl/UavStreamManager.java
@@ -4,11 +4,14 @@
import com.ard.tianyu.service.ITyService;
import com.ard.tianyu.websocket.utils.WebSocketUtil;
import com.ard.vtdu.domain.ArdVtdu;
+import com.ard.vtdu.domain.Conf;
import com.ard.vtdu.service.IMediaService;
+import com.dtflys.forest.exceptions.ForestNetworkException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
+import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -39,39 +42,21 @@
* @param userId 用户ID
*/
public void startPullStream(String boxSn, String userId) {
+ String webrtcUrl = "";
STREAM_USER_MAP.computeIfAbsent(boxSn, k -> ConcurrentHashMap.newKeySet()).add(userId);
-
- String webrtcUrl = BOX_STREAM_PULL_MAP.get(boxSn);
- if (webrtcUrl != null) {
- log.info("{}Already pulled stream: {}", STREAM_LOG_PREFIX, webrtcUrl);
- sendMessageToUser(userId, webrtcUrl);
- return;
- }
-
- try {
- BoxStreamUrlReceiver boxLiveUrl = tyService.getBoxLiveUrl(boxSn);
- if (boxLiveUrl == null) {
+ //不管谁拉流都判断流媒体中是否存在
+ boolean exist = mediaService.checkNameExist(boxSn);
+ if (!exist) {
+ webrtcUrl = addVtdu(boxSn);
+ if (Objects.equals(webrtcUrl, "")) {
log.warn("{}{}{}", STREAM_LOG_PREFIX, STREAM_NOT_FOUND_MSG, boxSn);
sendMessageToUser(userId, STREAM_NOT_FOUND_MSG + boxSn);
- return;
}
-
- ArdVtdu vtdu = ArdVtdu.builder()
- .name(boxSn)
- .mode(0)
- .isCode(0)
- .rtspSource(boxLiveUrl.getRtsp())
- .build();
- ArdVtdu ardVtdu = mediaService.addPath(vtdu);
- webrtcUrl = ardVtdu.getWebrtcUrl();
BOX_STREAM_PULL_MAP.put(boxSn, webrtcUrl);
-
- log.info("{}First pulled stream: {}", STREAM_LOG_PREFIX, webrtcUrl);
- sendMessageToUser(userId, webrtcUrl);
- } catch (Exception e) {
- log.error("{}Failed to start pull stream for box: {}", STREAM_LOG_PREFIX, boxSn, e);
- sendMessageToUser(userId, "Failed to start pull stream due to an internal error.");
+ } else {
+ webrtcUrl = BOX_STREAM_PULL_MAP.get(boxSn);
}
+ sendMessageToUser(userId, webrtcUrl);
}
/**
@@ -102,6 +87,7 @@
}
}
}
+
/**
* 停止拉流
*
@@ -126,4 +112,30 @@
log.error("{}Failed to send message to user: {}", STREAM_LOG_PREFIX, userId, e);
}
}
+
+
+ /**
+ * 通过盒子编号获取rtsp加入流媒体中获取webrtc地址
+ *
+ * @param boxSn 盒子编号
+ * @return String webrtcUrl
+ */
+ private String addVtdu(String boxSn) {
+ try {
+ BoxStreamUrlReceiver boxLiveUrl = tyService.getBoxLiveUrl(boxSn);
+ if (boxLiveUrl != null) {
+ ArdVtdu vtdu = ArdVtdu.builder()
+ .name(boxSn)
+ .mode(0)
+ .isCode(0)
+ .rtspSource(boxLiveUrl.getRtsp())
+ .build();
+ ArdVtdu ardVtdu = mediaService.addPath(vtdu);
+ return ardVtdu.getWebrtcUrl();
+ }
+ } catch (Exception e) {
+ log.error("获取媒体地址异常:{}", e.getMessage());
+ }
+ return "";
+ }
}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/vtdu/client/MediaClient.java b/ard-work/src/main/java/com/ard/vtdu/client/MediaClient.java
index a979248..88b3182 100644
--- a/ard-work/src/main/java/com/ard/vtdu/client/MediaClient.java
+++ b/ard-work/src/main/java/com/ard/vtdu/client/MediaClient.java
@@ -2,6 +2,7 @@
import com.ard.vtdu.domain.*;
import com.dtflys.forest.annotation.*;
+import org.springframework.scheduling.annotation.Async;
/**
* @Description: mediamtx流媒体客户端
--
Gitblit v1.9.3