From d4f6ec39b7e0421757a6b9d1a68b1c4610ea2e8c Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 14 三月 2024 14:54:20 +0800
Subject: [PATCH] 优化CivilCode缓存

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java |  161 +++++++++++++++++++++++++++++++++--------------------
 1 files changed, 99 insertions(+), 62 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
index 68bc38b..7004820 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java
@@ -3,16 +3,16 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.genersoft.iot.vmp.conf.DynamicTask;
 import com.genersoft.iot.vmp.conf.UserSetting;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
 import com.genersoft.iot.vmp.gb28181.transmit.event.request.ISIPRequestProcessor;
 import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
-import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
+import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory;
 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.IDeviceService;
 import com.genersoft.iot.vmp.service.IMediaServerService;
 import com.genersoft.iot.vmp.service.IPlayService;
 import com.genersoft.iot.vmp.service.bean.RequestPushStreamMsg;
@@ -57,10 +57,16 @@
     private IRedisCatchStorage redisCatchStorage;
 
 	@Autowired
+    private UserSetting userSetting;
+
+	@Autowired
 	private IVideoManagerStorage storager;
 
 	@Autowired
-	private ZLMRTPServerFactory zlmrtpServerFactory;
+	private IDeviceService deviceService;
+
+	@Autowired
+	private ZLMServerFactory zlmServerFactory;
 
 	@Autowired
 	private ZlmHttpHookSubscribe hookSubscribe;
@@ -75,9 +81,6 @@
 	private RedisGbPlayMsgListener redisGbPlayMsgListener;
 
 	@Autowired
-	private UserSetting userSetting;
-
-	@Autowired
 	private IPlayService playService;
 
 
@@ -87,75 +90,109 @@
 	@Override
 	public void process(RequestEvent evt) {
 		CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME);
+		dynamicTask.stop(callIdHeader.getCallId());
+		String fromUserId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
+		String toUserId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
+		logger.info("[鏀跺埌ACK]锛� 鏉ヨ嚜->{}", fromUserId);
+		SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(null, null, null, callIdHeader.getCallId());
+		if (sendRtpItem == null) {
+			logger.warn("[鏀跺埌ACK]锛氭湭鎵惧埌鏉ヨ嚜{}锛岀洰鏍囦负({})鐨勬帹娴佷俊鎭�",fromUserId, toUserId);
+			return;
+		}
+		// tcp涓诲姩鏃讹紝姝ゆ椂鏄骇鑱斾笅绾у钩鍙帮紝鍦ㄥ洖澶�200ok鏃讹紝鏈湴宸茬粡璇锋眰zlm寮�鍚洃鍚紝璺宠繃涓嬮潰姝ラ
+		if (sendRtpItem.isTcpActive()) {
+			logger.info("鏀跺埌ACK锛宺tp/{} TCP涓诲姩鏂瑰紡鍚庣画澶勭悊", sendRtpItem.getStream());
+			return;
+		}
+		MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
+		logger.info("鏀跺埌ACK锛宺tp/{}寮�濮嬪悜涓婄骇鎺ㄦ祦, 鐩爣={}:{}锛孲SRC={}, 鍗忚:{}",
+				sendRtpItem.getStream(),
+				sendRtpItem.getIp(),
+				sendRtpItem.getPort(),
+				sendRtpItem.getSsrc(),
+				sendRtpItem.isTcp()?(sendRtpItem.isTcpActive()?"TCP涓诲姩":"TCP琚姩"):"UDP"
+		);
+		ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(fromUserId);
 
-		String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
-		logger.info("[鏀跺埌ACK]锛� platformGbId->{}", platformGbId);
-		if (userSetting.getPushStreamAfterAck()) {
-			ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(platformGbId);
-			// 鍙栨秷璁剧疆鐨勮秴鏃朵换鍔�
-			dynamicTask.stop(callIdHeader.getCallId());
-			String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
-			SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(null, null, null, callIdHeader.getCallId());
-			if (sendRtpItem == null) {
-				logger.warn("[鏀跺埌ACK]锛氭湭鎵惧埌閫氶亾({})鐨勬帹娴佷俊鎭�", channelId);
-				return;
-			}
-			String isUdp = sendRtpItem.isTcp() ? "0" : "1";
-			MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
-			logger.info("鏀跺埌ACK锛宺tp/{}寮�濮嬪悜涓婄骇鎺ㄦ祦, 鐩爣={}:{}锛孲SRC={}, RTCP={}", sendRtpItem.getStreamId(),
-					sendRtpItem.getIp(), sendRtpItem.getPort(), sendRtpItem.getSsrc(), sendRtpItem.isRtcp());
-			Map<String, Object> param = new HashMap<>(12);
-			param.put("vhost","__defaultVhost__");
-			param.put("app",sendRtpItem.getApp());
-			param.put("stream",sendRtpItem.getStreamId());
-			param.put("ssrc", sendRtpItem.getSsrc());
-			param.put("src_port", sendRtpItem.getLocalPort());
-			param.put("pt", sendRtpItem.getPt());
-			param.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
-			param.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0");
-			param.put("is_udp", isUdp);
-			if (!sendRtpItem.isTcp()) {
-				// udp妯″紡涓嬪紑鍚痳tcp淇濇椿
-				param.put("udp_rtcp_timeout", sendRtpItem.isRtcp()? "1":"0");
-			}
-
+		if (parentPlatform != null) {
+			Map<String, Object> param = getSendRtpParam(sendRtpItem);
 			if (mediaInfo == null) {
 				RequestPushStreamMsg requestPushStreamMsg = RequestPushStreamMsg.getInstance(
-						sendRtpItem.getMediaServerId(), sendRtpItem.getApp(), sendRtpItem.getStreamId(),
+						sendRtpItem.getMediaServerId(), sendRtpItem.getApp(), sendRtpItem.getStream(),
 						sendRtpItem.getIp(), sendRtpItem.getPort(), sendRtpItem.getSsrc(), sendRtpItem.isTcp(),
 						sendRtpItem.getLocalPort(), sendRtpItem.getPt(), sendRtpItem.isUsePs(), sendRtpItem.isOnlyAudio());
 				redisGbPlayMsgListener.sendMsgForStartSendRtpStream(sendRtpItem.getServerId(), requestPushStreamMsg, json -> {
 					playService.startSendRtpStreamHand(sendRtpItem, parentPlatform, json, param, callIdHeader);
 				});
 			} else {
-				// 濡傛灉鏄潪涓ユ牸妯″紡锛岄渶瑕佸叧闂鍙e崰鐢�
-				JSONObject startSendRtpStreamResult = null;
-				if (sendRtpItem.getLocalPort() != 0) {
-					HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(sendRtpItem.getSsrc(), null, mediaInfo.getId());
-					hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout);
-					if (zlmrtpServerFactory.releasePort(mediaInfo, sendRtpItem.getSsrc())) {
-						if (sendRtpItem.isTcpActive()) {
-							startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpPassive(mediaInfo, param);
-						}else {
-							param.put("dst_url", sendRtpItem.getIp());
-							param.put("dst_port", sendRtpItem.getPort());
-							startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpStream(mediaInfo, param);
-						}
-					}
-				}else {
-					if (sendRtpItem.isTcpActive()) {
-						startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpPassive(mediaInfo, param);
-					}else {
-						param.put("dst_url", sendRtpItem.getIp());
-						param.put("dst_port", sendRtpItem.getPort());
-						startSendRtpStreamResult = zlmrtpServerFactory.startSendRtpStream(mediaInfo, param);
-					}
-				}
+				JSONObject startSendRtpStreamResult = sendRtp(sendRtpItem, mediaInfo, param);
 				if (startSendRtpStreamResult != null) {
 					playService.startSendRtpStreamHand(sendRtpItem, parentPlatform, startSendRtpStreamResult, param, callIdHeader);
 				}
 			}
+		}else {
+			Device device = deviceService.getDevice(fromUserId);
+			if (device == null) {
+				logger.warn("[鏀跺埌ACK]锛氭潵鑷獅}锛岀洰鏍囦负({})鐨勬帹娴佷俊鎭负鎵惧埌娴佷綋鏈嶅姟[{}]淇℃伅",fromUserId, toUserId, sendRtpItem.getMediaServerId());
+				return;
+			}
+			// 璁剧疆涓烘敹鍒癆CK鍚庡彂閫佽闊崇殑璁惧宸茬粡鍦ㄥ彂閫�200OK寮�濮嬪彂娴佷簡
+			if (!device.isBroadcastPushAfterAck()) {
+				return;
+			}
+			if (mediaInfo == null) {
+				logger.warn("[鏀跺埌ACK]锛氭潵鑷獅}锛岀洰鏍囦负({})鐨勬帹娴佷俊鎭负鎵惧埌娴佷綋鏈嶅姟[{}]淇℃伅",fromUserId, toUserId, sendRtpItem.getMediaServerId());
+				return;
+			}
+			Map<String, Object> param = getSendRtpParam(sendRtpItem);
+			JSONObject startSendRtpStreamResult = sendRtp(sendRtpItem, mediaInfo, param);
+			if (startSendRtpStreamResult != null) {
+				playService.startSendRtpStreamHand(sendRtpItem, device, startSendRtpStreamResult, param, callIdHeader);
+			}
 		}
+	}
+
+	private Map<String, Object> getSendRtpParam(SendRtpItem sendRtpItem) {
+		String isUdp = sendRtpItem.isTcp() ? "0" : "1";
+		Map<String, Object> param = new HashMap<>(12);
+		param.put("vhost","__defaultVhost__");
+		param.put("app",sendRtpItem.getApp());
+		param.put("stream",sendRtpItem.getStream());
+		param.put("ssrc", sendRtpItem.getSsrc());
+		param.put("dst_url",sendRtpItem.getIp());
+		param.put("dst_port", sendRtpItem.getPort());
+		param.put("src_port", sendRtpItem.getLocalPort());
+		param.put("pt", sendRtpItem.getPt());
+		param.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0");
+		param.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0");
+		param.put("is_udp", isUdp);
+		if (!sendRtpItem.isTcp()) {
+			// udp妯″紡涓嬪紑鍚痳tcp淇濇椿
+			param.put("udp_rtcp_timeout", sendRtpItem.isRtcp()? "1":"0");
+		}
+		return param;
+	}
+
+	private JSONObject sendRtp(SendRtpItem sendRtpItem, MediaServerItem mediaInfo, Map<String, Object> param){
+		JSONObject startSendRtpStreamResult = null;
+		if (sendRtpItem.getLocalPort() != 0) {
+			if (sendRtpItem.isTcpActive()) {
+				startSendRtpStreamResult = zlmServerFactory.startSendRtpPassive(mediaInfo, param);
+			}else {
+				param.put("dst_url", sendRtpItem.getIp());
+				param.put("dst_port", sendRtpItem.getPort());
+				startSendRtpStreamResult = zlmServerFactory.startSendRtpStream(mediaInfo, param);
+			}
+		}else {
+			if (sendRtpItem.isTcpActive()) {
+				startSendRtpStreamResult = zlmServerFactory.startSendRtpPassive(mediaInfo, param);
+			}else {
+				param.put("dst_url", sendRtpItem.getIp());
+				param.put("dst_port", sendRtpItem.getPort());
+				startSendRtpStreamResult = zlmServerFactory.startSendRtpStream(mediaInfo, param);
+			}
+		}
+		return startSendRtpStreamResult;
 
 	}
 

--
Gitblit v1.8.0