From 75c38d6c9abd1bb441f3a23c7f998c97f9245346 Mon Sep 17 00:00:00 2001 From: gerrit Date: Tue, 26 May 2026 11:35:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BA=A7=E8=81=94=E7=82=B9=E6=92=AD?= =?UTF-8?q?=E4=B8=8B=E7=BA=A7=E8=87=AA=E5=AE=9A=E4=B9=89SSRC=E5=90=8E?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=88=B7=E6=96=B0RTP=E9=89=B4=E6=9D=83key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当 use-custom-ssrc-for-parent-invite=true 时,下级平台可在 200 OK SDP 中返回自定义 SSRC。此前仅在开收流时按原始 SSRC 写入一次 Redis 鉴权 key,导致 ZLM on_publish 以实际 SSRC 查 Redis 时鉴权失败。 新增 IReceiveRtpServerService.refreshAuthenticateInfo(),在 PlayServiceImpl.InviteOKHandler 解析出最终 SSRC 后,如与原始值不 一致,先刷新 Redis 鉴权 key,再继续现有 SSRC 更新流程。覆盖点播、 回放、下载三种场景。 Co-Authored-By: Claude Opus 4.7 --- .../gb28181/service/impl/PlayServiceImpl.java | 3 +++ .../vmp/service/IReceiveRtpServerService.java | 2 ++ .../vmp/service/impl/RtpServerServiceImpl.java | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java index 221b1c630..47af047e9 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java @@ -859,6 +859,9 @@ public class PlayServiceImpl implements IPlayService { } }else { log.info("[Invite 200OK] 收到invite 200, 发现下级自定义了ssrc: {}", ssrcInResponse); + String oldStreamId = String.format("%08x", Long.parseLong(ssrcInfo.getSsrc())).toUpperCase(); + String newStreamId = String.format("%08x", Long.parseLong(ssrcInResponse)).toUpperCase(); + receiveRtpServerService.refreshAuthenticateInfo(oldStreamId, newStreamId); // ssrc 不一致 if (mediaServerItem.isRtpEnable()) { // 多端口 diff --git a/src/main/java/com/genersoft/iot/vmp/service/IReceiveRtpServerService.java b/src/main/java/com/genersoft/iot/vmp/service/IReceiveRtpServerService.java index b8e7cab30..8819ff1ff 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IReceiveRtpServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IReceiveRtpServerService.java @@ -39,4 +39,6 @@ public interface IReceiveRtpServerService { void addAuthenticateInfo(String streamId, String streamReplace, Boolean enableAudio, Boolean enableMp4, Integer mp4MaxSecond); ResultForOnPublish getAuthenticateInfo(String streamId); + + void refreshAuthenticateInfo(String oldStreamId, String newStreamId); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/RtpServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/RtpServerServiceImpl.java index 7a5030b6f..8c4aa0cf2 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/RtpServerServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/RtpServerServiceImpl.java @@ -406,4 +406,22 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { } return null; } + + @Override + public void refreshAuthenticateInfo(String oldStreamId, String newStreamId) { + if (oldStreamId == null || newStreamId == null || oldStreamId.equals(newStreamId)) { + return; + } + String oldKey = String.format("%s:%s", VideoManagerConstants.RTP_AUTHENTICATE, oldStreamId); + Object obj = redisTemplate.opsForValue().get(oldKey); + if (obj instanceof ResultForOnPublish) { + String newKey = String.format("%s:%s", VideoManagerConstants.RTP_AUTHENTICATE, newStreamId); + redisTemplate.opsForValue().set(newKey, obj); + redisTemplate.expire(newKey, 60, TimeUnit.SECONDS); + redisTemplate.delete(oldKey); + log.info("[刷新RTP鉴权信息] {} -> {}", oldStreamId, newStreamId); + } else { + log.warn("[刷新RTP鉴权信息] 未找到旧key: {}", oldKey); + } + } }