From 43ef195543c087d88ac3eea98067b81d7e2b10c2 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 03 七月 2023 16:54:09 +0800
Subject: [PATCH] Merge branch '2.6.8' into wvp-28181-2.0
---
src/main/java/com/genersoft/iot/vmp/vmanager/bean/OtherRtpSendInfo.java | 135 +++++++++++++++++++
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 4
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 15 +-
web_src/src/components/dialog/catalogEdit.vue | 59 ++++----
src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java | 161 +++++++++++++++++++++-
src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java | 1
6 files changed, 327 insertions(+), 48 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
index dcc6074..2c7c2c3 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -157,6 +157,7 @@
public static final String WVP_STREAM_GB_ID_PREFIX = "memberNo_";
public static final String WVP_STREAM_GPS_MSG_PREFIX = "WVP_STREAM_GPS_MSG_";
+ public static final String WVP_OTHER_SEND_RTP_INFO = "VMP_OTHER_SEND_RTP_INFO_";
/**
* Redis Const
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
index e101eff..8151fef 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -385,7 +385,9 @@
}
GbStream gbStream = storager.getGbStream(param.getApp(), param.getStream());
if (gbStream != null) {
- eventPublisher.catalogEventPublishForStream(null, gbStream, param.isRegist()?CatalogEvent.ON:CatalogEvent.OFF);
+ if (userSetting.isUsePushingAsStatus()) {
+ eventPublisher.catalogEventPublishForStream(null, gbStream, param.isRegist()?CatalogEvent.ON:CatalogEvent.OFF);
+ }
}
if (type != null) {
// 鍙戦�佹祦鍙樺寲redis娑堟伅
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index 29c8889..8b23f22 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -304,7 +304,7 @@
@Override
public void sendStreamChangeMsg(String type, JSONObject jsonObject) {
String key = VideoManagerConstants.WVP_MSG_STREAM_CHANGE_PREFIX + type;
- logger.info("[redis 娴佸彉鍖栦簨浠禲 {}: {}", key, jsonObject.toString());
+ logger.info("[redis 娴佸彉鍖栦簨浠禲 鍙戦�� {}: {}", key, jsonObject.toString());
redisTemplate.convertAndSend(key, jsonObject);
}
@@ -540,14 +540,14 @@
@Override
public void sendMobilePositionMsg(JSONObject jsonObject) {
String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_MOBILE_POSITION;
- logger.info("[redis鍙戦�侀�氱煡] 绉诲姩浣嶇疆 {}: {}", key, jsonObject.toString());
+ logger.info("[redis鍙戦�侀�氱煡] 鍙戦�� 绉诲姩浣嶇疆 {}: {}", key, jsonObject.toString());
redisTemplate.convertAndSend(key, jsonObject);
}
@Override
public void sendStreamPushRequestedMsg(MessageForPushChannel msg) {
String key = VideoManagerConstants.VM_MSG_STREAM_PUSH_REQUESTED;
- logger.info("[redis鍙戦�侀�氱煡] 鎺ㄦ祦琚姹� {}: {}/{}", key, msg.getApp(), msg.getStream());
+ logger.info("[redis鍙戦�侀�氱煡] 鍙戦�� 鎺ㄦ祦琚姹� {}: {}/{}", key, msg.getApp(), msg.getStream());
redisTemplate.convertAndSend(key, JSON.toJSON(msg));
}
@@ -555,7 +555,7 @@
public void sendAlarmMsg(AlarmChannelMessage msg) {
// 姝ゆ秷鎭敤浜庡鎺ョ涓夋柟鏈嶅姟涓嬬骇鏉ョ殑娑堟伅鍐呭
String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM;
- logger.info("[redis鍙戦�侀�氱煡] 鎶ヨ{}: {}", key, JSON.toJSON(msg));
+ logger.info("[redis鍙戦�侀�氱煡] 鍙戦�� 鎶ヨ{}: {}", key, JSON.toJSON(msg));
redisTemplate.convertAndSend(key, JSON.toJSON(msg));
}
@@ -568,7 +568,7 @@
@Override
public void sendStreamPushRequestedMsgForStatus() {
String key = VideoManagerConstants.VM_MSG_GET_ALL_ONLINE_REQUESTED;
- logger.info("[redis閫氱煡]鑾峰彇鎵�鏈夋帹娴佽澶囩殑鐘舵��");
+ logger.info("[redis閫氱煡] 鍙戦�� 鑾峰彇鎵�鏈夋帹娴佽澶囩殑鐘舵��");
JSONObject jsonObject = new JSONObject();
jsonObject.put(key, key);
redisTemplate.convertAndSend(key, jsonObject);
@@ -596,6 +596,7 @@
@Override
public void sendDeviceOrChannelStatus(String deviceId, String channelId, boolean online) {
String key = VideoManagerConstants.VM_MSG_SUBSCRIBE_DEVICE_STATUS;
+ logger.info("[redis閫氱煡] 鍙戦�� 鎺ㄩ�佽澶�/閫氶亾鐘舵�侊紝 {}/{}-{}", deviceId, channelId, online);
StringBuilder msg = new StringBuilder();
msg.append(deviceId);
if (channelId != null) {
@@ -626,14 +627,14 @@
@Override
public void sendPlatformStartPlayMsg(MessageForPushChannel msg) {
String key = VideoManagerConstants.VM_MSG_STREAM_START_PLAY_NOTIFY;
- logger.info("[redis鍙戦�侀�氱煡] 鎺ㄦ祦琚笂绾у钩鍙拌鐪� {}: {}/{}->{}", key, msg.getApp(), msg.getStream(), msg.getPlatFormId());
+ logger.info("[redis鍙戦�侀�氱煡] 鍙戦�� 鎺ㄦ祦琚笂绾у钩鍙拌鐪� {}: {}/{}->{}", key, msg.getApp(), msg.getStream(), msg.getPlatFormId());
redisTemplate.convertAndSend(key, JSON.toJSON(msg));
}
@Override
public void sendPlatformStopPlayMsg(MessageForPushChannel msg) {
String key = VideoManagerConstants.VM_MSG_STREAM_STOP_PLAY_NOTIFY;
- logger.info("[redis鍙戦�侀�氱煡] 涓婄骇骞冲彴鍋滄瑙傜湅 {}: {}/{}->{}", key, msg.getApp(), msg.getStream(), msg.getPlatFormId());
+ logger.info("[redis鍙戦�侀�氱煡] 鍙戦�� 涓婄骇骞冲彴鍋滄瑙傜湅 {}: {}/{}->{}", key, msg.getApp(), msg.getStream(), msg.getPlatFormId());
redisTemplate.convertAndSend(key, JSON.toJSON(msg));
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/bean/OtherRtpSendInfo.java b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/OtherRtpSendInfo.java
new file mode 100644
index 0000000..225e40c
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/bean/OtherRtpSendInfo.java
@@ -0,0 +1,135 @@
+package com.genersoft.iot.vmp.vmanager.bean;
+
+public class OtherRtpSendInfo {
+
+ /**
+ * 鍙戞祦IP
+ */
+ private String ip;
+
+ /**
+ * 鍙戞祦绔彛
+ */
+ private int port;
+
+ /**
+ * 鏀舵祦IP
+ */
+ private String receiveIp;
+
+ /**
+ * 鏀舵祦绔彛
+ */
+ private int receivePort;
+
+ /**
+ * 浼氳瘽ID
+ */
+ private String callId;
+
+ /**
+ * 娴両D
+ */
+ private String stream;
+
+ /**
+ * 鎺ㄦ祦搴旂敤鍚�
+ */
+ private String pushApp;
+
+ /**
+ * 鎺ㄦ祦娴両D
+ */
+ private String pushStream;
+
+ /**
+ * 鎺ㄦ祦SSRC
+ */
+ private String pushSSRC;
+
+
+
+ public String getIp() {
+ return ip;
+ }
+
+ public void setIp(String ip) {
+ this.ip = ip;
+ }
+
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ public String getReceiveIp() {
+ return receiveIp;
+ }
+
+ public void setReceiveIp(String receiveIp) {
+ this.receiveIp = receiveIp;
+ }
+
+ public int getReceivePort() {
+ return receivePort;
+ }
+
+ public void setReceivePort(int receivePort) {
+ this.receivePort = receivePort;
+ }
+
+ public String getCallId() {
+ return callId;
+ }
+
+ public void setCallId(String callId) {
+ this.callId = callId;
+ }
+
+ public String getStream() {
+ return stream;
+ }
+
+ public void setStream(String stream) {
+ this.stream = stream;
+ }
+
+ public String getPushApp() {
+ return pushApp;
+ }
+
+ public void setPushApp(String pushApp) {
+ this.pushApp = pushApp;
+ }
+
+ public String getPushStream() {
+ return pushStream;
+ }
+
+ public void setPushStream(String pushStream) {
+ this.pushStream = pushStream;
+ }
+
+ public String getPushSSRC() {
+ return pushSSRC;
+ }
+
+ public void setPushSSRC(String pushSSRC) {
+ this.pushSSRC = pushSSRC;
+ }
+
+ @Override
+ public String toString() {
+ return "OtherRtpSendInfo{" +
+ "ip='" + ip + '\'' +
+ ", port=" + port +
+ ", receiveIp='" + receiveIp + '\'' +
+ ", receivePort=" + receivePort +
+ ", callId='" + callId + '\'' +
+ ", stream='" + stream + '\'' +
+ '}';
+ }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
index 08ea9fd..2012625 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
@@ -1,25 +1,43 @@
package com.genersoft.iot.vmp.vmanager.rtp;
+import com.alibaba.fastjson2.JSONObject;
+import com.genersoft.iot.vmp.common.VideoManagerConstants;
+import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.conf.VersionInfo;
import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory;
+import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
+import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory;
+import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForRtpServerTimeout;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.service.*;
+import com.genersoft.iot.vmp.service.IDeviceChannelService;
+import com.genersoft.iot.vmp.service.IDeviceService;
+import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
+import com.genersoft.iot.vmp.vmanager.bean.OtherRtpSendInfo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
@SuppressWarnings("rawtypes")
@Tag(name = "绗笁鏂规湇鍔″鎺�")
@@ -31,8 +49,10 @@
@Autowired
private ZLMServerFactory zlmServerFactory;
+ private final static Logger logger = LoggerFactory.getLogger(RtpController.class);
+
@Autowired
- private ZlmHttpHookSubscribe zlmHttpHookSubscribe;
+ private ZlmHttpHookSubscribe hookSubscribe;
@Autowired
private IMediaServerService mediaServerService;
@@ -53,11 +73,11 @@
private IDeviceChannelService channelService;
@Autowired
- private IStreamPushService pushService;
+ private DynamicTask dynamicTask;
@Autowired
- private IStreamProxyService proxyService;
+ private RedisTemplate<Object, Object> redisTemplate;
@Value("${server.port}")
@@ -77,12 +97,76 @@
@Parameter(name = "stream", description = "褰㈡垚鐨勬祦鐨処D", required = true)
@Parameter(name = "tcpMode", description = "鏀舵祦妯″紡锛� 0涓篣DP锛� 1涓篢CP琚姩", required = true)
@Parameter(name = "callBack", description = "鍥炶皟鍦板潃锛屽鏋滄敹娴佽秴鏃朵細閫氶亾鍥炶皟閫氱煡锛屽洖璋冧负get璇锋眰锛屽弬鏁颁负callId", required = true)
- public SendRtpItem openRtpServer(Boolean isSend, String ssrc, String callId, String stream, Integer tcpMode, String callBack) {
- MediaServerItem mediaServerItem = mediaServerService.getMediaServerForMinimumLoad(null);
+ public OtherRtpSendInfo openRtpServer(Boolean isSend, String ssrc, String callId, String stream, Integer tcpMode, String callBack) {
+
+ logger.info("[绗笁鏂规湇鍔″鎺�->寮�鍚敹娴佸拰鑾峰彇鍙戞祦淇℃伅] isSend->{}, ssrc->{}, callId->{}, stream->{}, tcpMode->{}, callBack->{}",
+ isSend, ssrc, callId, stream, tcpMode==0?"UDP":"TCP琚姩", callBack);
+
+ MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer();
if (mediaServerItem == null) {
throw new ControllerException(ErrorCode.ERROR100.getCode(),"娌℃湁鍙敤鐨凪ediaServer");
}
- return null;
+ if (stream == null) {
+ throw new ControllerException(ErrorCode.ERROR100.getCode(),"stream鍙傛暟涓嶅彲涓虹┖");
+ }
+ if (isSend != null && isSend && callId == null) {
+ throw new ControllerException(ErrorCode.ERROR100.getCode(),"isSend涓簍rue鏃讹紝CallID涓嶈兘涓虹┖");
+ }
+ int ssrcInt = 0;
+ if (ssrc != null) {
+ try {
+ ssrcInt = Integer.parseInt(ssrc);
+ }catch (NumberFormatException e) {
+ throw new ControllerException(ErrorCode.ERROR100.getCode(),"ssrc鏍煎紡閿欒");
+ }
+
+ }
+ int localPort = zlmServerFactory.createRTPServer(mediaServerItem, stream, ssrcInt, null, false, tcpMode);
+ // 娉ㄥ唽鍥炶皟濡傛灉rtp鏀舵祦瓒呮椂鍒欓�氳繃鍥炶皟鍙戦�侀�氱煡
+ if (callBack != null) {
+ HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(ssrc, null, mediaServerItem.getId());
+ // 璁㈤槄 zlm鍚姩浜嬩欢, 鏂扮殑zlm涔熶細浠庤繖閲岃繘鍏ョ郴缁�
+ hookSubscribe.addSubscribe(hookSubscribeForRtpServerTimeout,
+ (mediaServerItemInUse, response)->{
+ if (stream.equals(response.getString("stream_id"))) {
+ logger.info("[寮�鍚敹娴佸拰鑾峰彇鍙戞祦淇℃伅] 绛夊緟鏀舵祦瓒呮椂 callId->{}, 鍙戦�佸洖璋�", callId);
+ OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
+ OkHttpClient client = httpClientBuilder.build();
+ String url = callBack + "?callId=" + callId;
+ Request request = new Request.Builder().get().url(url).build();
+ try {
+ client.newCall(request).execute();
+ } catch (IOException e) {
+ logger.error("[寮�鍚敹娴佸拰鑾峰彇鍙戞祦淇℃伅] 绛夊緟鏀舵祦瓒呮椂 callId->{}, 鍙戦�佸洖璋冨け璐�", callId, e);
+ }
+ }
+ });
+ }
+ OtherRtpSendInfo otherRtpSendInfo = new OtherRtpSendInfo();
+ otherRtpSendInfo.setReceiveIp(mediaServerItem.getSdpIp());
+ otherRtpSendInfo.setReceivePort(localPort);
+ otherRtpSendInfo.setCallId(callId);
+ otherRtpSendInfo.setStream(stream);
+ if (isSend != null && isSend) {
+ String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + callId;
+ // 棰勫垱寤哄彂娴佷俊鎭�
+ int port = zlmServerFactory.keepPort(mediaServerItem, callId, 0, ssrc1 -> {
+ return redisTemplate.opsForValue().get(key) != null;
+ });
+
+ // 灏嗕俊鎭啓鍏edis涓紝浠ュ鍚庣敤
+ redisTemplate.opsForValue().set(key, otherRtpSendInfo);
+ // 璁剧疆瓒呮椂浠诲姟锛岃秴鏃舵湭浣跨敤锛屽垯鑷姩绉婚櫎锛屽苟鍏抽棴绔彛淇濇寔, 榛樿浜斿垎閽�
+ dynamicTask.startDelay(key, ()->{
+ logger.info("[绗笁鏂规湇鍔″鎺�->寮�鍚敹娴佸拰鑾峰彇鍙戞祦淇℃伅] 绔彛淇濇寔瓒呮椂 callId->{}", callId);
+ redisTemplate.delete(key);
+ zlmServerFactory.releasePort(mediaServerItem, callId);
+ }, 300000);
+ otherRtpSendInfo.setIp(mediaServerItem.getSdpIp());
+ otherRtpSendInfo.setPort(port);
+ logger.info("[寮�鍚敹娴佸拰鑾峰彇鍙戞祦淇℃伅] 缁撴灉锛宑allId->{}锛� {}", callId, otherRtpSendInfo);
+ }
+ return otherRtpSendInfo;
}
@GetMapping(value = "/receive/close")
@@ -90,7 +174,9 @@
@Operation(summary = "鍏抽棴鏀舵祦")
@Parameter(name = "stream", description = "娴佺殑ID", required = true)
public void closeRtpServer(String stream) {
-
+ logger.info("[绗笁鏂规湇鍔″鎺�->鍏抽棴鏀舵祦] stream->{}", stream);
+ MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer();
+ zlmServerFactory.closeRtpServer(mediaServerItem,stream);
}
@GetMapping(value = "/send/start")
@@ -103,9 +189,46 @@
@Parameter(name = "stream", description = "寰呭彂閫佹祦Id", required = true)
@Parameter(name = "callId", description = "鏁翠釜杩囩▼鐨勫敮涓�鏍囪瘑锛屼笉浼犲垯浣跨敤闅忔満绔彛鍙戞祦", required = true)
@Parameter(name = "onlyAudio", description = "鏄惁鍙湁闊抽", required = true)
+ @Parameter(name = "isUdp", description = "鏄惁涓篣DP", required = true)
@Parameter(name = "streamType", description = "娴佺被鍨嬶紝1涓篹s娴侊紝2涓簆s娴侊紝 榛樿es娴�", required = false)
- public void sendRTP(String ssrc, String ip, Integer port, String app, String stream, String callId, Boolean onlyAudio, Integer streamType) {
+ public void sendRTP(String ssrc, String ip, Integer port, String app, String stream, String callId, Boolean onlyAudio, Boolean isUdp, Integer streamType) {
+ logger.info("[绗笁鏂规湇鍔″鎺�->鍙戦�佹祦] ssrc->{}, ip->{}, port->{}, app->{}, stream->{}, callId->{}, onlyAudio->{}, streamType->{}",
+ ssrc, ip, port, app, stream, callId, onlyAudio, streamType == 1? "ES":"PS");
+ MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer();
+ String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + callId;
+ OtherRtpSendInfo sendInfo = (OtherRtpSendInfo)redisTemplate.opsForValue().get(key);
+ if (sendInfo != null) {
+ zlmServerFactory.releasePort(mediaServerItem, sendInfo.getCallId());
+ }else {
+ sendInfo = new OtherRtpSendInfo();
+ }
+ sendInfo.setPushApp(app);
+ sendInfo.setPushStream(stream);
+ sendInfo.setPushSSRC(ssrc);
+ Map<String, Object> param = new HashMap<>(12);
+ param.put("vhost","__defaultVhost__");
+ param.put("app",app);
+ param.put("stream",stream);
+ param.put("ssrc", ssrc);
+
+ param.put("dst_url",ip);
+ param.put("dst_port", port);
+ String is_Udp = isUdp ? "1" : "0";
+ param.put("is_udp", is_Udp);
+ param.put("src_port", sendInfo.getPort());
+ param.put("use_ps", streamType==2 ? "1" : "0");
+ param.put("only_audio", onlyAudio ? "1" : "0");
+
+ JSONObject jsonObject = zlmServerFactory.startSendRtpStream(mediaServerItem, param);
+ if (jsonObject.getInteger("code") == 0) {
+ logger.info("[绗笁鏂规湇鍔″鎺�->鍙戦�佹祦] 鍙戞祦鎴愬姛锛宑allId->{}", callId);
+ redisTemplate.opsForValue().set(key, sendInfo);
+ }else {
+ redisTemplate.delete(key);
+ logger.info("[绗笁鏂规湇鍔″鎺�->鍙戦�佹祦] 鍙戞祦澶辫触锛宑allId->{}, {}", callId, jsonObject.getString("msg"));
+ throw new ControllerException(ErrorCode.ERROR100.getCode(), "[鍙戞祦澶辫触] " + jsonObject.getString("msg"));
+ }
}
@@ -115,7 +238,25 @@
@Operation(summary = "鍏抽棴鍙戦�佹祦")
@Parameter(name = "callId", description = "鏁翠釜杩囩▼鐨勫敮涓�鏍囪瘑锛屼笉浼犲垯浣跨敤闅忔満绔彛鍙戞祦", required = true)
public void closeSendRTP(String callId) {
-
+ logger.info("[绗笁鏂规湇鍔″鎺�->鍏抽棴鍙戦�佹祦] callId->{}", callId);
+ String key = VideoManagerConstants.WVP_OTHER_SEND_RTP_INFO + userSetting.getServerId() + callId;
+ OtherRtpSendInfo sendInfo = (OtherRtpSendInfo)redisTemplate.opsForValue().get(key);
+ if (sendInfo == null){
+ throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏈紑鍚彂娴�");
+ }
+ Map<String, Object> param = new HashMap<>();
+ param.put("vhost","__defaultVhost__");
+ param.put("app",sendInfo.getPushApp());
+ param.put("stream",sendInfo.getPushStream());
+ param.put("ssrc",sendInfo.getPushSSRC());
+ MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer();
+ Boolean result = zlmServerFactory.stopSendRtpStream(mediaServerItem, param);
+ if (!result) {
+ logger.info("[绗笁鏂规湇鍔″鎺�->鍏抽棴鍙戦�佹祦] 澶辫触 callId->{}", callId);
+ throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍋滄鍙戞祦澶辫触");
+ }else {
+ logger.info("[绗笁鏂规湇鍔″鎺�->鍏抽棴鍙戦�佹祦] 鎴愬姛 callId->{}", callId);
+ }
}
}
diff --git a/web_src/src/components/dialog/catalogEdit.vue b/web_src/src/components/dialog/catalogEdit.vue
index e2fe59b..9a5e3a3 100644
--- a/web_src/src/components/dialog/catalogEdit.vue
+++ b/web_src/src/components/dialog/catalogEdit.vue
@@ -12,15 +12,6 @@
>
<div id="shared" style="margin-top: 1rem;margin-right: 100px;">
<el-form ref="form" :rules="rules" :model="form" label-width="140px" >
-<!-- <el-form-item >-->
-<!-- 寤鸿鐨勭被鍨嬶細-->
-<!-- <br/>-->
-<!--   琛屾斂鍖哄垝锛堝彲閫�2浣�/4浣�/6浣�/8浣�/10浣嶆暟瀛楋紝渚嬪锛�130432锛岃〃绀烘渤鍖楃渷閭兏甯傚箍骞冲幙锛�-->
-<!-- <br/>-->
-<!--   涓氬姟鍒嗙粍锛堢11銆�12銆�13浣�215锛屼緥濡傦細34020000002150000001锛�-->
-<!-- <br/>-->
-<!--   铏氭嫙缁勭粐锛堢11銆�12銆�13浣�216锛屼緥濡傦細34020000002160000001锛�-->
-<!-- </el-form-item>-->
<el-form-item label="鑺傜偣缂栧彿" prop="id" >
<el-input v-model="form.id" :disabled="isEdit" clearable></el-input>
</el-form-item>
@@ -63,7 +54,11 @@
return callback(new Error('琛屾斂鍖哄垝缂栧彿蹇呴』涓�2/4/6/8浣�'));
}
if (this.form.parentId !== this.platformDeviceId && this.form.parentId.length >= value.trim().length) {
- return callback(new Error('琛屾斂鍖哄垝缂栧彿闀垮害搴旇姣忔涓や綅閫掑'));
+ if (this.form.parentId.length === 20) {
+ return callback(new Error('涓氬姟鍒嗙粍/铏氭嫙缁勭粐涓嬩笉鍙垱寤鸿鏀垮尯鍒�'));
+ }else {
+ return callback(new Error('琛屾斂鍖哄垝缂栧彿闀垮害搴旇姣忔涓や綅閫掑'));
+ }
}
}else {
if (value.trim().length !== 20) {
@@ -122,27 +117,31 @@
this.level = level;
},
onSubmit: function () {
- console.log("onSubmit");
- console.log(this.form);
- this.$axios({
- method:"post",
- url:`/api/platform/catalog/${!this.isEdit? "add":"edit"}`,
- data: this.form
- }).then((res)=> {
- if (res.data.code === 0) {
- if (this.submitCallback)this.submitCallback(this.form)
- }else {
- this.$message({
- showClose: true,
- message: res.data.msg,
- type: "error",
+ this.$refs["form"].validate((valid) => {
+ if (valid) {
+ this.$axios({
+ method:"post",
+ url:`/api/platform/catalog/${!this.isEdit? "add":"edit"}`,
+ data: this.form
+ }).then((res)=> {
+ if (res.data.code === 0) {
+ if (this.submitCallback)this.submitCallback(this.form)
+ }else {
+ this.$message({
+ showClose: true,
+ message: res.data.msg,
+ type: "error",
+ });
+ }
+ this.close();
+ })
+ .catch((error)=> {
+ console.log(error);
});
- }
- this.close();
- })
- .catch((error)=> {
- console.log(error);
- });
+ } else {
+ return false;
+ }
+ });
},
close: function () {
this.isEdit = false;
--
Gitblit v1.8.0