From 667a85c2a1b9952c9160017c8cd7acf44ee9521b Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Thu, 21 May 2026 14:07:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84SSRC=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E6=94=AF=E6=8C=81=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?MediaServer=E5=8A=A8=E6=80=81=E8=8E=B7=E5=8F=96SSRC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gb28181/service/impl/PlayServiceImpl.java | 2 +- .../iot/vmp/gb28181/session/SSRCFactory.java | 14 ++-- .../iot/vmp/service/bean/RTPServerParam.java | 6 +- .../service/impl/RtpServerServiceImpl.java | 65 ++++++------------- web/src/views/common/jessibuca.vue | 3 +- web/src/views/dialog/devicePlayer.vue | 1 + 6 files changed, 36 insertions(+), 55 deletions(-) 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 96baea363..221b1c630 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 @@ -481,7 +481,7 @@ public class PlayServiceImpl implements IPlayService { private void talk(MediaServer mediaServerItem, Device device, DeviceChannel channel, String stream, SipSubscribe.Event errorEvent, Runnable timeoutCallback, AudioBroadcastEvent audioEvent) { - String ySsrc = ssrcFactory.getPlaySsrc(mediaServerItem.getId()); + String ySsrc = ssrcFactory.getPlaySsrc(mediaServerItem); if (ySsrc == null) { audioEvent.call("ssrc已经用尽"); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java index 29556da2d..df932de70 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java @@ -63,12 +63,18 @@ public class SSRCFactory { return suffix != null ? "1" + suffix : null; } - public String getPlaySsrcRandom() { - return "0" + domainPart + String.format("%04d", ThreadLocalRandom.current().nextInt(10000)); + public String getPlaySsrc(MediaServer mediaServer) { + if (mediaServer.isRtpEnable() && userSetting.getSsrcRandom()) { + return "0" + domainPart + String.format("%04d", ThreadLocalRandom.current().nextInt(10000)); + } + return getPlaySsrc(mediaServer.getId()); } - public String getPlayBackSsrcRandom() { - return "1" + domainPart + String.format("%04d", ThreadLocalRandom.current().nextInt(10000)); + public String getPlayBackSsrc(MediaServer mediaServer) { + if (mediaServer.isRtpEnable() && userSetting.getSsrcRandom()) { + return "1" + domainPart + String.format("%04d", ThreadLocalRandom.current().nextInt(10000)); + } + return getPlayBackSsrc(mediaServer.getId()); } private String allocate(String mediaServerId) { diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/RTPServerParam.java b/src/main/java/com/genersoft/iot/vmp/service/bean/RTPServerParam.java index 0868ccef5..7610827d0 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/RTPServerParam.java +++ b/src/main/java/com/genersoft/iot/vmp/service/bean/RTPServerParam.java @@ -18,11 +18,11 @@ public class RTPServerParam { private String app; private String streamId; /** - * 传递给zlm创建rtp server的streamId,不填则使用streamId + * 是否将ssrc传递给zlm做校验 */ - private String zlmStreamId; + private boolean ssrcCheck; /** - * 开启rtpServer时使用的ssrc,开启rtpServer时会根据这个ssrc进行校验,如果不填则不校验 + * 开启rtpServer时使用的ssrc */ private Long ssrc; private Integer port; 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 342b29d08..0cea80eb2 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 @@ -90,10 +90,8 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { final String ssrc; if (presetSSRC != null) { ssrc = presetSSRC; - } else if (mediaServer.isRtpEnable() && userSetting.getSsrcRandom()) { - ssrc = playback ? ssrcFactory.getPlayBackSsrcRandom() : ssrcFactory.getPlaySsrcRandom(); } else { - ssrc = playback ? ssrcFactory.getPlayBackSsrc(mediaServer.getId()) : ssrcFactory.getPlaySsrc(mediaServer.getId()); + ssrc = playback ? ssrcFactory.getPlayBackSsrc(mediaServer) : ssrcFactory.getPlaySsrc(mediaServer); } if (streamId == null) { streamId = String.format("%08x", Long.parseLong(ssrc)).toUpperCase(); @@ -104,7 +102,8 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { } SSRCInfo ssrcInfo = new SSRCInfo(0, ssrc, MediaStreamUtil.RTP_APP, streamId); - RTPServerParam rtpServerParam = new RTPServerParam(mediaServer, MediaStreamUtil.RTP_APP, streamId, ssrcCheck ? Long.parseLong(ssrc): 0L, null, onlyAuto, disableAuto, false, tcpMode); + RTPServerParam rtpServerParam = new RTPServerParam(mediaServer, MediaStreamUtil.RTP_APP, streamId, Long.parseLong(ssrc), null, onlyAuto, disableAuto, false, tcpMode); + rtpServerParam.setSsrcCheck(ssrcCheck); int rtpServerPort = openCommonRTPServer(rtpServerParam, ((code, msg, data) -> { if (code == InviteErrorCode.SUCCESS.getCode()) { OpenRTPServerResult openRTPServerResult = new OpenRTPServerResult(); @@ -137,10 +136,8 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { final String ssrc; if (presetSSRC != null) { ssrc = presetSSRC; - } else if (mediaServer.isRtpEnable() && userSetting.getSsrcRandom()) { - ssrc = ssrcFactory.getPlaySsrcRandom(); } else { - ssrc = ssrcFactory.getPlaySsrc(mediaServer.getId()); + ssrc = ssrcFactory.getPlaySsrc(mediaServer); } String streamId = String.format("%08x", Long.parseLong(ssrc)).toUpperCase(); @@ -149,14 +146,11 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { int tcpMode = device.getStreamMode().equals("TCP-ACTIVE")? 2: (device.getStreamMode().equals("TCP-PASSIVE")? 1:0); if (device.isSsrcCheck() && tcpMode > 0) { - // 目前zlm不支持 tcp模式更新ssrc,暂时关闭ssrc校验 log.warn("[开启国标点播RTP收流] 平台对接时下级可能自定义ssrc,但是tcp模式zlm收流目前无法更新ssrc,可能收流超时,此时请使用udp收流或者关闭ssrc校验"); } - Long checkSsrc = device.isSsrcCheck() ? Long.parseLong(ssrc) : 0L; - SSRCInfo ssrcInfo = new SSRCInfo(0, ssrc, MediaStreamUtil.RTP_APP, streamReplace); - openRtpServer(mediaServer, ssrcInfo, checkSsrc, !channel.isHasAudio(), false, tcpMode, callback, streamId); + openRtpServer(mediaServer, ssrcInfo, Long.parseLong(ssrc), !channel.isHasAudio(), false, tcpMode, callback, device.isSsrcCheck()); addAuthenticateInfo(streamId, streamReplace, channel.isHasAudio(), record, null); return ssrcInfo; } @@ -174,12 +168,7 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { } // 获取 mediaServer 可用的 ssrc - String ssrc; - if (mediaServer.isRtpEnable() && userSetting.getSsrcRandom()) { - ssrc = ssrcFactory.getPlayBackSsrcRandom(); - } else { - ssrc = ssrcFactory.getPlayBackSsrc(mediaServer.getId()); - } + String ssrc = ssrcFactory.getPlayBackSsrc(mediaServer); String streamId = String.format("%08x", Long.parseLong(ssrc)).toUpperCase(); String streamReplace = getPlaybackStream(device, channel, startTime, endTime); @@ -187,14 +176,11 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { int tcpMode = device.getStreamMode().equals("TCP-ACTIVE")? 2: (device.getStreamMode().equals("TCP-PASSIVE")? 1:0); if (device.isSsrcCheck() && tcpMode > 0) { - // 目前zlm不支持 tcp模式更新ssrc,暂时关闭ssrc校验 log.warn("[开启国标回放RTP收流] 平台对接时下级可能自定义ssrc,但是tcp模式zlm收流目前无法更新ssrc,可能收流超时,此时请使用udp收流或者关闭ssrc校验"); } - Long checkSsrc = device.isSsrcCheck() ? Long.parseLong(ssrc) : 0L; - SSRCInfo ssrcInfo = new SSRCInfo(0, ssrc, MediaStreamUtil.RTP_APP, streamReplace); - openRtpServer(mediaServer, ssrcInfo, checkSsrc, !channel.isHasAudio(), false, tcpMode, callback, streamId); + openRtpServer(mediaServer, ssrcInfo, Long.parseLong(ssrc), !channel.isHasAudio(), false, tcpMode, callback, device.isSsrcCheck()); addAuthenticateInfo(streamId, streamReplace, channel.isHasAudio(), false,null); return ssrcInfo; } @@ -226,12 +212,7 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { int tcpMode = device.getStreamMode().equals("TCP-ACTIVE")? 2: (device.getStreamMode().equals("TCP-PASSIVE")? 1:0); // 获取 mediaServer 可用的 ssrc - String ssrc; - if (mediaServer.isRtpEnable() && userSetting.getSsrcRandom()) { - ssrc = ssrcFactory.getPlayBackSsrcRandom(); - } else { - ssrc = ssrcFactory.getPlayBackSsrc(mediaServer.getId()); - } + String ssrc = ssrcFactory.getPlayBackSsrc(mediaServer); String streamId = String.format("%08x", Long.parseLong(ssrc)).toUpperCase(); String streamReplace = String.format("%s_%s_%s_%s", device.getDeviceId(), channel.getDeviceId(), @@ -239,14 +220,11 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { endTime.replace("-", "").replace(":", "").replace(" ", "")); if (device.isSsrcCheck() && tcpMode > 0) { - // 目前zlm不支持 tcp模式更新ssrc,暂时关闭ssrc校验 log.warn("[开启国标录像下载RTP收流] 平台对接时下级可能自定义ssrc,但是tcp模式zlm收流目前无法更新ssrc,可能收流超时,此时请使用udp收流或者关闭ssrc校验"); } - Long checkSsrc = device.isSsrcCheck() ? Long.parseLong(ssrc) : 0L; - SSRCInfo ssrcInfo = new SSRCInfo(0, ssrc, MediaStreamUtil.RTP_APP, streamReplace); - openRtpServer(mediaServer, ssrcInfo, checkSsrc, !channel.isHasAudio(), false, tcpMode, callback, streamId); + openRtpServer(mediaServer, ssrcInfo, Long.parseLong(ssrc), !channel.isHasAudio(), false, tcpMode, callback, device.isSsrcCheck()); long difference = DateUtil.getDifference(startTime, endTime) / 1000; @@ -281,28 +259,23 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { } // 获取 mediaServer 可用的 ssrc - String ssrc; - if (mediaServer.isRtpEnable() && userSetting.getSsrcRandom()) { - ssrc = ssrcFactory.getPlaySsrcRandom(); - } else { - ssrc = ssrcFactory.getPlaySsrc(mediaServer.getId()); - } + String ssrc = ssrcFactory.getPlaySsrc(mediaServer); SSRCInfo ssrcInfo = new SSRCInfo(0, ssrc, MediaStreamUtil.RTP_APP, streamId); - openRtpServer(mediaServer, ssrcInfo, 0L, false, true, tcpMode, callback); + openRtpServer(mediaServer, ssrcInfo, Long.parseLong(ssrc), false, true, tcpMode, callback, false); return ssrcInfo; } private void openRtpServer(MediaServer mediaServer, SSRCInfo ssrcInfo, Long checkSsrc, boolean disableAuto, boolean onlyAuto, int tcpMode, ErrorCallback callback) { - openRtpServer(mediaServer, ssrcInfo, checkSsrc, disableAuto, onlyAuto, tcpMode, callback, null); + openRtpServer(mediaServer, ssrcInfo, checkSsrc, disableAuto, onlyAuto, tcpMode, callback, false); } private void openRtpServer(MediaServer mediaServer, SSRCInfo ssrcInfo, Long checkSsrc, boolean disableAuto, boolean onlyAuto, int tcpMode, - ErrorCallback callback, String zlmStreamId) { + ErrorCallback callback, boolean ssrcCheck) { RTPServerParam rtpServerParam = new RTPServerParam(mediaServer, MediaStreamUtil.RTP_APP, ssrcInfo.getStream(), checkSsrc, null, onlyAuto, disableAuto, false, tcpMode); - rtpServerParam.setZlmStreamId(zlmStreamId); + rtpServerParam.setSsrcCheck(ssrcCheck); int rtpServerPort = openCommonRTPServer(rtpServerParam, ((code, msg, data) -> { if (code == InviteErrorCode.SUCCESS.getCode()) { OpenRTPServerResult openRTPServerResult = new OpenRTPServerResult(); @@ -336,7 +309,9 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { dynamicTask.startDelay(timeOutTaskKey, () -> { // 收流超时 // 关闭收流端口 - mediaServerService.closeRTPServer(rtpServerParam.getMediaServer(), rtpServerParam.getApp(), rtpServerParam.getStreamId()); + String closeStreamId = rtpServerParam.getMediaServer().isRtpEnable() + ? String.format("%08x", rtpServerParam.getSsrc()) : rtpServerParam.getStreamId(); + mediaServerService.closeRTPServer(rtpServerParam.getMediaServer(), rtpServerParam.getApp(), closeStreamId); subscribe.removeSubscribe(rtpHook); callback.run(InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); }, userSetting.getPlayTimeout()); @@ -350,9 +325,9 @@ public class RtpServerServiceImpl implements IReceiveRtpServerService { int rtpServerPort; if (rtpServerParam.getMediaServer().isRtpEnable()) { - String effectiveStreamId = rtpServerParam.getZlmStreamId() != null ? rtpServerParam.getZlmStreamId() : rtpServerParam.getStreamId(); - rtpServerPort = mediaServerService.createRTPServer(rtpServerParam.getMediaServer(), rtpServerParam.getApp(), effectiveStreamId, - Objects.requireNonNullElse(rtpServerParam.getSsrc(), 0L), rtpServerParam.getPort(), rtpServerParam.isOnlyAuto(), + String zlmStreamId = String.format("%08x", rtpServerParam.getSsrc()); + Long checkSsrc = rtpServerParam.isSsrcCheck() ? rtpServerParam.getSsrc() : 0L; + rtpServerPort = mediaServerService.createRTPServer(rtpServerParam.getMediaServer(), rtpServerParam.getApp(), zlmStreamId, checkSsrc, rtpServerParam.getPort(), rtpServerParam.isOnlyAuto(), rtpServerParam.isDisableAudio(), rtpServerParam.isReUsePort(), rtpServerParam.getTcpMode()); } else { rtpServerPort = rtpServerParam.getMediaServer().getRtpProxyPort(); diff --git a/web/src/views/common/jessibuca.vue b/web/src/views/common/jessibuca.vue index 5c5cb6396..53e048916 100755 --- a/web/src/views/common/jessibuca.vue +++ b/web/src/views/common/jessibuca.vue @@ -4,8 +4,7 @@ style="width:100%; height: 100%; background-color: #000000;margin:0 auto;position: relative;" @dblclick="fullscreenSwich" > -
-
+
diff --git a/web/src/views/dialog/devicePlayer.vue b/web/src/views/dialog/devicePlayer.vue index 2d71656cd..f65d67e28 100755 --- a/web/src/views/dialog/devicePlayer.vue +++ b/web/src/views/dialog/devicePlayer.vue @@ -29,6 +29,7 @@ :error="videoError" :message="videoError" :has-audio="hasAudio" + :show-button="true" fluent autoplay live