From 155838ce2eca9dbdde3ca0b2a5d4e72ab603e54d Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期四, 22 六月 2023 22:35:35 +0800
Subject: [PATCH] 优化子码流切换逻辑,去除主子多开逻辑。优化单端口模式ssrc变化导致的无法移出点播缓存 #895

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java |    1 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java                               |   13 
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java                                        |    4 
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java                                         |  359 +++++++------------------
 src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java                                                    |   21 -
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java                                            |    5 
 src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java                                                    |   12 
 src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java                                         |    1 
 src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java                                      |    2 
 src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java                                         |   47 ---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java                       |   24 -
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java                                   |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java           |    2 
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java                                        |   64 +---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java              |   21 -
 src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java                                               |    1 
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java                                 |   27 -
 src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java                                 |  176 +-----------
 src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java                                                     |    1 
 src/main/java/com/genersoft/iot/vmp/service/IPlayService.java                                                 |    6 
 20 files changed, 165 insertions(+), 624 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java b/src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java
index 029b7ca..dabdb4f 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java
@@ -29,7 +29,7 @@
     private StreamInfo streamInfo;
 
 
-    public static InviteInfo getinviteInfo(String deviceId, String channelId, String stream, SSRCInfo ssrcInfo,
+    public static InviteInfo getInviteInfo(String deviceId, String channelId, String stream, SSRCInfo ssrcInfo,
                                            String receiveIp, Integer receivePort, String streamMode,
                                            InviteSessionType type, InviteSessionStatus status) {
         InviteInfo inviteInfo = new InviteInfo();
@@ -138,25 +138,6 @@
         this.subStream = subStream;
     }
 
-    public static InviteInfo getInviteInfo(String deviceId, String channelId,Boolean isSubStream, String stream, SSRCInfo ssrcInfo,
-                                           String receiveIp, Integer receivePort, String streamMode,
-                                           InviteSessionType type, InviteSessionStatus status) {
-        InviteInfo inviteInfo = new InviteInfo();
-        inviteInfo.setDeviceId(deviceId);
-        inviteInfo.setChannelId(channelId);
-        inviteInfo.setStream(stream);
-        inviteInfo.setSsrcInfo(ssrcInfo);
-        inviteInfo.setReceiveIp(receiveIp);
-        inviteInfo.setReceivePort(receivePort);
-        inviteInfo.setStreamMode(streamMode);
-        inviteInfo.setType(type);
-        inviteInfo.setStatus(status);
-        if(isSubStream != null){
-            inviteInfo.setSubStream(isSubStream);
-        }
-        return inviteInfo;
-    }
-    /*=========================璁惧涓诲瓙鐮佹祦閫昏緫END====================*/
 
 
 
diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
index 5bda636..cde235b 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
@@ -542,17 +542,5 @@
         this.subStream = subStream;
     }
 
-    public static String getPlayStream(String deviceId,String channelId,boolean isSubStream){
-        String streamId;
-        if(isSubStream){
-            streamId = String.format("%s_%s_%s","sub",deviceId, channelId);
-        }else {
-            streamId = String.format("%s_%s_%s","main", deviceId, channelId);
-        }
-        return streamId;
-    }
-
-    /*=========================璁惧涓诲瓙鐮佹祦閫昏緫END====================*/
-
 
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
index 95a2499..041d738 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
@@ -45,7 +45,6 @@
      * @return
      */
     public void startCron(String key, Runnable task, int cycleForCatalog) {
-        System.out.println(cycleForCatalog);
         ScheduledFuture<?> future = futureMap.get(key);
         if (future != null) {
             if (future.isCancelled()) {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
index 5677c95..8a62182 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
@@ -156,29 +156,5 @@
 		}
 	}
 
-	/*============================璁惧涓诲瓙鐮佹祦閫昏緫START========================*/
-	public static String getPlayKey(String deviceId,String channelId,boolean deviceSwitchSubStream,boolean isSubStream){
-		String key = null;
-		if(deviceSwitchSubStream){
-			key = CALLBACK_CMD_PLAY + isSubStream + deviceId + channelId;
-		}else {
-			key = CALLBACK_CMD_PLAY +deviceId + channelId;
-		}
-		return key;
-	}
-
-	public static String getSnapKey(String deviceId,String channelId,boolean deviceSwitchSubStream,boolean isSubStream){
-		String key = null;
-		if(deviceSwitchSubStream){
-			key = CALLBACK_CMD_SNAP + isSubStream + deviceId + channelId;
-		}else {
-			key = CALLBACK_CMD_SNAP +deviceId + channelId;
-		}
-		return key;
-	}
-
-
-	/*============================璁惧涓诲瓙鐮佹祦閫昏緫END========================*/
-
 
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
index 344e16f..d684056 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
@@ -98,7 +98,7 @@
 	 * @param device  瑙嗛璁惧
 	 * @param channelId  棰勮閫氶亾
 	 */
-	void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
+	void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException;
 
 	/**
 	 * 璇锋眰鍥炴斁瑙嗛娴�
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 7faf428..db89592 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
@@ -268,7 +268,7 @@
      * @param errorEvent sip閿欒璁㈤槄
      */
     @Override
-    public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream,
+    public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
                               ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
         String stream = ssrcInfo.getStream();
 
@@ -345,13 +345,13 @@
 
         if( device.isSwitchPrimarySubStream() ){
             if("TP-LINK".equals(device.getManufacturer())){
-                if (isSubStream){
+                if (device.isSwitchPrimarySubStream()){
                     content.append("a=streamMode:sub\r\n");
                 }else {
                     content.append("a=streamMode:main\r\n");
                 }
             }else {
-                if (isSubStream){
+                if (device.isSwitchPrimarySubStream()){
                     content.append("a=streamprofile:1\r\n");
                 }else {
                     content.append("a=streamprofile:0\r\n");
@@ -374,11 +374,8 @@
             // 杩欓噷涓轰緥閬垮厤涓�涓�氶亾鐨勭偣鎾彧鏈変竴涓猚allID杩欎釜鍙傛暟浣跨敤涓�涓浐瀹氬��
             ResponseEvent responseEvent = (ResponseEvent) e.event;
             SIPResponse response = (SIPResponse) responseEvent.getResponse();
-            if(device.isSwitchPrimarySubStream()){
-                streamSession.put(device.getDeviceId(), channelId, "switch-play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, InviteSessionType.PLAY);
-            }else {
-                streamSession.put(device.getDeviceId(), channelId, "play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, InviteSessionType.PLAY);
-            }
+            streamSession.put(device.getDeviceId(), channelId, "play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response,
+                    InviteSessionType.PLAY);
             okEvent.response(e);
         });
     }
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
index 43e1ef8..eea0cb4 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
@@ -142,13 +142,8 @@
 			// 鍙兘鏄澶囦富鍔ㄥ仠姝�
 			Device device = storager.queryVideoDeviceByChannelId(platformGbId);
 			if (device != null) {
-				SsrcTransaction ssrcTransactionForPlay = null;
-				if (device.isSwitchPrimarySubStream() ) {
-					ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId,  "switch-play", null);
-				} else {
-					storager.stopPlay(device.getDeviceId(), channelId);
-					ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null);
-				}
+				storager.stopPlay(device.getDeviceId(), channelId);
+				SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null);
 				if (ssrcTransactionForPlay != null){
 					if (ssrcTransactionForPlay.getCallId().equals(callIdHeader.getCallId())){
 						// 閲婃斁ssrc
@@ -158,16 +153,8 @@
 						}
 						streamSession.remove(device.getDeviceId(), channelId, ssrcTransactionForPlay.getStream());
 					}
-					InviteInfo inviteInfo = null;
-					if (device.isSwitchPrimarySubStream() ) {
-						String streamType = ssrcTransactionForPlay.getStream().split("_")[0];
-						boolean isSubStream = "sub".equals(streamType);
-						inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream);
-						inviteStreamService.removeInviteInfo(inviteInfo.getType(),inviteInfo.getDeviceId(),inviteInfo.getChannelId(),isSubStream,inviteInfo.getStream());
-					}else {
-						inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
-						inviteStreamService.removeInviteInfo(inviteInfo);
-					}
+					InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
+					inviteStreamService.removeInviteInfo(inviteInfo);
 					if (inviteInfo != null) {
 						if (inviteInfo.getStreamInfo() != null) {
 							mediaServerService.closeRTPServer(inviteInfo.getStreamInfo().getMediaServerId(), inviteInfo.getStream());
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 aaf5684..7466fa4 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
@@ -490,7 +490,7 @@
                         }
                         sendRtpItem.setStreamId(streamId);
                         redisCatchStorage.updateSendRTPSever(sendRtpItem);
-                        playService.play(mediaServerItem, device.getDeviceId(), channelId,false, ((code, msg, data) -> {
+                        playService.play(mediaServerItem, device.getDeviceId(), channelId, ((code, msg, data) -> {
                             if (code == InviteErrorCode.SUCCESS.getCode()){
                                 hookEvent.run(code, msg, data);
                             }else if (code == InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode() || code == InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode()){
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
index e2aee4a..907cd66 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
@@ -252,7 +252,6 @@
 	}
 
 	private void executeSave(){
-		System.out.println("瀹氭椂瀛樺偍鏁版嵁");
 		executeSaveForUpdate();
 		executeSaveForDelete();
 		executeSaveForOnline();
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
index 2cfe16e..0fc056c 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
@@ -250,7 +250,6 @@
         if (ObjectUtils.isEmpty(timeStr)){
             return null;
         }
-        System.out.println(timeStr);
         LocalDateTime localDateTime;
         try {
             localDateTime = LocalDateTime.parse(timeStr);
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 7f27b89..562180c 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
@@ -343,19 +343,10 @@
                 }
 
                 if ("rtp".equals(param.getApp()) && !param.isRegist()) {
-                    if(param.getStream().split("_").length == 3){
-                        boolean isSubStream = "sub".equals(param.getStream().split("_")[0]);
-                        InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, param.getStream(), isSubStream);
-                        if(inviteInfo != null && (inviteInfo.getType() == InviteSessionType.PLAY )){
-                            inviteStreamService.removeInviteInfo(inviteInfo.getType(),inviteInfo.getDeviceId(),
-                                    inviteInfo.getChannelId(),inviteInfo.isSubStream(),inviteInfo.getStream());
-                        }
-                    }else {
-                        InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, param.getStream());
-                        if (inviteInfo != null && (inviteInfo.getType() == InviteSessionType.PLAY || inviteInfo.getType() == InviteSessionType.PLAYBACK)) {
-                            inviteStreamService.removeInviteInfo(inviteInfo);
-                            storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId());
-                        }
+                    InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, param.getStream());
+                    if (inviteInfo != null && (inviteInfo.getType() == InviteSessionType.PLAY || inviteInfo.getType() == InviteSessionType.PLAYBACK)) {
+                        inviteStreamService.removeInviteInfo(inviteInfo);
+                        storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId());
                     }
                 } else {
                     if (!"rtp".equals(param.getApp())) {
@@ -483,15 +474,8 @@
                 Device device = deviceService.getDevice(inviteInfo.getDeviceId());
                 if (device != null) {
                     try {
-                        InviteInfo info = null;
-                        if(device.isSwitchPrimarySubStream()){
-                            boolean isSubStream = "sub".equals(param.getStream().split("_")[0]);
-                            info = inviteStreamService.getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), inviteInfo.getChannelId(),isSubStream, inviteInfo.getStream());
-                        }else {
-                            info = inviteStreamService.getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream());
-
-                        }
-
+                        InviteInfo info = inviteStreamService.getInviteInfo(inviteInfo.getType(),
+                                inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream());
                         if (info != null) {
                             cmder.streamByeCmd(device, inviteInfo.getChannelId(),
                                     inviteInfo.getStream(), null);
@@ -502,15 +486,9 @@
                     }
                 }
 
-                if(device.isSwitchPrimarySubStream()){
-                    boolean isSubStream = "sub".equals(param.getStream().split("_")[0]);
-                    inviteStreamService.removeInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(),
-                            inviteInfo.getChannelId(),isSubStream, inviteInfo.getStream());
-                }else {
-                    inviteStreamService.removeInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(),
-                            inviteInfo.getChannelId(), inviteInfo.getStream());
-                    storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId());
-                }
+                inviteStreamService.removeInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(),
+                        inviteInfo.getChannelId(), inviteInfo.getStream());
+                storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId());
                 return ret;
             }
         } else {
@@ -563,26 +541,12 @@
 
         if ("rtp".equals(param.getApp())) {
             String[] s = param.getStream().split("_");
-            if (!mediaInfo.isRtpEnable() ) {
-                defaultResult.setResult(HookResult.SUCCESS());
-                return defaultResult;
-            }else if(s.length != 2 && s.length != 3 ){
+            if (!mediaInfo.isRtpEnable() || s.length != 2) {
                 defaultResult.setResult(HookResult.SUCCESS());
                 return defaultResult;
             }
-            String deviceId = null;
-            String channelId = null;
-            boolean isSubStream = false;
-            if (s[0].length() < 20) {
-                if ("sub".equals(s[0])) {
-                    isSubStream = true;
-                }
-                deviceId = s[1];
-                channelId = s[2];
-            } else {
-                deviceId = s[0];
-                channelId = s[1];
-            }
+            String deviceId = s[0];
+            String channelId = s[1];
             Device device = redisCatchStorage.getDevice(deviceId);
             if (device == null) {
                 defaultResult.setResult(new HookResult(ErrorCode.ERROR404.getCode(), ErrorCode.ERROR404.getMsg()));
@@ -596,7 +560,7 @@
             logger.info("[ZLM HOOK] 娴佹湭鎵惧埌, 鍙戣捣鑷姩鐐规挱锛歿}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream());
 
             RequestMessage msg = new RequestMessage();
-            String key = DeferredResultHolder.getPlayKey(deviceId, channelId, device.isSwitchPrimarySubStream(), isSubStream);
+            String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId;
             boolean exist = resultHolder.exist(key, null);
             msg.setKey(key);
             String uuid = UUID.randomUUID().toString();
@@ -614,7 +578,7 @@
             resultHolder.put(key, uuid, result);
 
             if (!exist) {
-                playService.play(mediaInfo, deviceId, channelId,isSubStream, (code, message, data) -> {
+                playService.play(mediaInfo, deviceId, channelId, (code, message, data) -> {
                     msg.setData(new HookResult(code, message));
                     resultHolder.invokeResult(msg);
                 });
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
index a350469..2378d52 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
@@ -270,11 +270,6 @@
     }
 
     public JSONObject openRtpServer(MediaServerItem mediaServerItem, Map<String, Object> param){
-        System.out.println("==============openRtpServer=================");
-        for (String s : param.keySet()) {
-            System.out.println(s + "-->" + param.get(s));
-        }
-        System.out.println("===============================");
         return sendPost(mediaServerItem, "openRtpServer",param, null);
     }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
index 1363168..eb7d1a0 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -227,7 +227,6 @@
         int localPort = 0;
         if (userSetting.getGbSendStreamStrict()) {
             if (userSetting.getGbSendStreamStrict()) {
-                System.out.println("createSendRtpItem1");
                 localPort = keepPort(serverItem, ssrc, localPort);
                 if (localPort == 0) {
                     return null;
@@ -264,7 +263,6 @@
         // 榛樿涓洪殢鏈虹鍙�
         int localPort = 0;
         if (userSetting.getGbSendStreamStrict()) {
-            System.out.println("createSendRtpItem2");
             localPort = keepPort(serverItem, ssrc, localPort);
             if (localPort == 0) {
                 return null;
@@ -294,9 +292,7 @@
         param.put("port", localPort);
         param.put("enable_tcp", 1);
         param.put("stream_id", ssrc);
-        System.out.println("鐢ㄤ簬鏀舵祦");
         JSONObject jsonObject = zlmresTfulUtils.openRtpServer(serverItem, param);
-        System.out.println(jsonObject);
         if (jsonObject.getInteger("code") == 0) {
             localPort = jsonObject.getInteger("port");
             HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(ssrc, null, serverItem.getId());
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java b/src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java
index 1036efd..ae30f26 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java
@@ -4,8 +4,6 @@
 import com.genersoft.iot.vmp.common.InviteSessionType;
 import com.genersoft.iot.vmp.service.bean.ErrorCallback;
 
-import java.util.List;
-
 /**
  * 璁板綍鍥芥爣鐐规挱鐨勭姸鎬侊紝鍖呮嫭瀹炴椂棰勮锛屼笅杞斤紝褰曞儚鍥炴斁
  */
@@ -15,6 +13,8 @@
      * 鏇存柊鐐规挱鐨勭姸鎬佷俊鎭�
      */
     void updateInviteInfo(InviteInfo inviteInfo);
+
+    InviteInfo updateInviteInfoForStream(InviteInfo inviteInfo, String stream);
 
     /**
      * 鑾峰彇鐐规挱鐨勭姸鎬佷俊鎭�
@@ -72,49 +72,6 @@
      * 缁熻鍚屼竴涓獄lm涓嬬殑鍥芥爣鏀舵祦涓暟
      */
     int getStreamInfoCount(String mediaServerId);
-
-
-    /*======================璁惧涓诲瓙鐮佹祦閫昏緫START=========================*/
-    /**
-     * 鑾峰彇鐐规挱鐨勭姸鎬佷俊鎭�
-     */
-    InviteInfo getInviteInfoByDeviceAndChannel(InviteSessionType type,
-                                               String deviceId,
-                                               String channelId,boolean isSubStream);
-
-    void removeInviteInfoByDeviceAndChannel(InviteSessionType inviteSessionType, String deviceId, String channelId,boolean isSubStream);
-
-    InviteInfo getInviteInfo(InviteSessionType type,
-                             String deviceId,
-                             String channelId,
-                             boolean isSubStream,
-                             String stream);
-
-    void removeInviteInfo(InviteSessionType type,
-                          String deviceId,
-                          String channelId,
-                          boolean isSubStream,
-                          String stream);
-
-    void once(InviteSessionType type, String deviceId, String channelId,boolean isSubStream, String stream,  ErrorCallback<Object> callback);
-
-    void call(InviteSessionType type, String deviceId, String channelId,boolean isSubStream, String stream,  int code, String msg, Object data);
-
-    void updateInviteInfoSub(InviteInfo inviteInfo);
-
-    /**
-     * 鑾峰彇鐐规挱鐨勭姸鎬佷俊鎭�
-     */
-    InviteInfo getInviteInfoByStream(InviteSessionType type, String stream,boolean isSubStream);
-
-    /**
-     * 鑾峰彇鐐规挱鐨勭姸鎬佷俊鎭�
-     */
-    List<Object> getInviteInfos(InviteSessionType type,
-                                String deviceId,
-                                String channelId,
-                                String stream);
-    /*======================璁惧涓诲瓙鐮佹祦閫昏緫END=========================*/
 
 
 
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java b/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
index 988326e..5162411 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
@@ -16,9 +16,9 @@
  */
 public interface IPlayService {
 
-    void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream,
+    void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
               ErrorCallback<Object> callback);
-    SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId,boolean isSubStream, ErrorCallback<Object> callback);
+    SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, ErrorCallback<Object> callback);
 
     MediaServerItem getNewMediaServerItem(Device device);
 
@@ -43,5 +43,5 @@
 
     void resumeRtp(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException;
 
-    void getSnap(String deviceId, String channelId, String fileName,boolean isSubStream, ErrorCallback errorCallback);
+    void getSnap(String deviceId, String channelId, String fileName, ErrorCallback errorCallback);
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java
index ed73dd1..f412816 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java
@@ -85,6 +85,24 @@
     }
 
     @Override
+    public InviteInfo updateInviteInfoForStream(InviteInfo inviteInfo, String stream) {
+
+        InviteInfo inviteInfoInDb = getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream());
+        if (inviteInfoInDb == null) {
+            return null;
+        }
+        removeInviteInfo(inviteInfoInDb);
+        String key = VideoManagerConstants.INVITE_PREFIX +
+                "_" + inviteInfo.getType() +
+                "_" + inviteInfo.getDeviceId() +
+                "_" + inviteInfo.getChannelId() +
+                "_" + stream;
+        inviteInfoInDb.setStream(stream);
+        redisTemplate.opsForValue().set(key, inviteInfoInDb);
+        return inviteInfoInDb;
+    }
+
+    @Override
     public InviteInfo getInviteInfo(InviteSessionType type, String deviceId, String channelId, String stream) {
         String key = VideoManagerConstants.INVITE_PREFIX +
                 "_" + (type != null ? type : "*") +
@@ -152,19 +170,6 @@
 
     }
 
-    @Override
-    public void call(InviteSessionType type, String deviceId, String channelId, String stream, int code, String msg, Object data) {
-        String key = buildKey(type, deviceId, channelId, stream);
-        List<ErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key);
-        if (callbacks == null) {
-            return;
-        }
-        for (ErrorCallback<Object> callback : callbacks) {
-            callback.run(code, msg, data);
-        }
-        inviteErrorCallbackMap.remove(key);
-    }
-
     private String buildKey(InviteSessionType type, String deviceId, String channelId, String stream) {
         String key = type + "_" +  deviceId + "_" + channelId;
         // 濡傛灉ssrc鏈猲ull閭d箞鍙互瀹炵幇涓�涓�氶亾鍙兘涓�娆℃搷浣滐紝ssrc涓嶄负null鍒欏彲浠ユ敮鎸佷竴涓�氶亾澶氭invite
@@ -199,69 +204,9 @@
         return count;
     }
 
-    /*======================璁惧涓诲瓙鐮佹祦閫昏緫START=========================*/
-
     @Override
-    public InviteInfo getInviteInfoByDeviceAndChannel(InviteSessionType type, String deviceId, String channelId, boolean isSubStream) {
-        return getInviteInfo(type, deviceId, channelId,isSubStream, null);
-    }
-
-    @Override
-    public void removeInviteInfoByDeviceAndChannel(InviteSessionType inviteSessionType, String deviceId, String channelId, boolean isSubStream) {
-        removeInviteInfo(inviteSessionType, deviceId, channelId,isSubStream, null);
-    }
-
-    @Override
-    public InviteInfo getInviteInfo(InviteSessionType type, String deviceId, String channelId,boolean isSubStream, String stream) {
-        String key = VideoManagerConstants.INVITE_PREFIX +
-                "_" + (type != null ? type : "*") +
-                "_" + (isSubStream ? "sub" : "main") +
-                "_" + (deviceId != null ? deviceId : "*") +
-                "_" + (channelId != null ? channelId : "*") +
-                "_" + (stream != null ? stream : "*");
-        List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
-        if (scanResult.size() != 1) {
-            return null;
-        }
-        return (InviteInfo) redisTemplate.opsForValue().get(scanResult.get(0));
-    }
-
-    @Override
-    public void removeInviteInfo(InviteSessionType type, String deviceId, String channelId, boolean isSubStream, String stream) {
-        String scanKey = VideoManagerConstants.INVITE_PREFIX +
-                "_" + (type != null ? type : "*") +
-                "_" + (isSubStream ? "sub" : "main") +
-                "_" + (deviceId != null ? deviceId : "*") +
-                "_" + (channelId != null ? channelId : "*") +
-                "_" + (stream != null ? stream : "*");
-        List<Object> scanResult = RedisUtil.scan(redisTemplate, scanKey);
-        if (scanResult.size() > 0) {
-            for (Object keyObj : scanResult) {
-                String key = (String) keyObj;
-                InviteInfo inviteInfo = (InviteInfo) redisTemplate.opsForValue().get(key);
-                if (inviteInfo == null) {
-                    continue;
-                }
-                redisTemplate.delete(key);
-                inviteErrorCallbackMap.remove(buildKey(type, deviceId, channelId, inviteInfo.getStream()));
-            }
-        }
-    }
-
-    @Override
-    public void once(InviteSessionType type, String deviceId, String channelId, boolean isSubStream, String stream, ErrorCallback<Object> callback) {
-        String key = buildSubStreamKey(type, deviceId, channelId,isSubStream, stream);
-        List<ErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key);
-        if (callbacks == null) {
-            callbacks = new CopyOnWriteArrayList<>();
-            inviteErrorCallbackMap.put(key, callbacks);
-        }
-        callbacks.add(callback);
-    }
-
-    @Override
-    public void call(InviteSessionType type, String deviceId, String channelId, boolean isSubStream, String stream, int code, String msg, Object data) {
-        String key = buildSubStreamKey(type, deviceId, channelId,isSubStream, stream);
+    public void call(InviteSessionType type, String deviceId, String channelId, String stream, int code, String msg, Object data) {
+        String key = buildSubStreamKey(type, deviceId, channelId, stream);
         List<ErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key);
         if (callbacks == null) {
             return;
@@ -273,89 +218,12 @@
     }
 
 
-    private String buildSubStreamKey(InviteSessionType type, String deviceId, String channelId, boolean isSubStream, String stream) {
-        String key = type + "_" + (isSubStream ? "sub":"main") + "_" +  deviceId + "_" + channelId;
+    private String buildSubStreamKey(InviteSessionType type, String deviceId, String channelId, String stream) {
+        String key = type + "_" + "_" +  deviceId + "_" + channelId;
         // 濡傛灉ssrc涓簄ull閭d箞鍙互瀹炵幇涓�涓�氶亾鍙兘涓�娆℃搷浣滐紝ssrc涓嶄负null鍒欏彲浠ユ敮鎸佷竴涓�氶亾澶氭invite
         if (stream != null) {
             key += ("_" + stream);
         }
         return key;
     }
-    @Override
-    public void updateInviteInfoSub(InviteInfo inviteInfo) {
-        if (inviteInfo == null || (inviteInfo.getDeviceId() == null || inviteInfo.getChannelId() == null)) {
-            logger.warn("[鏇存柊Invite淇℃伅]锛屽弬鏁颁笉鍏細 {}", JSON.toJSON(inviteInfo));
-            return;
-        }
-        InviteInfo inviteInfoForUpdate = null;
-
-        if (InviteSessionStatus.ready == inviteInfo.getStatus()) {
-            if (inviteInfo.getDeviceId() == null
-                    || inviteInfo.getChannelId() == null
-                    || inviteInfo.getType() == null
-                    || inviteInfo.getStream() == null
-            ) {
-                return;
-            }
-            inviteInfoForUpdate = inviteInfo;
-        } else {
-            InviteInfo inviteInfoInRedis = getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(),
-                    inviteInfo.getChannelId(),inviteInfo.isSubStream(), inviteInfo.getStream());
-            if (inviteInfoInRedis == null) {
-                logger.warn("[鏇存柊Invite淇℃伅]锛屾湭浠庣紦瀛樹腑璇诲彇鍒癐nvite淇℃伅锛� deviceId: {}, channel: {}, stream: {}",
-                        inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream());
-                return;
-            }
-            if (inviteInfo.getStreamInfo() != null) {
-                inviteInfoInRedis.setStreamInfo(inviteInfo.getStreamInfo());
-            }
-            if (inviteInfo.getSsrcInfo() != null) {
-                inviteInfoInRedis.setSsrcInfo(inviteInfo.getSsrcInfo());
-            }
-            if (inviteInfo.getStreamMode() != null) {
-                inviteInfoInRedis.setStreamMode(inviteInfo.getStreamMode());
-            }
-            if (inviteInfo.getReceiveIp() != null) {
-                inviteInfoInRedis.setReceiveIp(inviteInfo.getReceiveIp());
-            }
-            if (inviteInfo.getReceivePort() != null) {
-                inviteInfoInRedis.setReceivePort(inviteInfo.getReceivePort());
-            }
-            if (inviteInfo.getStatus() != null) {
-                inviteInfoInRedis.setStatus(inviteInfo.getStatus());
-            }
-
-            inviteInfoForUpdate = inviteInfoInRedis;
-
-        }
-        String key = VideoManagerConstants.INVITE_PREFIX +
-                "_" + inviteInfoForUpdate.getType() +
-                "_" + (inviteInfoForUpdate.isSubStream() ? "sub":"main") +
-                "_" + inviteInfoForUpdate.getDeviceId() +
-                "_" + inviteInfoForUpdate.getChannelId() +
-                "_" + inviteInfoForUpdate.getStream();
-        redisTemplate.opsForValue().set(key, inviteInfoForUpdate);
-    }
-
-    @Override
-    public InviteInfo getInviteInfoByStream(InviteSessionType type, String stream, boolean isSubStream) {
-        return getInviteInfo(type, null, null,isSubStream, stream);
-    }
-
-    @Override
-    public List<Object> getInviteInfos(InviteSessionType type, String deviceId, String channelId, String stream) {
-        String key = VideoManagerConstants.INVITE_PREFIX +
-                "_" + (type != null ? type : "*") +
-                "_" + (deviceId != null ? deviceId : "*") +
-                "_" + (channelId != null ? channelId : "*") +
-                "_" + (stream != null ? stream : "*");
-        List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
-        return scanResult;
-    }
-
-    /*======================璁惧涓诲瓙鐮佹祦閫昏緫END=========================*/
-
-
-
-
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index e52fac2..bdbae62 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -116,43 +116,27 @@
 
 
     @Override
-    public SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId,boolean isSubStream, ErrorCallback<Object> callback) {
+    public SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, ErrorCallback<Object> callback) {
         if (mediaServerItem == null) {
             throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏈壘鍒板彲鐢ㄧ殑zlm");
         }
 
         Device device = redisCatchStorage.getDevice(deviceId);
-        InviteInfo inviteInfo;
-        if(device.isSwitchPrimarySubStream()){
-            inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream);
-        }else {
-            inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
-        }
+        InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
         if (inviteInfo != null ) {
             if (inviteInfo.getStreamInfo() == null) {
                 // 鐐规挱鍙戣捣浜嗕絾鏄皻鏈垚鍔�, 浠呮敞鍐屽洖璋冪瓑寰呯粨鏋滃嵆鍙�
-                if(device.isSwitchPrimarySubStream()){
-                    inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId,isSubStream, null, callback);
-                }else {
-                    inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId, null, callback);
-                }
+                inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId, null, callback);
                 return inviteInfo.getSsrcInfo();
             }else {
                 StreamInfo streamInfo = inviteInfo.getStreamInfo();
                 String streamId = streamInfo.getStream();
                 if (streamId == null) {
                     callback.run(InviteErrorCode.ERROR_FOR_CATCH_DATA.getCode(), "鐐规挱澶辫触锛� redis缂撳瓨streamId绛変簬null", null);
-                    if(device.isSwitchPrimarySubStream()){
-                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                                InviteErrorCode.ERROR_FOR_CATCH_DATA.getCode(),
-                                "鐐规挱澶辫触锛� redis缂撳瓨streamId绛変簬null",
-                                null);
-                    }else {
-                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                                InviteErrorCode.ERROR_FOR_CATCH_DATA.getCode(),
-                                "鐐规挱澶辫触锛� redis缂撳瓨streamId绛変簬null",
-                                null);
-                    }
+                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                            InviteErrorCode.ERROR_FOR_CATCH_DATA.getCode(),
+                            "鐐规挱澶辫触锛� redis缂撳瓨streamId绛変簬null",
+                            null);
                     return inviteInfo.getSsrcInfo();
                 }
                 String mediaServerId = streamInfo.getMediaServerId();
@@ -161,64 +145,38 @@
                 Boolean ready = zlmrtpServerFactory.isStreamReady(mediaInfo, "rtp", streamId);
                 if (ready != null && ready) {
                     callback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo);
-                    if(device.isSwitchPrimarySubStream()){
-                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                                InviteErrorCode.SUCCESS.getCode(),
-                                InviteErrorCode.SUCCESS.getMsg(),
-                                streamInfo);
-                    }else {
-                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                                InviteErrorCode.SUCCESS.getCode(),
-                                InviteErrorCode.SUCCESS.getMsg(),
-                                streamInfo);
-                    }
+                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                            InviteErrorCode.SUCCESS.getCode(),
+                            InviteErrorCode.SUCCESS.getMsg(),
+                            streamInfo);
                     return inviteInfo.getSsrcInfo();
                 }else {
                     // 鐐规挱鍙戣捣浜嗕絾鏄皻鏈垚鍔�, 浠呮敞鍐屽洖璋冪瓑寰呯粨鏋滃嵆鍙�
-                    if(device.isSwitchPrimarySubStream()) {
-                        inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId, null, callback);
-                        storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
-                        inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
-                    }else {
-                        inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId,isSubStream, null, callback);
-                        inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream);
-                    }
+                    inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId, null, callback);
+                    storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
+                    inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
                 }
             }
         }
 
-        String streamId = null;
-        if (mediaServerItem.isRtpEnable()) {
-            if(device.isSwitchPrimarySubStream()){
-                streamId = StreamInfo.getPlayStream(deviceId, channelId, isSubStream);
-            }else {
-                streamId = String.format("%s_%s", device.getDeviceId(), channelId);
-            }
-        }
+        String streamId = String.format("%s_%s", device.getDeviceId(), channelId);
         SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, device.isSsrcCheck(),  false, 0, false, device.getStreamModeForParam());
         if (ssrcInfo == null) {
             callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(), null);
-            if(device.isSwitchPrimarySubStream()){
-                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                        InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(),
-                        InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(),
-                        null);
-            }else {
-                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                        InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(),
-                        InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(),
-                        null);
-            }
+            inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                    InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(),
+                    InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(),
+                    null);
             return null;
         }
         // TODO 璁板綍鐐规挱鐨勭姸鎬�
-        play(mediaServerItem, ssrcInfo, device, channelId,isSubStream, callback);
+        play(mediaServerItem, ssrcInfo, device, channelId, callback);
         return ssrcInfo;
     }
 
 
     @Override
-    public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream,
+    public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
                      ErrorCallback<Object> callback) {
 
         if (mediaServerItem == null || ssrcInfo == null) {
@@ -227,11 +185,9 @@
                     null);
             return;
         }
-        if( device.isSwitchPrimarySubStream() ){
-            logger.info("[鐐规挱寮�濮媇 deviceId: {}, channelId: {},鐮佹祦绫诲瀷锛歿},鏀舵祦绔彛锛� {}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId,isSubStream ? "杈呯爜娴�" : "涓荤爜娴�", ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
-        }else {
-            logger.info("[鐐规挱寮�濮媇 deviceId: {}, channelId: {},鏀舵祦绔彛锛� {}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
-        }
+        logger.info("[鐐规挱寮�濮媇 deviceId: {}, channelId: {},鐮佹祦绫诲瀷锛歿},鏀舵祦绔彛锛� {}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}",
+                device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "杈呯爜娴�" : "涓荤爜娴�", ssrcInfo.getPort(),
+                device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
         //绔彛鑾峰彇澶辫触鐨剆srcInfo 娌℃湁蹇呰鍙戦�佺偣鎾寚浠�
         if (ssrcInfo.getPort() <= 0) {
             logger.info("[鐐规挱绔彛鍒嗛厤寮傚父]锛宒eviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo);
@@ -240,50 +196,27 @@
             streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
 
             callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "鐐规挱绔彛鍒嗛厤寮傚父", null);
-            if(device.isSwitchPrimarySubStream()){
-                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                        InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "鐐规挱绔彛鍒嗛厤寮傚父", null);
-            }else {
-                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                        InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "鐐规挱绔彛鍒嗛厤寮傚父", null);
-            }
+            inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                    InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "鐐规挱绔彛鍒嗛厤寮傚父", null);
             return;
         }
 
         // 鍒濆鍖杛edis涓殑invite娑堟伅鐘舵��
-        InviteInfo inviteInfo;
-
-        if(device.isSwitchPrimarySubStream()){
-            // 鍒濆鍖杛edis涓殑invite娑堟伅鐘舵��
-            inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId,isSubStream, ssrcInfo.getStream(), ssrcInfo,
-                    mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY,
-                    InviteSessionStatus.ready);
-            inviteStreamService.updateInviteInfoSub(inviteInfo);
-        }else {
-            // 鍒濆鍖杛edis涓殑invite娑堟伅鐘舵��
-            inviteInfo = InviteInfo.getinviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo,
-                    mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY,
-                    InviteSessionStatus.ready);
-            inviteStreamService.updateInviteInfo(inviteInfo);
-        }
+        InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo,
+                mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY,
+                InviteSessionStatus.ready);
+        inviteInfo.setSubStream(device.isSwitchPrimarySubStream());
+        inviteStreamService.updateInviteInfo(inviteInfo);
         // 瓒呮椂澶勭悊
         String timeOutTaskKey = UUID.randomUUID().toString();
         dynamicTask.startDelay(timeOutTaskKey, () -> {
             // 鎵ц瓒呮椂浠诲姟鏃舵煡璇㈡槸鍚﹀凡缁忔垚鍔燂紝鎴愬姛浜嗗垯涓嶆墽琛岃秴鏃朵换鍔★紝闃叉瓒呮椂浠诲姟鍙栨秷澶辫触鐨勬儏鍐�
-            InviteInfo inviteInfoForTimeOut;
-            if(device.isSwitchPrimarySubStream()){
-                // 鍒濆鍖杛edis涓殑invite娑堟伅鐘舵��
-                inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream);
-            }else {
-                // 鍒濆鍖杛edis涓殑invite娑堟伅鐘舵��
-                inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
-            }
+            InviteInfo inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
             if (inviteInfoForTimeOut == null || inviteInfoForTimeOut.getStreamInfo() == null) {
-                if( device.isSwitchPrimarySubStream()){
-                    logger.info("[鐐规挱瓒呮椂] 鏀舵祦瓒呮椂 deviceId: {}, channelId: {},鐮佹祦绫诲瀷锛歿}锛岀鍙o細{}, SSRC: {}", device.getDeviceId(), channelId,isSubStream ? "杈呯爜娴�" : "涓荤爜娴�", ssrcInfo.getPort(), ssrcInfo.getSsrc());
-                }else {
-                    logger.info("[鐐规挱瓒呮椂] 鏀舵祦瓒呮椂 deviceId: {}, channelId: {}锛岀鍙o細{}, SSRC: {}", device.getDeviceId(), channelId, ssrcInfo.getPort(), ssrcInfo.getSsrc());
-                }
+                logger.info("[鐐规挱瓒呮椂] 鏀舵祦瓒呮椂 deviceId: {}, channelId: {},鐮佹祦绫诲瀷锛歿}锛岀鍙o細{}, SSRC: {}",
+                        device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "杈呯爜娴�" : "涓荤爜娴�",
+                        ssrcInfo.getPort(), ssrcInfo.getSsrc());
+
                 // 鐐规挱瓒呮椂鍥炲BYE 鍚屾椂閲婃斁ssrc浠ュ強姝ゆ鐐规挱鐨勮祫婧�
 //                InviteInfo inviteInfoForTimeout = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.play, device.getDeviceId(), channelId);
 //                if (inviteInfoForTimeout == null) {
@@ -295,16 +228,10 @@
 //                    // TODO 鍙戦�乧ancel
 //                }
                 callback.run(InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);
-                if( device.isSwitchPrimarySubStream()){
-                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                            InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);
-                    inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream);
+                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                        InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);
+                inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
 
-                }else {
-                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                            InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);
-                    inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
-                }
                 try {
                     cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null);
                 } catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) {
@@ -322,42 +249,26 @@
         }, userSetting.getPlayTimeout());
 
         try {
-            cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId,isSubStream, (mediaServerItemInuse, hookParam ) -> {
+            cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInuse, hookParam ) -> {
                 logger.info("鏀跺埌璁㈤槄娑堟伅锛� " + hookParam);
                 dynamicTask.stop(timeOutTaskKey);
                 // hook鍝嶅簲
-                StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channelId,isSubStream);
+                StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channelId);
                 if (streamInfo == null){
                     callback.run(InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
                             InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
-                    if( device.isSwitchPrimarySubStream()){
-                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                                InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
-                                InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
-                    }else {
-                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                                InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
-                                InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
-                    }
+                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                            InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
+                            InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
                     return;
                 }
                 callback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo);
-                if( device.isSwitchPrimarySubStream()){
-                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                            InviteErrorCode.SUCCESS.getCode(),
-                            InviteErrorCode.SUCCESS.getMsg(),
-                            streamInfo);
-                }else {
-                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                            InviteErrorCode.SUCCESS.getCode(),
-                            InviteErrorCode.SUCCESS.getMsg(),
-                            streamInfo);
-                }
-                if( device.isSwitchPrimarySubStream() ){
-                    logger.info("[鐐规挱鎴愬姛] deviceId: {}, channelId: {},鐮佹祦绫诲瀷锛歿}", device.getDeviceId(), channelId,isSubStream ? "杈呯爜娴�" : "涓荤爜娴�");
-                }else {
-                    logger.info("[鐐规挱鎴愬姛] deviceId: {}, channelId: {}", device.getDeviceId(), channelId);
-                }
+                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                        InviteErrorCode.SUCCESS.getCode(),
+                        InviteErrorCode.SUCCESS.getMsg(),
+                        streamInfo);
+                logger.info("[鐐规挱鎴愬姛] deviceId: {}, channelId: {},鐮佹祦绫诲瀷锛歿}", device.getDeviceId(),
+                        device.isSwitchPrimarySubStream() ? "杈呯爜娴�" : "涓荤爜娴�");
                 String streamUrl;
                 if (mediaServerItemInuse.getRtspPort() != 0) {
                     streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServerItemInuse.getRtspPort(), "rtp",  ssrcInfo.getStream());
@@ -413,15 +324,9 @@
 
                                 callback.run(InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(),
                                         InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null);
-                                if(device.isSwitchPrimarySubStream()){
-                                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                                            InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(),
-                                            InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null);
-                                }else {
-                                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                                            InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(),
-                                            InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null);
-                                }
+                                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                                        InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(),
+                                        InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null);
                             }
                         }
                         return;
@@ -438,39 +343,26 @@
                             subscribe.removeSubscribe(hookSubscribe);
                             String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase();
                             hookSubscribe.getContent().put("stream", stream);
-                            inviteInfo.setStream(stream);
+                            inviteStreamService.updateInviteInfoForStream(inviteInfo, stream);
                             subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> {
                                 logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + hookParam);
                                 dynamicTask.stop(timeOutTaskKey);
                                 // hook鍝嶅簲
-                                StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInUse, hookParam, device.getDeviceId(), channelId,isSubStream);
+                                StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInUse, hookParam, device.getDeviceId(), channelId);
                                 if (streamInfo == null){
                                     callback.run(InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
                                             InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
-                                    if( device.isSwitchPrimarySubStream()){
-                                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                                                InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
-                                                InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
-                                    }else {
-                                        inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                                                InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
-                                                InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
-                                    }
+                                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                                            InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(),
+                                            InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null);
                                     return;
                                 }
                                 callback.run(InviteErrorCode.SUCCESS.getCode(),
                                         InviteErrorCode.SUCCESS.getMsg(), streamInfo);
-                                if( device.isSwitchPrimarySubStream()){
-                                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                                            InviteErrorCode.SUCCESS.getCode(),
-                                            InviteErrorCode.SUCCESS.getMsg(),
-                                            streamInfo);
-                                }else {
-                                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                                            InviteErrorCode.SUCCESS.getCode(),
-                                            InviteErrorCode.SUCCESS.getMsg(),
-                                            streamInfo);
-                                }
+                                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                                        InviteErrorCode.SUCCESS.getCode(),
+                                        InviteErrorCode.SUCCESS.getMsg(),
+                                        streamInfo);
                             });
                             return;
                         }
@@ -493,17 +385,14 @@
 
                             callback.run(InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
                                     "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触", null);
-                            if( device.isSwitchPrimarySubStream()){
-                                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                                        InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
-                                        "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触", null);
-                            }else {
-                                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                                        InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
-                                        "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触", null);
-                            }
+                            inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                                    InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
+                                    "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触", null);
 
                         }else {
+                            if (ssrcInfo.getStream()!= null && !ssrcInfo.getStream().equals(inviteInfo.getStream())) {
+                                inviteStreamService.removeInviteInfo(inviteInfo);
+                            }
                             ssrcInfo.setSsrc(ssrcInResponse);
                             inviteInfo.setSsrcInfo(ssrcInfo);
                             inviteInfo.setStream(ssrcInfo.getStream());
@@ -512,11 +401,7 @@
                         logger.info("[鐐规挱娑堟伅] 鏀跺埌invite 200, 涓嬬骇鑷畾涔変簡ssrc, 浣嗘槸褰撳墠妯″紡鏃犻渶淇");
                     }
                 }
-                if(device.isSwitchPrimarySubStream()){
-                    inviteStreamService.updateInviteInfoSub(inviteInfo);
-                }else {
-                    inviteStreamService.updateInviteInfo(inviteInfo);
-                }
+                inviteStreamService.updateInviteInfo(inviteInfo);
             }, (event) -> {
                 dynamicTask.stop(timeOutTaskKey);
                 mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream());
@@ -527,19 +412,11 @@
 
                 callback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_ERROR.getCode(),
                         String.format("鐐规挱澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg), null);
-                if( device.isSwitchPrimarySubStream()){
-                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                            InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
-                            String.format("鐐规挱澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg), null);
+                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                        InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
+                        String.format("鐐规挱澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg), null);
 
-                    inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream);
-                }else {
-                    inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                            InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(),
-                            String.format("鐐规挱澶辫触锛� 閿欒鐮侊細 %s, %s", event.statusCode, event.msg), null);
-
-                    inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
-                }
+                inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
             });
         } catch (InvalidArgumentException | SipException | ParseException e) {
 
@@ -553,52 +430,30 @@
 
             callback.run(InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(),
                     InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null);
-            if( device.isSwitchPrimarySubStream()){
-                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null,
-                        InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(),
-                        InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null);
+            inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
+                    InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(),
+                    InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null);
 
-                inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream);
-            }else {
-                inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null,
-                        InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(),
-                        InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null);
-
-                inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
-            }
+            inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId);
         }
     }
 
-    private StreamInfo onPublishHandlerForPlay(MediaServerItem mediaServerItem, HookParam hookParam, String deviceId, String channelId, boolean isSubStream) {
+    private StreamInfo onPublishHandlerForPlay(MediaServerItem mediaServerItem, HookParam hookParam, String deviceId, String channelId) {
         StreamInfo streamInfo = null;
         Device device = redisCatchStorage.getDevice(deviceId);
         OnStreamChangedHookParam streamChangedHookParam = (OnStreamChangedHookParam)hookParam;
-        if( device.isSwitchPrimarySubStream() ){
-            streamInfo = onPublishHandler(mediaServerItem, streamChangedHookParam, deviceId, channelId,isSubStream);
-        }else {
-            streamInfo = onPublishHandler(mediaServerItem, streamChangedHookParam, deviceId, channelId);
-        }
+        streamInfo = onPublishHandler(mediaServerItem, streamChangedHookParam, deviceId, channelId);
         if (streamInfo != null) {
-            InviteInfo inviteInfo;
-            if(device.isSwitchPrimarySubStream()){
-                inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream);
-            }else {
-                DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
-                if (deviceChannel != null) {
-                    deviceChannel.setStreamId(streamInfo.getStream());
-                    storager.startPlay(deviceId, channelId, streamInfo.getStream());
-                }
-                inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
+            DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId);
+            if (deviceChannel != null) {
+                deviceChannel.setStreamId(streamInfo.getStream());
+                storager.startPlay(deviceId, channelId, streamInfo.getStream());
             }
+            InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
             if (inviteInfo != null) {
                 inviteInfo.setStatus(InviteSessionStatus.ok);
                 inviteInfo.setStreamInfo(streamInfo);
-                if(device.isSwitchPrimarySubStream()){
-                    inviteStreamService.updateInviteInfoSub(inviteInfo);
-                }else {
-                    inviteStreamService.updateInviteInfo(inviteInfo);
-                }
-
+                inviteStreamService.updateInviteInfo(inviteInfo);
             }
         }
         return streamInfo;
@@ -693,7 +548,7 @@
                 device.getDeviceId(), channelId, startTime, endTime, ssrcInfo.getPort(), device.getStreamMode(),
                 ssrcInfo.getSsrc(), device.isSsrcCheck());
         // 鍒濆鍖杛edis涓殑invite娑堟伅鐘舵��
-        InviteInfo inviteInfo = InviteInfo.getinviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo,
+        InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo,
                 mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAYBACK,
                 InviteSessionStatus.ready);
         inviteStreamService.updateInviteInfo(inviteInfo);
@@ -805,7 +660,7 @@
                                     subscribe.removeSubscribe(hookSubscribe);
                                     String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase();
                                     hookSubscribe.getContent().put("stream", stream);
-                                    inviteInfo.setStream(stream);
+                                    inviteStreamService.updateInviteInfoForStream(inviteInfo, stream);
                                     subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> {
                                         logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + hookParam);
                                         dynamicTask.stop(playBackTimeOutTaskKey);
@@ -834,6 +689,10 @@
                                             "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触", null);
 
                                 }else {
+                                    if (ssrcInfo.getStream()!= null && !ssrcInfo.getStream().equals(inviteInfo.getStream())) {
+                                        inviteStreamService.removeInviteInfo(inviteInfo);
+                                    }
+
                                     ssrcInfo.setSsrc(ssrcInResponse);
                                     inviteInfo.setSsrcInfo(ssrcInfo);
                                     inviteInfo.setStream(ssrcInfo.getStream());
@@ -892,7 +751,7 @@
         }
         logger.info("[褰曞儚涓嬭浇] deviceId: {}, channelId: {}, 涓嬭浇閫熷害锛歿}, 鏀舵祦绔彛锛歿}, 鏀舵祦妯″紡锛歿}, SSRC: {}, SSRC鏍¢獙锛歿}", device.getDeviceId(), channelId, downloadSpeed, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
         // 鍒濆鍖杛edis涓殑invite娑堟伅鐘舵��
-        InviteInfo inviteInfo = InviteInfo.getinviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo,
+        InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo,
                 mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.DOWNLOAD,
                 InviteSessionStatus.ready);
         inviteStreamService.updateInviteInfo(inviteInfo);
@@ -998,7 +857,9 @@
                                     // 娣诲姞璁㈤槄
                                     HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
                                     subscribe.removeSubscribe(hookSubscribe);
-                                    hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase());
+                                    String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase();
+                                    hookSubscribe.getContent().put("stream", stream);
+                                    inviteStreamService.updateInviteInfoForStream(inviteInfo, stream);
                                     subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> {
                                         logger.info("[ZLM HOOK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + hookParam);
                                         dynamicTask.stop(downLoadTimeOutTaskKey);
@@ -1026,6 +887,9 @@
                                             "涓嬬骇鑷畾涔変簡ssrc,閲嶆柊璁剧疆鏀舵祦淇℃伅澶辫触", null);
 
                                 }else {
+                                    if (ssrcInfo.getStream()!= null && !ssrcInfo.getStream().equals(inviteInfo.getStream())) {
+                                        inviteStreamService.removeInviteInfo(inviteInfo);
+                                    }
                                     ssrcInfo.setSsrc(ssrcInResponse);
                                     inviteInfo.setSsrcInfo(ssrcInfo);
                                     inviteInfo.setStream(ssrcInfo.getStream());
@@ -1034,6 +898,7 @@
                                 logger.info("[褰曞儚涓嬭浇] 鏀跺埌invite 200, 涓嬬骇鑷畾涔変簡ssrc, 浣嗘槸褰撳墠妯″紡鏃犻渶淇");
                             }
                         }
+                        inviteStreamService.updateInviteInfo(inviteInfo);
                     });
         } catch (InvalidArgumentException | SipException | ParseException e) {
             logger.error("[鍛戒护鍙戦�佸け璐 褰曞儚涓嬭浇: {}", e.getMessage());
@@ -1255,18 +1120,13 @@
     }
 
     @Override
-    public void getSnap(String deviceId, String channelId, String fileName,boolean isSubStream, ErrorCallback errorCallback) {
+    public void getSnap(String deviceId, String channelId, String fileName, ErrorCallback errorCallback) {
         Device device = deviceService.getDevice(deviceId);
         if (device == null) {
             errorCallback.run(InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getCode(), InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getMsg(), null);
             return;
         }
-        InviteInfo inviteInfo;
-        if(device.isSwitchPrimarySubStream()){
-             inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream);
-        }else {
-            inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
-        }
+        InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
         if (inviteInfo != null) {
             if (inviteInfo.getStreamInfo() != null) {
                 // 宸插瓨鍦ㄧ嚎鐩存帴鎴浘
@@ -1292,11 +1152,11 @@
         }
 
         MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
-        play(newMediaServerItem, deviceId, channelId,isSubStream, (code, msg, data)->{
+        play(newMediaServerItem, deviceId, channelId, (code, msg, data)->{
            if (code == InviteErrorCode.SUCCESS.getCode()) {
                InviteInfo inviteInfoForPlay = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
                if (inviteInfoForPlay != null && inviteInfoForPlay.getStreamInfo() != null) {
-                   getSnap(deviceId, channelId, fileName,isSubStream, errorCallback);
+                   getSnap(deviceId, channelId, fileName, errorCallback);
                }else {
                    errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null);
                }
@@ -1305,18 +1165,5 @@
            }
         });
     }
-
-
-    /*======================璁惧涓诲瓙鐮佹祦閫昏緫START=========================*/
-    public StreamInfo onPublishHandler(MediaServerItem mediaServerItem, OnStreamChangedHookParam hookParam, String deviceId, String channelId,boolean isSubStream) {
-        String streamId = hookParam.getStream();
-        List<OnStreamChangedHookParam.MediaTrack> tracks = hookParam.getTracks();
-        StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(mediaServerItem, "rtp", streamId, tracks, null);
-        streamInfo.setDeviceID(deviceId);
-        streamInfo.setChannelId(channelId);
-        streamInfo.setSubStream(isSubStream);
-        return streamInfo;
-    }
-    /*======================璁惧涓诲瓙鐮佹祦閫昏緫END=========================*/
 
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java
index efbb24d..30d9c13 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java
@@ -70,7 +70,6 @@
                 continue;
             }
             String checkStr = callId == null? user.getPushKey():(callId + "_" + user.getPushKey())  ;
-            System.out.println(checkStr);
             String checkSign = DigestUtils.md5DigestAsHex(checkStr.getBytes());
             if (checkSign.equals(sign)) {
                 return true;
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
index 0cf4874..b9e778e 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -88,17 +88,16 @@
 	@Operation(summary = "寮�濮嬬偣鎾�")
 	@Parameter(name = "deviceId", description = "璁惧鍥芥爣缂栧彿", required = true)
 	@Parameter(name = "channelId", description = "閫氶亾鍥芥爣缂栧彿", required = true)
-	@Parameter(name = "isSubStream", description = "鏄惁瀛愮爜娴侊紙true-瀛愮爜娴侊紝false-涓荤爜娴侊級锛岄粯璁や负false", required = true)
 	@GetMapping("/start/{deviceId}/{channelId}")
 	public DeferredResult<WVPResult<StreamContent>> play(HttpServletRequest request, @PathVariable String deviceId,
-														 @PathVariable String channelId,boolean isSubStream) {
+														 @PathVariable String channelId) {
 
 		// 鑾峰彇鍙敤鐨剒lm
 		Device device = storager.queryVideoDevice(deviceId);
 		MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
 
 		RequestMessage requestMessage = new RequestMessage();
-		String key = DeferredResultHolder.getPlayKey(deviceId,channelId,device.isSwitchPrimarySubStream(),isSubStream);
+		String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId;
 		requestMessage.setKey(key);
 		String uuid = UUID.randomUUID().toString();
 		requestMessage.setId(uuid);
@@ -117,7 +116,7 @@
 		// 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ
 		resultHolder.put(key, uuid, result);
 
-		playService.play(newMediaServerItem, deviceId, channelId,isSubStream, (code, msg, data) -> {
+		playService.play(newMediaServerItem, deviceId, channelId, (code, msg, data) -> {
 			WVPResult<StreamContent> wvpResult = new WVPResult<>();
 			if (code == InviteErrorCode.SUCCESS.getCode()) {
 				wvpResult.setCode(ErrorCode.SUCCESS.getCode());
@@ -158,12 +157,7 @@
 			throw new ControllerException(ErrorCode.ERROR100.getCode(), "璁惧[" + deviceId + "]涓嶅瓨鍦�");
 		}
 
-		InviteInfo inviteInfo =null;
-		if(device.isSwitchPrimarySubStream()){
-			inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream);
-		}else {
-			inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
-		}
+		InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
 		if (inviteInfo == null) {
 			throw new ControllerException(ErrorCode.ERROR100.getCode(), "鐐规挱鏈壘鍒�");
 		}
@@ -176,12 +170,8 @@
 				throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍛戒护鍙戦�佸け璐�: " + e.getMessage());
 			}
 		}
-		if(device.isSwitchPrimarySubStream()){
-			inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream);
-		}else {
-			inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
-			storager.stopPlay(deviceId, channelId);
-		}
+		inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId);
+		storager.stopPlay(deviceId, channelId);
 
 		JSONObject json = new JSONObject();
 		json.put("deviceId", deviceId);
@@ -360,9 +350,8 @@
 			logger.debug("鑾峰彇鎴浘: {}/{}", deviceId, channelId);
 		}
 
-		Device device = storager.queryVideoDevice(deviceId);
 		DeferredResult<String> result = new DeferredResult<>(3 * 1000L);
-		String key = DeferredResultHolder.getSnapKey(deviceId,channelId,device.isSwitchPrimarySubStream(),isSubStream);
+		String key  = DeferredResultHolder.CALLBACK_CMD_SNAP + deviceId;
 		String uuid  = UUID.randomUUID().toString();
 		resultHolder.put(key, uuid,  result);
 
@@ -371,7 +360,7 @@
 		message.setId(uuid);
 
 		String fileName = deviceId + "_" + channelId + "_" + DateUtil.getNowForUrl() + "jpg";
-		playService.getSnap(deviceId, channelId, fileName,isSubStream, (code, msg, data) -> {
+		playService.getSnap(deviceId, channelId, fileName, (code, msg, data) -> {
 			if (code == InviteErrorCode.SUCCESS.getCode()) {
 				message.setData(data);
 			}else {
diff --git a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
index 29c776a..556adf6 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
@@ -122,7 +122,7 @@
         MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
 
 
-        playService.play(newMediaServerItem, serial, code,false, (errorCode, msg, data) -> {
+        playService.play(newMediaServerItem, serial, code, (errorCode, msg, data) -> {
             if (errorCode == InviteErrorCode.SUCCESS.getCode()) {
                 InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, serial, code);
                 if (inviteInfo != null && inviteInfo.getStreamInfo() != null) {

--
Gitblit v1.8.0