From ef742e715b8c0a983d661aa5b5f8980dade8c790 Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期四, 22 四月 2021 15:28:40 +0800
Subject: [PATCH] 优化宕机后点播中设备发送bye

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java |  106 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 73 insertions(+), 33 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index 27402ba..5f31d87 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -10,11 +10,14 @@
 import javax.sip.header.ViaHeader;
 import javax.sip.message.Request;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.genersoft.iot.vmp.common.StreamInfo;
 import com.genersoft.iot.vmp.conf.MediaServerConfig;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
+import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
@@ -23,7 +26,6 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
-// import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.DependsOn;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
@@ -75,6 +77,9 @@
 
 	@Autowired
 	private ZLMRTPServerFactory zlmrtpServerFactory;
+
+	@Autowired
+	private ZLMRESTfulUtils zlmresTfulUtils;
 
 	@Value("${media.rtp.enable}")
 	private boolean rtpEnable;
@@ -333,17 +338,17 @@
 	
 	 /**
 	 * 	璇锋眰棰勮瑙嗛娴�
-	 * @param device  瑙嗛璁惧
-	 * @param channelId  棰勮閫氶亾
-	 * @param event hook璁㈤槄
-	 * @param errorEvent sip閿欒璁㈤槄
-	 */
+	  * @param device  瑙嗛璁惧
+	  * @param channelId  棰勮閫氶亾
+	  * @param event hook璁㈤槄
+	  * @param errorEvent sip閿欒璁㈤槄
+	  */
 	@Override
 	public void playStreamCmd(Device device, String channelId, ZLMHttpHookSubscribe.Event event, SipSubscribe.Event errorEvent) {
+		String streamId = null;
 		try {
 			if (device == null) return;
 			String ssrc = streamSession.createPlaySsrc();
-			String streamId = null;
 			if (rtpEnable) {
 				streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
 			}else {
@@ -366,13 +371,18 @@
 			// 娣诲姞璁㈤槄
 			JSONObject subscribeKey = new JSONObject();
 			subscribeKey.put("app", "rtp");
-			subscribeKey.put("id", streamId);
+			subscribeKey.put("stream", streamId);
+			subscribeKey.put("regist", true);
 
-			subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, subscribeKey, event);
+			subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, json->{
+				if (json.getJSONArray("tracks") == null) return;
+				event.response(json);
+				subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey);
+			});
 			//
 			StringBuffer content = new StringBuffer(200);
 			content.append("v=0\r\n");
-//			content.append("o="+channelId+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
+//			content.append("o=" + sipConfig.getSipId() + " 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
 			content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
 			content.append("s=Play\r\n");
 			content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
@@ -440,9 +450,12 @@
 
 			Request request = headerProvider.createInviteRequest(device, channelId, content.toString(), null, "FromInvt" + tm, null, ssrc, callIdHeader);
 
-			ClientTransaction transaction = transmitRequest(device, request, errorEvent);
-			streamSession.put(streamId,ssrc, transaction);
-
+			ClientTransaction transaction = transmitRequest(device, request, (e -> {
+				streamSession.remove(device.getDeviceId(), channelId);
+				errorEvent.response(e);
+			}));
+			streamSession.put(device.getDeviceId(), channelId ,ssrc,streamId, transaction);
+			
 		} catch ( SipException | ParseException | InvalidArgumentException e) {
 			e.printStackTrace();
 		}
@@ -466,9 +479,14 @@
 			// 娣诲姞璁㈤槄
 			JSONObject subscribeKey = new JSONObject();
 			subscribeKey.put("app", "rtp");
-			subscribeKey.put("id", streamId);
+			subscribeKey.put("stream", streamId);
+			subscribeKey.put("regist", true);
 
-			subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_publish, subscribeKey, event);
+			subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, json->{
+				if (json.getJSONArray("tracks") == null) return;
+				event.response(json);
+				subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey);
+			});
 
 			StringBuffer content = new StringBuffer(200);
 	        content.append("v=0\r\n");
@@ -543,7 +561,7 @@
 	        Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, "fromplybck" + tm, null, callIdHeader);
 
 	        ClientTransaction transaction = transmitRequest(device, request, errorEvent);
-	        streamSession.put(streamId, ssrc, transaction);
+	        streamSession.put(device.getDeviceId(), channelId, ssrc, streamId, transaction);
 
 		} catch ( SipException | ParseException | InvalidArgumentException e) {
 			e.printStackTrace();
@@ -557,19 +575,46 @@
 	 * 
 	 */
 	@Override
-	public void streamByeCmd(String ssrc) {
-		streamByeCmd(ssrc, null);
+	public void streamByeCmd(String deviceId, String channelId) {
+		streamByeCmd(deviceId, channelId, null);
 	}
 	@Override
-	public void streamByeCmd(String streamId, SipSubscribe.Event okEvent) {
+	public void streamByeCmd(String deviceId, String channelId, SipSubscribe.Event okEvent) {
 		
 		try {
-			ClientTransaction transaction = streamSession.get(streamId);
-			// 鏈嶅姟閲嶅惎鍚�
+			ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId);
+			// 鏈嶅姟閲嶅惎鍚�, 鏃犳硶鐩存帴鍙戦�乥ye锛� 閫氳繃鎵嬪姩鏋勫缓鍙戦��
 			if (transaction == null) {
-				StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
-				if (streamInfo != null) {
 
+				StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
+				if (streamInfo != null) {
+					JSONObject mediaList = zlmresTfulUtils.getMediaList(streamInfo.getApp(), streamInfo.getStreamId());
+					if (mediaList != null) { // 浠嶅湪鎺ㄦ祦鎵嶅彂閫�
+						if (mediaList.getInteger("code") == 0) {
+							JSONArray data = mediaList.getJSONArray("data");
+							if (data != null && data.size() > 0) {
+								Device device = storager.queryVideoDevice(deviceId);
+								if (device != null) {
+									StreamInfo.TransactionInfo transactionInfo = streamInfo.getTransactionInfo();
+									try {
+										Request byteRequest = headerProvider.createByteRequest(device, channelId,
+												transactionInfo.branch,
+												transactionInfo.localTag,
+												transactionInfo.remoteTag,
+												transactionInfo.callId);
+										transmitRequest(device, byteRequest);
+									} catch (InvalidArgumentException e) {
+										e.printStackTrace();
+									}
+								}
+							}
+						}
+					}
+					redisCatchStorage.stopPlay(streamInfo);
+				}
+
+				if (okEvent != null) {
+					okEvent.response(null);
 				}
 				return;
 			}
@@ -604,14 +649,9 @@
 			}
 
 			dialog.sendRequest(clientTransaction);
-
-			streamSession.remove(streamId);
-			zlmrtpServerFactory.closeRTPServer(streamId);
-		} catch (TransactionDoesNotExistException e) {
-			e.printStackTrace();
-		} catch (SipException e) {
-			e.printStackTrace();
-		} catch (ParseException e) {
+			zlmrtpServerFactory.closeRTPServer(streamSession.getStreamId(deviceId, channelId));
+			streamSession.remove(deviceId, channelId);
+		} catch (SipException | ParseException e) {
 			e.printStackTrace();
 		}
 	}
@@ -632,7 +672,6 @@
 	 * 璇煶骞挎挱
 	 * 
 	 * @param device  瑙嗛璁惧
-	 * @param channelId  棰勮閫氶亾
 	 */
 	@Override
 	public boolean audioBroadcastCmd(Device device) {
@@ -1131,7 +1170,7 @@
 	 * @param device		瑙嗛璁惧
 	 * @param startPriority	鎶ヨ璧峰绾у埆锛堝彲閫夛級
 	 * @param endPriority	鎶ヨ缁堟绾у埆锛堝彲閫夛級
-	 * @param alarmMethods	鎶ヨ鏂瑰紡鏉′欢锛堝彲閫夛級
+	 * @param alarmMethod	鎶ヨ鏂瑰紡鏉′欢锛堝彲閫夛級
 	 * @param alarmType		鎶ヨ绫诲瀷
 	 * @param startTime		鎶ヨ鍙戠敓璧峰鏃堕棿锛堝彲閫夛級
 	 * @param endTime		鎶ヨ鍙戠敓缁堟鏃堕棿锛堝彲閫夛級
@@ -1419,5 +1458,6 @@
 			String streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
 			zlmrtpServerFactory.closeRTPServer(streamId);
 		}
+		streamSession.remove(device.getDeviceId(), channelId);
 	}
 }

--
Gitblit v1.8.0