From 1ce30e6656a9513cd753e20db3ea38f3c646d4eb Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 26 三月 2024 17:49:56 +0800
Subject: [PATCH] 临时提交
---
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 103 +------------------------
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java | 113 +++++++++++++++++++++++++++
src/main/java/com/genersoft/iot/vmp/service/IMediaService.java | 2
3 files changed, 120 insertions(+), 98 deletions(-)
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 77ff9b0..a5b78ed 100755
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -241,98 +241,9 @@
logger.info("[ZLM HOOK]娴佹棤浜鸿鐪嬶細{}->{}->{}/{}", param.getMediaServerId(), param.getSchema(),
param.getApp(), param.getStream());
JSONObject ret = new JSONObject();
- ret.put("code", 0);
- // 鍥芥爣绫诲瀷鐨勬祦
- if ("rtp".equals(param.getApp())) {
- ret.put("close", userSetting.getStreamOnDemand());
- // 鍥芥爣娴侊紝 鐐规挱/褰曞儚鍥炴斁/褰曞儚涓嬭浇
- InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, param.getStream());
- // 鐐规挱
- if (inviteInfo != null) {
- // 褰曞儚涓嬭浇
- if (inviteInfo.getType() == InviteSessionType.DOWNLOAD) {
- ret.put("close", false);
- return ret;
- }
- // 鏀跺埌鏃犱汉瑙傜湅璇存槑娴佷篃娌℃湁鍦ㄥ線涓婄骇鎺ㄩ��
- if (redisCatchStorage.isChannelSendingRTP(inviteInfo.getChannelId())) {
- List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByChannelId(
- inviteInfo.getChannelId());
- if (!sendRtpItems.isEmpty()) {
- for (SendRtpItem sendRtpItem : sendRtpItems) {
- ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId());
- try {
- commanderFroPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId());
- } catch (SipException | InvalidArgumentException | ParseException e) {
- logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage());
- }
- redisCatchStorage.deleteSendRTPServer(parentPlatform.getServerGBId(), sendRtpItem.getChannelId(),
- sendRtpItem.getCallId(), sendRtpItem.getStream());
- if (InviteStreamType.PUSH == sendRtpItem.getPlayType()) {
- MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(0,
- sendRtpItem.getApp(), sendRtpItem.getStream(), sendRtpItem.getChannelId(),
- sendRtpItem.getPlatformId(), parentPlatform.getName(), userSetting.getServerId(), sendRtpItem.getMediaServerId());
- messageForPushChannel.setPlatFormIndex(parentPlatform.getId());
- redisCatchStorage.sendPlatformStopPlayMsg(messageForPushChannel);
- }
- }
- }
- }
- Device device = deviceService.getDevice(inviteInfo.getDeviceId());
- if (device != null) {
- try {
- // 澶氭煡璇竴娆¢槻姝㈠凡缁忚澶勭悊浜�
- InviteInfo info = inviteStreamService.getInviteInfo(inviteInfo.getType(),
- inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream());
- if (info != null) {
- cmder.streamByeCmd(device, inviteInfo.getChannelId(),
- inviteInfo.getStream(), null);
- } else {
- logger.info("[鏃犱汉瑙傜湅] 鏈壘鍒拌澶囩殑鐐规挱淇℃伅锛� {}锛� 娴侊細{}", inviteInfo.getDeviceId(), param.getStream());
- }
- } catch (InvalidArgumentException | ParseException | SipException |
- SsrcTransactionNotFoundException e) {
- logger.error("[鏃犱汉瑙傜湅]鐐规挱锛� 鍙戦�丅YE澶辫触 {}", e.getMessage());
- }
- } else {
- logger.info("[鏃犱汉瑙傜湅] 鏈壘鍒拌澶囷細 {}锛屾祦锛歿}", inviteInfo.getDeviceId(), param.getStream());
- }
- inviteStreamService.removeInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(),
- inviteInfo.getChannelId(), inviteInfo.getStream());
- storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId());
- return ret;
- }
- SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, null, param.getStream(), null);
- if (sendRtpItem != null && "talk".equals(sendRtpItem.getApp())) {
- ret.put("close", false);
- return ret;
- }
- } else if ("talk".equals(param.getApp()) || "broadcast".equals(param.getApp())) {
- ret.put("close", false);
- } else {
- // 闈炲浗鏍囨祦 鎺ㄦ祦/鎷夋祦浠g悊
- // 鎷夋祦浠g悊
- StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(param.getApp(), param.getStream());
- if (streamProxyItem != null) {
- if (streamProxyItem.isEnableRemoveNoneReader()) {
- // 鏃犱汉瑙傜湅鑷姩绉婚櫎
- ret.put("close", true);
- streamProxyService.del(param.getApp(), param.getStream());
- String url = streamProxyItem.getUrl() != null ? streamProxyItem.getUrl() : streamProxyItem.getSrcUrl();
- logger.info("[{}/{}]<-[{}] 鎷夋祦浠g悊鏃犱汉瑙傜湅宸茬粡绉婚櫎", param.getApp(), param.getStream(), url);
- } else if (streamProxyItem.isEnableDisableNoneReader()) {
- // 鏃犱汉瑙傜湅鍋滅敤
- ret.put("close", true);
- // 淇敼鏁版嵁
- streamProxyService.stop(param.getApp(), param.getStream());
- } else {
- // 鏃犱汉瑙傜湅涓嶅仛澶勭悊
- ret.put("close", false);
- }
- return ret;
- }
- }
+ boolean close = mediaService.closeStreamOnNoneReader(param.getMediaServerId(), param.getApp(), param.getStream(), param.getSchema());
+ ret.put("code", close);
return ret;
}
@@ -346,8 +257,8 @@
DeferredResult<HookResult> defaultResult = new DeferredResult<>();
- MediaServer mediaInfo = mediaServerService.getOne(param.getMediaServerId());
- if (!userSetting.isAutoApplyPlay() || mediaInfo == null) {
+ MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId());
+ if (!userSetting.isAutoApplyPlay() || mediaServer == null) {
defaultResult.setResult(new HookResult(ErrorCode.ERROR404.getCode(), ErrorCode.ERROR404.getMsg()));
return defaultResult;
}
@@ -392,7 +303,7 @@
resultHolder.put(key, uuid, result);
if (!exist) {
- playService.play(mediaInfo, deviceId, channelId, null, (code, message, data) -> {
+ playService.play(mediaServer, deviceId, channelId, null, (code, message, data) -> {
msg.setData(new HookResult(code, message));
resultHolder.invokeResult(msg);
});
@@ -431,9 +342,9 @@
resultHolder.put(key, uuid, result);
if (!exist) {
- SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaInfo, param.getStream(), null,
+ SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServer, param.getStream(), null,
device.isSsrcCheck(), true, 0, false, false, device.getStreamModeForParam());
- playService.playBack(mediaInfo, ssrcInfo, deviceId, channelId, startTime, endTime, (code, message, data) -> {
+ playService.playBack(mediaServer, ssrcInfo, deviceId, channelId, startTime, endTime, (code, message, data) -> {
msg.setData(new HookResult(code, message));
resultHolder.invokeResult(msg);
});
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java b/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
index 4905455..d3a57f7 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IMediaService.java
@@ -49,4 +49,6 @@
boolean authenticatePlay(String app, String stream, String callId);
ResultForOnPublish authenticatePublish(MediaServer mediaServer, String app, String stream, String params);
+
+ boolean closeStreamOnNoneReader(String mediaServerId, String app, String stream, String schema);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
index 21c3472..e57c7ea 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
@@ -7,9 +7,11 @@
import com.genersoft.iot.vmp.conf.MediaConfig;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.conf.exception.ControllerException;
-import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
-import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
+import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
+import com.genersoft.iot.vmp.gb28181.bean.*;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
+import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform;
import com.genersoft.iot.vmp.media.bean.MediaInfo;
import com.genersoft.iot.vmp.media.bean.ResultForOnPublish;
import com.genersoft.iot.vmp.media.service.IMediaServerService;
@@ -22,6 +24,7 @@
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
import com.genersoft.iot.vmp.media.zlm.dto.hook.HookResultForOnPublish;
import com.genersoft.iot.vmp.service.*;
+import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.utils.DateUtil;
@@ -35,6 +38,9 @@
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
+import javax.sip.InvalidArgumentException;
+import javax.sip.SipException;
+import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -76,6 +82,15 @@
@Autowired
private ZLMMediaListManager zlmMediaListManager;
+
+ @Autowired
+ private IDeviceService deviceService;
+
+ @Autowired
+ private ISIPCommanderForPlatform commanderForPlatform;
+
+ @Autowired
+ private ISIPCommander commander;
@@ -291,4 +306,98 @@
}
return map;
}
+
+ @Override
+ public boolean closeStreamOnNoneReader(String mediaServerId, String app, String stream, String schema) {
+ boolean result = false;
+ // 鍥芥爣绫诲瀷鐨勬祦
+ if ("rtp".equals(app)) {
+ result = userSetting.getStreamOnDemand();
+ // 鍥芥爣娴侊紝 鐐规挱/褰曞儚鍥炴斁/褰曞儚涓嬭浇
+ InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, stream);
+ // 鐐规挱
+ if (inviteInfo != null) {
+ // 褰曞儚涓嬭浇
+ if (inviteInfo.getType() == InviteSessionType.DOWNLOAD) {
+ return false;
+ }
+ // 鏀跺埌鏃犱汉瑙傜湅璇存槑娴佷篃娌℃湁鍦ㄥ線涓婄骇鎺ㄩ��
+ if (redisCatchStorage.isChannelSendingRTP(inviteInfo.getChannelId())) {
+ List<SendRtpItem> sendRtpItems = redisCatchStorage.querySendRTPServerByChannelId(
+ inviteInfo.getChannelId());
+ if (!sendRtpItems.isEmpty()) {
+ for (SendRtpItem sendRtpItem : sendRtpItems) {
+ ParentPlatform parentPlatform = storager.queryParentPlatByServerGBId(sendRtpItem.getPlatformId());
+ try {
+ commanderForPlatform.streamByeCmd(parentPlatform, sendRtpItem.getCallId());
+ } catch (SipException | InvalidArgumentException | ParseException e) {
+ logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�丅YE: {}", e.getMessage());
+ }
+ redisCatchStorage.deleteSendRTPServer(parentPlatform.getServerGBId(), sendRtpItem.getChannelId(),
+ sendRtpItem.getCallId(), sendRtpItem.getStream());
+ if (InviteStreamType.PUSH == sendRtpItem.getPlayType()) {
+ MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(0,
+ sendRtpItem.getApp(), sendRtpItem.getStream(), sendRtpItem.getChannelId(),
+ sendRtpItem.getPlatformId(), parentPlatform.getName(), userSetting.getServerId(), sendRtpItem.getMediaServerId());
+ messageForPushChannel.setPlatFormIndex(parentPlatform.getId());
+ redisCatchStorage.sendPlatformStopPlayMsg(messageForPushChannel);
+ }
+ }
+ }
+ }
+ Device device = deviceService.getDevice(inviteInfo.getDeviceId());
+ if (device != null) {
+ try {
+ // 澶氭煡璇竴娆¢槻姝㈠凡缁忚澶勭悊浜�
+ InviteInfo info = inviteStreamService.getInviteInfo(inviteInfo.getType(),
+ inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream());
+ if (info != null) {
+ commander.streamByeCmd(device, inviteInfo.getChannelId(),
+ inviteInfo.getStream(), null);
+ } else {
+ logger.info("[鏃犱汉瑙傜湅] 鏈壘鍒拌澶囩殑鐐规挱淇℃伅锛� {}锛� 娴侊細{}", inviteInfo.getDeviceId(), stream);
+ }
+ } catch (InvalidArgumentException | ParseException | SipException |
+ SsrcTransactionNotFoundException e) {
+ logger.error("[鏃犱汉瑙傜湅]鐐规挱锛� 鍙戦�丅YE澶辫触 {}", e.getMessage());
+ }
+ } else {
+ logger.info("[鏃犱汉瑙傜湅] 鏈壘鍒拌澶囷細 {}锛屾祦锛歿}", inviteInfo.getDeviceId(), stream);
+ }
+
+ inviteStreamService.removeInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(),
+ inviteInfo.getChannelId(), inviteInfo.getStream());
+ storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId());
+ return result;
+ }
+ SendRtpItem sendRtpItem = redisCatchStorage.querySendRTPServer(null, null, stream, null);
+ if (sendRtpItem != null && "talk".equals(sendRtpItem.getApp())) {
+ return false;
+ }
+ } else if ("talk".equals(app) || "broadcast".equals(app)) {
+ return false;
+ } else {
+ // 闈炲浗鏍囨祦 鎺ㄦ祦/鎷夋祦浠g悊
+ // 鎷夋祦浠g悊
+ StreamProxyItem streamProxyItem = streamProxyService.getStreamProxyByAppAndStream(app, stream);
+ if (streamProxyItem != null) {
+ if (streamProxyItem.isEnableRemoveNoneReader()) {
+ // 鏃犱汉瑙傜湅鑷姩绉婚櫎
+ result = true;
+ streamProxyService.del(app, stream);
+ String url = streamProxyItem.getUrl() != null ? streamProxyItem.getUrl() : streamProxyItem.getSrcUrl();
+ logger.info("[{}/{}]<-[{}] 鎷夋祦浠g悊鏃犱汉瑙傜湅宸茬粡绉婚櫎", app, stream, url);
+ } else if (streamProxyItem.isEnableDisableNoneReader()) {
+ // 鏃犱汉瑙傜湅鍋滅敤
+ result = true;
+ // 淇敼鏁版嵁
+ streamProxyService.stop(app, stream);
+ } else {
+ // 鏃犱汉瑙傜湅涓嶅仛澶勭悊
+ result = false;
+ }
+ }
+ }
+ return result;
+ }
}
--
Gitblit v1.8.0