From 470625e0770e27e8f20c3221b9c4096218079294 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期一, 07 八月 2023 17:00:01 +0800
Subject: [PATCH] 支持全局固定流地址
---
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java | 12 +--
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java | 18 +++++-
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java | 57 +++---------------
src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookResultForOnPublish.java | 10 +++
src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java | 8 ++
src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java | 45 +++++++++++++-
6 files changed, 88 insertions(+), 62 deletions(-)
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 397a4a0..d2d9657 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
@@ -459,7 +459,10 @@
sendRtpItem.setApp("rtp");
if ("Playback".equalsIgnoreCase(sessionName)) {
sendRtpItem.setPlayType(InviteStreamType.PLAYBACK);
- SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, null, null, device.isSsrcCheck(), true, 0, false, device.getStreamModeForParam());
+ String startTimeStr = DateUtil.urlFormatter.format(start);
+ String endTimeStr = DateUtil.urlFormatter.format(end);
+ String stream = device.getDeviceId() + "_" + channelId + "_" + startTimeStr + "_" + endTimeStr;
+ SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, stream, null, device.isSsrcCheck(), true, 0, false, device.getStreamModeForParam());
sendRtpItem.setStreamId(ssrcInfo.getStream());
// 鍐欏叆redis锛� 瓒呮椂鏃跺洖澶�
redisCatchStorage.updateSendRTPSever(sendRtpItem);
@@ -520,12 +523,7 @@
}
}));
sendRtpItem.setPlayType(InviteStreamType.PLAY);
- String streamId = null;
- if (mediaServerItem.isRtpEnable()) {
- streamId = String.format("%s_%s", device.getDeviceId(), channelId);
- }else {
- streamId = String.format("%08x", Integer.parseInt(ssrcInfo.getSsrc())).toUpperCase();
- }
+ String streamId = String.format("%s_%s", device.getDeviceId(), channelId);
sendRtpItem.setStreamId(streamId);
sendRtpItem.setSsrc(ssrcInfo.getSsrc());
redisCatchStorage.updateSendRTPSever(sendRtpItem);
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 465aa2f..71bb5b8 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
@@ -193,7 +193,10 @@
String mediaServerId = json.getString("mediaServerId");
MediaServerItem mediaInfo = mediaServerService.getOne(mediaServerId);
-
+ if (mediaInfo == null) {
+ return new HookResultForOnPublish(200, "success");
+ }
+ // 鎺ㄦ祦閴存潈鐨勫鐞�
if (!"rtp".equals(param.getApp())) {
if (userSetting.getPushAuthority()) {
// 鎺ㄦ祦閴存潈
@@ -245,10 +248,20 @@
}
});
+ // 鏄惁褰曞儚
if ("rtp".equals(param.getApp())) {
result.setEnable_mp4(userSetting.getRecordSip());
} else {
result.setEnable_mp4(userSetting.isRecordPushLive());
+ }
+ // 鏇挎崲娴佸湴鍧�
+ if ("rtp".equals(param.getApp()) && !mediaInfo.isRtpEnable()) {
+ String ssrc = String.format("%010d", Long.parseLong(param.getStream(), 16));;
+ InviteInfo inviteInfo = inviteStreamService.getInviteInfoBySSRC(ssrc);
+ if (inviteInfo != null) {
+ result.setStream_replace(inviteInfo.getStream());
+ logger.info("[ZLM HOOK]鎺ㄦ祦閴存潈 stream: {} 鏇挎崲涓� {}", param.getStream(), inviteInfo.getStream());
+ }
}
List<SsrcTransaction> ssrcTransactionForAll = sessionManager.getSsrcTransactionForAll(null, null, null, param.getStream());
if (ssrcTransactionForAll != null && ssrcTransactionForAll.size() == 1) {
@@ -562,7 +575,7 @@
if ("rtp".equals(param.getApp())) {
String[] s = param.getStream().split("_");
- if (!mediaInfo.isRtpEnable() || (s.length != 2 && s.length != 4)) {
+ if ((s.length != 2 && s.length != 4)) {
defaultResult.setResult(HookResult.SUCCESS());
return defaultResult;
}
@@ -591,7 +604,6 @@
result.onTimeout(() -> {
logger.info("[ZLM HOOK] 棰勮娴佽嚜鍔ㄧ偣鎾�, 绛夊緟瓒呮椂");
- // 閲婃斁rtpserver
msg.setData(new HookResult(ErrorCode.ERROR100.getCode(), "鐐规挱瓒呮椂"));
resultHolder.invokeResult(msg);
});
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookResultForOnPublish.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookResultForOnPublish.java
index 68d969f..12d8362 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookResultForOnPublish.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/hook/HookResultForOnPublish.java
@@ -6,6 +6,7 @@
private boolean enable_mp4;
private int mp4_max_second;
private String mp4_save_path;
+ private String stream_replace;
public HookResultForOnPublish() {
}
@@ -51,12 +52,21 @@
this.mp4_save_path = mp4_save_path;
}
+ public String getStream_replace() {
+ return stream_replace;
+ }
+
+ public void setStream_replace(String stream_replace) {
+ this.stream_replace = stream_replace;
+ }
+
@Override
public String toString() {
return "HookResultForOnPublish{" +
"enable_audio=" + enable_audio +
", enable_mp4=" + enable_mp4 +
", mp4_max_second=" + mp4_max_second +
+ ", stream_replace=" + stream_replace +
", mp4_save_path='" + mp4_save_path + '\'' +
'}';
}
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 ae30f26..c06400d 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java
@@ -74,5 +74,13 @@
int getStreamInfoCount(String mediaServerId);
+ /**
+ * 鑾峰彇MediaServer涓嬬殑娴佷俊鎭�
+ */
+ InviteInfo getInviteInfoBySSRC(String ssrc);
+ /**
+ * 鏇存柊ssrc
+ */
+ InviteInfo updateInviteInfoForSSRC(InviteInfo inviteInfo, String ssrcInResponse);
}
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 def639b..d630a2c 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
@@ -80,7 +80,8 @@
":" + inviteInfoForUpdate.getType() +
":" + inviteInfoForUpdate.getDeviceId() +
":" + inviteInfoForUpdate.getChannelId() +
- ":" + inviteInfoForUpdate.getStream();
+ ":" + inviteInfoForUpdate.getStream()+
+ ":" + inviteInfoForUpdate.getSsrcInfo().getSsrc();
redisTemplate.opsForValue().set(key, inviteInfoForUpdate);
}
@@ -96,7 +97,8 @@
":" + inviteInfo.getType() +
":" + inviteInfo.getDeviceId() +
":" + inviteInfo.getChannelId() +
- ":" + stream;
+ ":" + stream +
+ ":" + inviteInfo.getSsrcInfo().getSsrc();
inviteInfoInDb.setStream(stream);
if (inviteInfoInDb.getSsrcInfo() != null) {
inviteInfoInDb.getSsrcInfo().setStream(stream);
@@ -111,7 +113,8 @@
":" + (type != null ? type : "*") +
":" + (deviceId != null ? deviceId : "*") +
":" + (channelId != null ? channelId : "*") +
- ":" + (stream != null ? stream : "*");
+ ":" + (stream != null ? stream : "*")
+ + ":*";
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() != 1) {
return null;
@@ -136,7 +139,8 @@
":" + (type != null ? type : "*") +
":" + (deviceId != null ? deviceId : "*") +
":" + (channelId != null ? channelId : "*") +
- ":" + (stream != null ? stream : "*");
+ ":" + (stream != null ? stream : "*") +
+ ":*";
List<Object> scanResult = RedisUtil.scan(redisTemplate, scanKey);
if (scanResult.size() > 0) {
for (Object keyObj : scanResult) {
@@ -191,7 +195,7 @@
@Override
public int getStreamInfoCount(String mediaServerId) {
int count = 0;
- String key = VideoManagerConstants.INVITE_PREFIX + ":*:*:*:*";
+ String key = VideoManagerConstants.INVITE_PREFIX + ":*:*:*:*:*";
List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
if (scanResult.size() == 0) {
return 0;
@@ -229,4 +233,35 @@
}
return key;
}
+
+ @Override
+ public InviteInfo getInviteInfoBySSRC(String ssrc) {
+ String key = VideoManagerConstants.INVITE_PREFIX + ":*:*:*:*:" + ssrc;
+ List<Object> scanResult = RedisUtil.scan(redisTemplate, key);
+ if (scanResult.size() != 1) {
+ return null;
+ }
+
+ return (InviteInfo) redisTemplate.opsForValue().get(scanResult.get(0));
+ }
+
+ @Override
+ public InviteInfo updateInviteInfoForSSRC(InviteInfo inviteInfo, String ssrc) {
+ 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() +
+ ":" + inviteInfo.getStream() +
+ ":" + inviteInfo.getSsrcInfo().getSsrc();
+ if (inviteInfoInDb.getSsrcInfo() != null) {
+ inviteInfoInDb.getSsrcInfo().setSsrc(ssrc);
+ }
+ redisTemplate.opsForValue().set(key, inviteInfoInDb);
+ return inviteInfoInDb;
+ }
}
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 cf8bdd2..f2653f7 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
@@ -158,10 +158,7 @@
}
}
}
- String streamId = null;
- if (mediaServerItem.isRtpEnable()) {
- streamId = String.format("%s_%s", device.getDeviceId(), channelId);
- }
+ String streamId = String.format("%s_%s", device.getDeviceId(), channelId);;
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, ssrc, 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);
@@ -457,16 +454,13 @@
logger.warn("[褰曞儚鍥炴斁] 鍗曠鍙f敹娴佹椂涓嶆敮鎸乀CP涓诲姩鏂瑰紡鏀舵祦 deviceId: {},channelId:{}", deviceId, channelId);
throw new ControllerException(ErrorCode.ERROR100.getCode(), "鍗曠鍙f敹娴佹椂涓嶆敮鎸乀CP涓诲姩鏂瑰紡鏀舵祦");
}
- String stream = null;
- if (newMediaServerItem.isRtpEnable()) {
- String startTimeStr = startTime.replace("-", "")
- .replace(":", "")
- .replace(" ", "");
- String endTimeTimeStr = endTime.replace("-", "")
- .replace(":", "")
- .replace(" ", "");
- stream = deviceId + "_" + channelId + "_" + startTimeStr + "_" + endTimeTimeStr;
- }
+ String startTimeStr = startTime.replace("-", "")
+ .replace(":", "")
+ .replace(" ", "");
+ String endTimeTimeStr = endTime.replace("-", "")
+ .replace(":", "")
+ .replace(" ", "");
+ String stream = deviceId + "_" + channelId + "_" + startTimeStr + "_" + endTimeTimeStr;
SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, stream, null, device.isSsrcCheck(), true, 0, false, device.getStreamModeForParam());
playBack(newMediaServerItem, ssrcInfo, deviceId, channelId, startTime, endTime, callback);
}
@@ -628,44 +622,13 @@
if (ssrcInResponse != null) {
// 鍗曠鍙�
// 閲嶆柊璁㈤槄娴佷笂绾�
- HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp",
- ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
- subscribe.removeSubscribe(hookSubscribe);
SsrcTransaction ssrcTransaction = streamSession.getSsrcTransaction(inviteInfo.getDeviceId(),
inviteInfo.getChannelId(), null, inviteInfo.getStream());
streamSession.remove(inviteInfo.getDeviceId(),
inviteInfo.getChannelId(), inviteInfo.getStream());
-
- String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase();
- hookSubscribe.getContent().put("stream", stream);
-
- inviteStreamService.updateInviteInfoForStream(inviteInfo, stream);
+ inviteStreamService.updateInviteInfoForSSRC(inviteInfo, ssrcInResponse);
streamSession.put(device.getDeviceId(), channelId, ssrcTransaction.getCallId(),
- stream, ssrcInResponse, mediaServerItem.getId(), (SIPResponse) responseEvent.getResponse(), inviteSessionType);
- subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> {
- logger.info("[Invite 200OK] ssrc淇鍚庢敹鍒拌闃呮秷鎭細 " + hookParam);
- dynamicTask.stop(timeOutTaskKey);
- subscribe.removeSubscribe(hookSubscribe);
- // hook鍝嶅簲
- 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);
- inviteStreamService.call(inviteSessionType, 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);
- inviteStreamService.call(inviteSessionType, device.getDeviceId(), channelId, null,
- InviteErrorCode.SUCCESS.getCode(),
- InviteErrorCode.SUCCESS.getMsg(),
- streamInfo);
- if (inviteSessionType == InviteSessionType.PLAY) {
- snapOnPlay(mediaServerItemInUse, device.getDeviceId(), channelId, stream);
- }
- });
+ inviteInfo.getStream(), ssrcInResponse, mediaServerItem.getId(), (SIPResponse) responseEvent.getResponse(), inviteSessionType);
}
}
}
--
Gitblit v1.8.0