From 95ed66293532268a26970d3c06795641999e0712 Mon Sep 17 00:00:00 2001
From: 64850858 <648540858@qq.com>
Date: 星期一, 26 七月 2021 17:22:40 +0800
Subject: [PATCH] 修复stream-none-reader-delay-ms为-1时不自动关闭流
---
src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java | 2 +
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 8 +++-
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 4 +-
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java | 53 +++++++++++++++++++-------
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java | 1
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java | 5 ++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/ByeResponseProcessor.java | 2
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java | 4 +-
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java | 1
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java | 10 +++++
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java | 3 +
11 files changed, 70 insertions(+), 23 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
index 30c9e95..6a93d01 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorFactory.java
@@ -159,6 +159,7 @@
ByeRequestProcessor processor = new ByeRequestProcessor();
processor.setRequestEvent(evt);
processor.setRedisCatchStorage(redisCatchStorage);
+ processor.setStorager(storager);
processor.setZlmrtpServerFactory(zlmrtpServerFactory);
processor.setSIPCommander(cmder);
processor.setMediaServerService(mediaServerService);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
index ffa5377..817b6b7 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/ByeRequestProcessor.java
@@ -11,6 +11,8 @@
import javax.sip.header.ToHeader;
import javax.sip.message.Response;
+import com.genersoft.iot.vmp.common.StreamInfo;
+import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
@@ -18,6 +20,7 @@
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,6 +41,8 @@
private IRedisCatchStorage redisCatchStorage;
+ private IVideoManagerStorager storager;
+
private ZLMRTPServerFactory zlmrtpServerFactory;
private IMediaServerService mediaServerService;
@@ -56,20 +61,32 @@
String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(platformGbId, channelId);
- if (sendRtpItem == null) return;
- String streamId = sendRtpItem.getStreamId();
- Map<String, Object> param = new HashMap<>();
- param.put("vhost","__defaultVhost__");
- param.put("app",sendRtpItem.getApp());
- param.put("stream",streamId);
- param.put("ssrc",sendRtpItem.getSsrc());
- logger.info("鍋滄鍚戜笂绾ф帹娴侊細" + streamId);
- MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
- zlmrtpServerFactory.stopSendRtpStream(mediaInfo, param);
- redisCatchStorage.deleteSendRTPServer(platformGbId, channelId);
- if (zlmrtpServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId) == 0) {
- logger.info(streamId + "鏃犲叾瀹冭鐪嬭�咃紝閫氱煡璁惧鍋滄鎺ㄦ祦");
- cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId);
+ logger.info("鏀跺埌bye, [{}/{}]", platformGbId, channelId);
+ if (sendRtpItem != null){
+ String streamId = sendRtpItem.getStreamId();
+ Map<String, Object> param = new HashMap<>();
+ param.put("vhost","__defaultVhost__");
+ param.put("app",sendRtpItem.getApp());
+ param.put("stream",streamId);
+ param.put("ssrc",sendRtpItem.getSsrc());
+ logger.info("鍋滄鍚戜笂绾ф帹娴侊細" + streamId);
+ MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
+ zlmrtpServerFactory.stopSendRtpStream(mediaInfo, param);
+ redisCatchStorage.deleteSendRTPServer(platformGbId, channelId);
+ if (zlmrtpServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId) == 0) {
+ logger.info(streamId + "鏃犲叾瀹冭鐪嬭�咃紝閫氱煡璁惧鍋滄鎺ㄦ祦");
+ cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId);
+ }
+ }
+ // 鍙兘鏄澶囦富鍔ㄥ仠姝�
+ Device device = storager.queryVideoDeviceByChannelId(platformGbId);
+ if (device != null) {
+ StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId);
+ if (streamInfo != null) {
+ redisCatchStorage.stopPlay(streamInfo);
+ }
+ storager.stopPlay(device.getDeviceId(), channelId);
+ mediaServerService.closeRTPServer(device, channelId);
}
}
} catch (SipException e) {
@@ -124,4 +141,12 @@
public void setMediaServerService(IMediaServerService mediaServerService) {
this.mediaServerService = mediaServerService;
}
+
+ public IVideoManagerStorager getStorager() {
+ return storager;
+ }
+
+ public void setStorager(IVideoManagerStorager storager) {
+ this.storager = storager;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
index d46c0c4..6a29652 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/request/impl/MessageRequestProcessor.java
@@ -756,7 +756,6 @@
deferredResultHolder.invokeResult(msg);
}
} catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
- // } catch (DocumentException e) {
e.printStackTrace();
}
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/ByeResponseProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/ByeResponseProcessor.java
index 53bc8f7..02fdb1a 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/ByeResponseProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/ByeResponseProcessor.java
@@ -27,7 +27,7 @@
@Override
public void process(ResponseEvent evt, SipLayer layer, SipConfig config) {
// TODO Auto-generated method stub
-
+ System.out.println( );
}
}
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 478772a..678a56e 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
@@ -346,6 +346,10 @@
redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch);
}
}
+ MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
+ if (mediaServerItem != null && "-1".equals(mediaServerItem.getStreamNoneReaderDelayMS())) {
+ ret.put("close", false);
+ }
return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
}else {
JSONObject ret = new JSONObject();
@@ -371,7 +375,7 @@
if (userSetup.isAutoApplyPlay() && mediaInfo != null) {
String app = json.getString("app");
String streamId = json.getString("stream");
- if ("rtp".equals(app) && streamId.contains("gb_play") ) {
+ if ("rtp".equals(app)) {
String[] s = streamId.split("_");
if (s.length == 4) {
String deviceId = s[2];
@@ -382,7 +386,7 @@
SSRCInfo ssrcInfo;
String streamId2 = null;
if (mediaInfo.isRtpEnable()) {
- streamId2 = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
+ streamId2 = String.format("%s/%s", device.getDeviceId(), channelId);
}
ssrcInfo = mediaServerService.openRTPServer(mediaInfo, streamId2);
cmder.playStreamCmd(mediaInfo, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
index 3d66665..ba428b5 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -123,7 +123,7 @@
String mediaServerId = streamSession.getMediaServerId(device.getDeviceId(), channelId);
MediaServerItem mediaServerItem = this.getOne(mediaServerId);
if (mediaServerItem != null) {
- String streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
+ String streamId = String.format("%s/%s", device.getDeviceId(), channelId);
zlmrtpServerFactory.closeRTPServer(mediaServerItem, streamId);
releaseSsrc(mediaServerItem, streamSession.getSSRC(device.getDeviceId(), channelId));
}
@@ -380,7 +380,7 @@
param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex));
param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex));
param.put("hook.timeoutSec","20");
- param.put("general.streamNoneReaderDelayMS",mediaServerItem.getStreamNoneReaderDelayMS());
+ param.put("general.streamNoneReaderDelayMS","-1".equals(mediaServerItem.getStreamNoneReaderDelayMS())?"3600000":mediaServerItem.getStreamNoneReaderDelayMS() );
JSONObject responseJSON = zlmresTfulUtils.setServerConfig(mediaServerItem, param);
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 c21f599..eb80e78 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
@@ -156,7 +156,7 @@
SSRCInfo ssrcInfo;
String streamId = null;
if (mediaServerItem.isRtpEnable()) {
- streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
+ streamId = String.format("%s/%s", device.getDeviceId(), channelId);
}
ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId);
@@ -221,7 +221,7 @@
SSRCInfo ssrcInfo;
String streamId2 = null;
if (mediaServerItem.isRtpEnable()) {
- streamId2 = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
+ streamId2 = String.format("%s/%s", device.getDeviceId(), channelId);
}
ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId2);
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
index 223a5e8..266c945 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/IVideoManagerStorager.java
@@ -374,4 +374,6 @@
void updateMediaServer(MediaServerItem mediaServerItem);
List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean b);
+
+ Device queryVideoDeviceByChannelId(String platformGbId);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
index 45b5ab7..f7b89a9 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -102,4 +102,7 @@
" </script>"})
List<ChannelReduce> queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, Boolean inPlatform);
+
+ @Select("SELECT * FROM device_channel WHERE channelId=#{channelId}")
+ List<DeviceChannel> queryChannelByChannelId(String channelId);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
index 4e24753..82d9bdb 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStoragerImpl.java
@@ -623,4 +623,14 @@
public List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean enable) {
return streamProxyMapper.selectForEnableInMediaServer(id, enable);
}
+
+ @Override
+ public Device queryVideoDeviceByChannelId(String channelId) {
+ Device result = null;
+ List<DeviceChannel> channelList = deviceChannelMapper.queryChannelByChannelId(channelId);
+ if (channelList.size() == 1) {
+ result = deviceMapper.getDeviceByDeviceId(channelList.get(0).getDeviceId());
+ }
+ return result;
+ }
}
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 d6545b5..a5a94a9 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
@@ -168,7 +168,10 @@
})
@PostMapping("/convert/{streamId}")
public ResponseEntity<String> playConvert(@PathVariable String streamId) {
- StreamInfo streamInfo = streamId.startsWith("gb_play_") ? redisCatchStorage.queryPlayByStreamId(streamId) : redisCatchStorage.queryPlaybackByStreamId(streamId);
+ StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
+ if (streamInfo == null) {
+ streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId);
+ }
if (streamInfo == null) {
logger.warn("瑙嗛杞爜API璋冪敤澶辫触锛�, 瑙嗛娴佸凡缁忓仠姝�!");
return new ResponseEntity<String>("鏈壘鍒拌棰戞祦淇℃伅, 瑙嗛娴佸彲鑳藉凡缁忓仠姝�", HttpStatus.OK);
--
Gitblit v1.8.0