From b445128fb5bdc24f6703e7a40e9fd9f40919baf2 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期三, 03 十一月 2021 10:30:42 +0800
Subject: [PATCH] 修复订阅清理请示任务的执行时长

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java |  102 ++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 80 insertions(+), 22 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
index a14a4cc..a164077 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
@@ -1,16 +1,24 @@
 package com.genersoft.iot.vmp.gb28181.transmit.request.impl;
 
-import javax.sip.Dialog;
-import javax.sip.DialogState;
-import javax.sip.InvalidArgumentException;
-import javax.sip.RequestEvent;
-import javax.sip.SipException;
+import javax.sip.*;
+import javax.sip.address.SipURI;
+import javax.sip.header.FromHeader;
+import javax.sip.header.HeaderAddress;
+import javax.sip.header.ToHeader;
 import javax.sip.message.Response;
 
+import com.genersoft.iot.vmp.common.StreamInfo;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
 import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
+import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
+import com.genersoft.iot.vmp.service.IMediaServerService;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.text.ParseException;
 import java.util.HashMap;
@@ -18,14 +26,22 @@
 
 /**    
  * @Description: BYE璇锋眰澶勭悊鍣�
- * @author: swwheihei
- * @date:   2020骞�5鏈�3鏃� 涓嬪崍5:32:05     
+ * @author: lawrencehj
+ * @date:   2021骞�3鏈�9鏃�     
  */
 public class ByeRequestProcessor extends SIPRequestAbstractProcessor {
 
-    private IRedisCatchStorage redisCatchStorage;
+	private Logger logger = LoggerFactory.getLogger(ByeRequestProcessor.class);
+
+	private ISIPCommander cmder;
+
+	private IRedisCatchStorage redisCatchStorage;
+
+	private IVideoManagerStorager storager;
 
 	private ZLMRTPServerFactory zlmrtpServerFactory;
+
+	private IMediaServerService mediaServerService;
 
 	/**
 	 * 澶勭悊BYE璇锋眰
@@ -38,18 +54,36 @@
 			Dialog dialog = evt.getDialog();
 			if (dialog == null) return;
 			if (dialog.getState().equals(DialogState.TERMINATED)) {
-				String remoteUri = dialog.getRemoteParty().getURI().toString();
-				String localUri = dialog.getLocalParty().getURI().toString();
-				String platformGbId = remoteUri.substring(remoteUri.indexOf(":") + 1, remoteUri.indexOf("@"));
-				String channelId = localUri.substring(remoteUri.indexOf(":") + 1, remoteUri.indexOf("@"));
+				String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
+				String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
 				SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(platformGbId, channelId);
-				String streamId = sendRtpItem.getStreamId();
-				Map<String, Object> param = new HashMap<>();
-				param.put("vhost","__defaultVhost__");
-				param.put("app","rtp");
-				param.put("stream",streamId);
-				System.out.println("鍋滄鍚戜笂绾ф帹娴侊細" + streamId);
-				zlmrtpServerFactory.stopSendRtpStream(param);
+				logger.info("鏀跺埌bye, [{}/{}]", platformGbId, channelId);
+				if (sendRtpItem != null){
+					String streamId = sendRtpItem.getStreamId();
+					Map<String, Object> param = new HashMap<>();
+					param.put("vhost","__defaultVhost__");
+					param.put("app",sendRtpItem.getApp());
+					param.put("stream",streamId);
+					param.put("ssrc",sendRtpItem.getSsrc());
+					logger.info("鍋滄鍚戜笂绾ф帹娴侊細" + streamId);
+					MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
+					zlmrtpServerFactory.stopSendRtpStream(mediaInfo, param);
+					redisCatchStorage.deleteSendRTPServer(platformGbId, channelId);
+					if (zlmrtpServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId) == 0) {
+						logger.info(streamId + "鏃犲叾瀹冭鐪嬭�咃紝閫氱煡璁惧鍋滄鎺ㄦ祦");
+						cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId);
+					}
+				}
+				// 鍙兘鏄澶囦富鍔ㄥ仠姝�
+				Device device = storager.queryVideoDeviceByChannelId(platformGbId);
+				if (device != null) {
+					StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId);
+					if (streamInfo != null) {
+						redisCatchStorage.stopPlay(streamInfo);
+					}
+					storager.stopPlay(device.getDeviceId(), channelId);
+					mediaServerService.closeRTPServer(device, channelId);
+				}
 			}
 		} catch (SipException e) {
 			e.printStackTrace();
@@ -58,8 +92,6 @@
 		} catch (ParseException e) {
 			e.printStackTrace();
 		}
-		// TODO 浼樺厛绾�99 Bye Request娑堟伅瀹炵幇锛屾娑堟伅涓�鑸负绾ц仈娑堟伅锛屼笂绾х粰涓嬬骇鍙戦�佽棰戝仠姝㈡寚浠�
-		
 	}
 
 	/***
@@ -71,7 +103,9 @@
 	 */
 	private void responseAck(RequestEvent evt) throws SipException, InvalidArgumentException, ParseException {
 		Response response = getMessageFactory().createResponse(Response.OK, evt.getRequest());
-		getServerTransaction(evt).sendResponse(response);
+		ServerTransaction serverTransaction = getServerTransaction(evt);
+		serverTransaction.sendResponse(response);
+		if (serverTransaction.getDialog() != null) serverTransaction.getDialog().delete();
 	}
 
 	public IRedisCatchStorage getRedisCatchStorage() {
@@ -89,4 +123,28 @@
 	public void setZlmrtpServerFactory(ZLMRTPServerFactory zlmrtpServerFactory) {
 		this.zlmrtpServerFactory = zlmrtpServerFactory;
 	}
+
+	public ISIPCommander getSIPCommander() {
+		return cmder;
+	}
+
+	public void setSIPCommander(ISIPCommander cmder) {
+		this.cmder = cmder;
+	}
+
+	public IMediaServerService getMediaServerService() {
+		return mediaServerService;
+	}
+
+	public void setMediaServerService(IMediaServerService mediaServerService) {
+		this.mediaServerService = mediaServerService;
+	}
+
+	public IVideoManagerStorager getStorager() {
+		return storager;
+	}
+
+	public void setStorager(IVideoManagerStorager storager) {
+		this.storager = storager;
+	}
 }

--
Gitblit v1.8.0