| 
					
				 | 
			
			
				@@ -228,7 +228,7 @@ public class ZLMRTPServerFactory { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         int localPort = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (userSetting.getGbSendStreamStrict()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (userSetting.getGbSendStreamStrict()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                localPort = keepPort(serverItem, ssrc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                localPort = keepPort(serverItem, ssrc, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 if (localPort == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -264,7 +264,7 @@ public class ZLMRTPServerFactory { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 默认为随机端口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         int localPort = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (userSetting.getGbSendStreamStrict()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            localPort = keepPort(serverItem, ssrc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            localPort = keepPort(serverItem, ssrc, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (localPort == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -288,23 +288,28 @@ public class ZLMRTPServerFactory { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 保持端口,直到需要需要发流时再释放 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public int keepPort(MediaServerItem serverItem, String ssrc) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        int localPort = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public int keepPort(MediaServerItem serverItem, String ssrc, Integer localPort) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Map<String, Object> param = new HashMap<>(3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        param.put("port", 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (localPort == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            localPort = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        param.put("port", localPort); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         param.put("enable_tcp", 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         param.put("stream_id", ssrc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         JSONObject jsonObject = zlmresTfulUtils.openRtpServer(serverItem, param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (jsonObject.getInteger("code") == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             localPort = jsonObject.getInteger("port"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(ssrc, null, serverItem.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Integer finalLocalPort = localPort; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             hookSubscribe.addSubscribe(hookSubscribeForRtpServerTimeout, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     (MediaServerItem mediaServerItem, JSONObject response)->{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        logger.info("[上级点播] {}->监听端口到期继续保持监听", ssrc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        int port = keepPort(serverItem, ssrc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (port == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            logger.info("[上级点播] {}->监听端口失败,移除监听", ssrc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (ssrc.equals(response.getString("ssrc"))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            logger.info("[上级点播] {}->监听端口到期继续保持监听", ssrc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            int port = keepPort(serverItem, ssrc, finalLocalPort); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            if (port == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                logger.info("[上级点播] {}->监听端口失败,移除监听", ssrc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                hookSubscribe.removeSubscribe(hookSubscribeForRtpServerTimeout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         logger.info("[保持端口] {}->监听端口: {}", ssrc, localPort); 
			 |