| 
					
				 | 
			
			
				@@ -558,9 +558,12 @@ public class ZLMHttpHookListener { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		String app = json.getString("app");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		JSONObject ret = new JSONObject();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		ret.put("code", 0);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 录像下载
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ret.put("close", userSetting.getStreamOnDemand());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if ("rtp".equals(app)){
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			ret.put("close", true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 国标流, 点播/录像回放/录像下载
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			StreamInfo streamInfoForPlayCatch = redisCatchStorage.queryPlayByStreamId(streamId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 点播
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (streamInfoForPlayCatch != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// 收到无人观看说明流也没有在往上级推送
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				if (redisCatchStorage.isChannelSendingRTP(streamInfoForPlayCatch.getChannelId())) {
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -590,40 +593,39 @@ public class ZLMHttpHookListener { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				redisCatchStorage.stopPlay(streamInfoForPlayCatch);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				storager.stopPlay(streamInfoForPlayCatch.getDeviceID(), streamInfoForPlayCatch.getChannelId());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			}else{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if (streamInfoForPlayBackCatch != null ) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (streamInfoForPlayBackCatch.isPause()) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						ret.put("close", false);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					}else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						Device device = deviceService.queryDevice(streamInfoForPlayBackCatch.getDeviceID());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						if (device != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								cmder.streamByeCmd(device,streamInfoForPlayBackCatch.getChannelId(),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-										streamInfoForPlayBackCatch.getStream(), null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							} catch (InvalidArgumentException | ParseException | SipException |
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-									 SsrcTransactionNotFoundException e) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								logger.error("[无人观看]回放, 发送BYE失败 {}", e.getMessage());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-							}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch.getDeviceID(),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-								streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return ret;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 录像回放
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			StreamInfo streamInfoForPlayBackCatch = redisCatchStorage.queryPlayback(null, null, streamId, null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (streamInfoForPlayBackCatch != null ) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (streamInfoForPlayBackCatch.isPause()) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					ret.put("close", false);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, streamId, null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					// 进行录像下载时无人观看不断流
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (streamInfoForDownload != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						ret.put("close", false);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					Device device = deviceService.queryDevice(streamInfoForPlayBackCatch.getDeviceID());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (device != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						try {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							cmder.streamByeCmd(device,streamInfoForPlayBackCatch.getChannelId(),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+									streamInfoForPlayBackCatch.getStream(), null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						} catch (InvalidArgumentException | ParseException | SipException |
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								 SsrcTransactionNotFoundException e) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							logger.error("[无人观看]回放, 发送BYE失败 {}", e.getMessage());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch.getDeviceID(),
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							streamInfoForPlayBackCatch.getChannelId(), streamInfoForPlayBackCatch.getStream(), null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return ret;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if (mediaServerItem != null && mediaServerItem.getStreamNoneReaderDelayMS() == -1) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 录像下载
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			StreamInfo streamInfoForDownload = redisCatchStorage.queryDownload(null, null, streamId, null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 进行录像下载时无人观看不断流
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (streamInfoForDownload != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				ret.put("close", false);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return ret;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return ret;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 非国标流 推流/拉流代理
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 拉流代理
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(app, streamId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (streamProxyItem != null ) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				if (streamProxyItem.isEnable_remove_none_reader()) {
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -635,12 +637,21 @@ public class ZLMHttpHookListener { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}else if (streamProxyItem.isEnable_disable_none_reader()) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					// 无人观看停用
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					ret.put("close", true);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					// 修改数据
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					streamProxyService.stop(app, streamId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					ret.put("close", false);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return ret;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return ret;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 推流具有主动性,暂时不做处理
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			StreamPushItem streamPushItem = streamPushService.getPush(app, streamId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			if (streamPushItem != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//				// TODO 发送停止
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return ret;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	/**
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -655,19 +666,27 @@ public class ZLMHttpHookListener { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		String mediaServerId = json.getString("mediaServerId");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (userSetting.isAutoApplyPlay() && mediaInfo != null && mediaInfo.isRtpEnable()) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (userSetting.isAutoApplyPlay() && mediaInfo != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			String app = json.getString("app");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			String streamId = json.getString("stream");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if ("rtp".equals(app)) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				String[] s = streamId.split("_");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if (s.length == 2) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					String deviceId = s[0];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					String channelId = s[1];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					Device device = redisCatchStorage.getDevice(deviceId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					if (device != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-						playService.play(mediaInfo,deviceId, channelId, null, null, null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (mediaInfo.isRtpEnable()) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					String[] s = streamId.split("_");
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					if (s.length == 2) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						String deviceId = s[0];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						String channelId = s[1];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						Device device = redisCatchStorage.getDevice(deviceId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if (device != null) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							playService.play(mediaInfo,deviceId, channelId, null, null, null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// 拉流代理
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				StreamProxyItem streamProxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(app, streamId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnable_disable_none_reader()) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					streamProxyService.start(app, streamId);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 |