From b2c953fc76de2a9686ee81d5311bd9b06e453912 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 07 三月 2022 01:17:45 +0800
Subject: [PATCH] 优化ssrc释放逻辑,优化级联点播速度,去除等待流格式的配置项

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java |   29 ++++++++++++++++++++++++++---
 1 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index f861da4..f82f781 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.genersoft.iot.vmp.common.StreamInfo;
+import com.genersoft.iot.vmp.conf.DynamicTask;
 import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
@@ -21,6 +22,7 @@
 import com.genersoft.iot.vmp.service.bean.SSRCInfo;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
+import com.genersoft.iot.vmp.utils.SerializeUtils;
 import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;
 import gov.nist.javax.sdp.TimeDescriptionImpl;
 import gov.nist.javax.sdp.fields.TimeField;
@@ -67,6 +69,9 @@
 
 	@Autowired
 	private IRedisCatchStorage  redisCatchStorage;
+
+	@Autowired
+	private DynamicTask dynamicTask;
 
 	@Autowired
 	private SIPCommander cmder;
@@ -257,11 +262,13 @@
 					}
 					sendRtpItem.setCallId(callIdHeader.getCallId());
 					sendRtpItem.setPlay("Play".equals(sessionName));
+					byte[] dialogByteArray = SerializeUtils.serialize(evt.getDialog());
+					sendRtpItem.setDialog(dialogByteArray);
+					byte[] transactionByteArray = SerializeUtils.serialize(evt.getServerTransaction());
+					sendRtpItem.setTransaction(transactionByteArray);
 					// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
 					redisCatchStorage.updateSendRTPSever(sendRtpItem);
 
-					Device finalDevice = device;
-					MediaServerItem finalMediaServerItem = mediaServerItem;
 					Long finalStartTime = startTime;
 					Long finalStopTime = stopTime;
 					ZLMHttpHookSubscribe.Event hookEvent = (mediaServerItemInUSe, responseJSON)->{
@@ -289,7 +296,15 @@
 						content.append("f=\r\n");
 
 						try {
+							// 瓒呮椂鏈敹鍒癆ck搴旇鍥炲bye,褰撳墠绛夊緟鏃堕棿涓�10绉�
+							dynamicTask.startDelay(callIdHeader.getCallId(), ()->{
+								logger.info("Ack 绛夊緟瓒呮椂");
+								mediaServerService.releaseSsrc(mediaServerItemInUSe.getId(), ssrc);
+								// 鍥炲bye
+								cmderFroPlatform.streamByeCmd(platform, callIdHeader.getCallId());
+							}, 60);
 							responseSdpAck(evt, content.toString(), platform);
+
 						} catch (SipException e) {
 							e.printStackTrace();
 						} catch (InvalidArgumentException e) {
@@ -320,6 +335,7 @@
 								if (result.getEvent() != null) {
 									errorEvent.response(result.getEvent());
 								}
+								redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null);
 								try {
 									responseAck(evt, Response.REQUEST_TIMEOUT);
 								} catch (SipException e) {
@@ -343,7 +359,9 @@
 								sendRtpItem.setStreamId(String.format("%s_%s", device.getDeviceId(), channelId));
 							}
 							sendRtpItem.setPlay(false);
-							playService.play(mediaServerItem,device.getDeviceId(), channelId, hookEvent,errorEvent);
+							playService.play(mediaServerItem,device.getDeviceId(), channelId, hookEvent, errorEvent, ()->{
+								redisCatchStorage.deleteSendRTPServer(platform.getServerGBId(), channelId, callIdHeader.getCallId(), null);
+							});
 						}else {
 							sendRtpItem.setStreamId(streamInfo.getStream());
 							hookEvent.response(mediaServerItem, null);
@@ -365,6 +383,11 @@
 
 					// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
 					sendRtpItem.setStatus(1);
+					sendRtpItem.setCallId(callIdHeader.getCallId());
+					byte[] dialogByteArray = SerializeUtils.serialize(evt.getDialog());
+					sendRtpItem.setDialog(dialogByteArray);
+					byte[] transactionByteArray = SerializeUtils.serialize(evt.getServerTransaction());
+					sendRtpItem.setTransaction(transactionByteArray);
 					redisCatchStorage.updateSendRTPSever(sendRtpItem);
 					StringBuffer content = new StringBuffer(200);
 					content.append("v=0\r\n");

--
Gitblit v1.8.0