From 5bcdf5dfb6829fd27116cab6032ccfa30ec7a79e Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Thu, 3 Jul 2025 15:28:47 +0800 Subject: [PATCH] =?UTF-8?q?[abl]=20=E5=90=88=E5=B9=B6=E4=B8=BB=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gb28181/service/impl/PlayServiceImpl.java | 18 +--- .../vmp/media/abl/ABLHttpHookListener.java | 13 +-- .../media/abl/ABLMediaNodeServerService.java | 91 +++++++++++++------ .../media/abl/ABLMediaServerStatusManger.java | 20 ++-- .../media/service/IMediaServerService.java | 2 +- .../media/zlm/ZLMMediaNodeServerService.java | 6 +- src/main/resources/application.yml | 2 +- 7 files changed, 83 insertions(+), 69 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 46a4fb32d..fe4ba4dc7 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 @@ -684,17 +684,11 @@ public class PlayServiceImpl implements IPlayService { * @param stream ssrc */ private void snapOnPlay(MediaServer mediaServerItemInuse, String deviceId, String channelId, String stream) { - String streamUrl; - if (mediaServerItemInuse.getRtspPort() != 0) { - streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServerItemInuse.getRtspPort(), "rtp", stream); - } else { - streamUrl = String.format("http://127.0.0.1:%s/%s/%s.live.mp4", mediaServerItemInuse.getHttpPort(), "rtp", stream); - } String path = "snap"; String fileName = deviceId + "_" + channelId + ".jpg"; // 请求截图 log.info("[请求截图]: " + fileName); - mediaServerService.getSnap(mediaServerItemInuse, streamUrl, 15, 1, path, fileName); + mediaServerService.getSnap(mediaServerItemInuse, "rtp", stream, 15, 1, path, fileName); } public StreamInfo onPublishHandlerForPlay(MediaServer mediaServerItem, MediaInfo mediaInfo, Device device, DeviceChannel channel) { @@ -1617,17 +1611,11 @@ public class PlayServiceImpl implements IPlayService { if (inviteInfo != null) { if (inviteInfo.getStreamInfo() != null) { // 已存在线直接截图 - MediaServer mediaServerItemInuse = inviteInfo.getStreamInfo().getMediaServer(); - String streamUrl; - if (mediaServerItemInuse.getRtspPort() != 0) { - streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServerItemInuse.getRtspPort(), "rtp", inviteInfo.getStreamInfo().getStream()); - }else { - streamUrl = String.format("http://127.0.0.1:%s/%s/%s.live.mp4", mediaServerItemInuse.getHttpPort(), "rtp", inviteInfo.getStreamInfo().getStream()); - } + MediaServer mediaServer = inviteInfo.getStreamInfo().getMediaServer(); String path = "snap"; // 请求截图 log.info("[请求截图]: " + fileName); - mediaServerService.getSnap(mediaServerItemInuse, streamUrl, 15, 1, path, fileName); + mediaServerService.getSnap(mediaServer, "rtp", inviteInfo.getStreamInfo().getStream(), 15, 1, path, fileName); File snapFile = new File(path + File.separator + fileName); if (snapFile.exists()) { errorCallback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), snapFile.getAbsoluteFile()); diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLHttpHookListener.java index c281e9d25..b1fb6f6fc 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLHttpHookListener.java @@ -3,9 +3,11 @@ package com.genersoft.iot.vmp.media.abl; import com.alibaba.fastjson2.JSONObject; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.gb28181.service.IDeviceService; +import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService; +import com.genersoft.iot.vmp.gb28181.service.IPlayService; import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; import com.genersoft.iot.vmp.gb28181.session.SSRCFactory; -import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.media.abl.bean.hook.*; import com.genersoft.iot.vmp.media.abl.event.HookAblServerKeepaliveEvent; @@ -18,7 +20,6 @@ import com.genersoft.iot.vmp.media.zlm.dto.hook.HookResult; import com.genersoft.iot.vmp.media.zlm.dto.hook.HookResultForOnPublish; import com.genersoft.iot.vmp.service.*; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -54,9 +55,6 @@ public class ABLHttpHookListener { @Autowired private IPlayService playService; - @Autowired - private IVideoManagerStorage storager; - @Autowired private IRedisCatchStorage redisCatchStorage; @@ -77,9 +75,6 @@ public class ABLHttpHookListener { @Autowired private UserSetting userSetting; - @Autowired - private VideoStreamSessionManager sessionManager; - @Autowired private SSRCFactory ssrcFactory; @@ -272,7 +267,7 @@ public class ABLHttpHookListener { logger.info("[ABL HOOK] 流未找到:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream()); MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId()); - if (!userSetting.isAutoApplyPlay() || mediaServer == null) { + if (!userSetting.getAutoApplyPlay() || mediaServer == null) { return HookResult.SUCCESS(); } MediaNotFoundEvent mediaNotFoundEvent = MediaNotFoundEvent.getInstance(this, param, mediaServer); diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java index 7f75df4f6..e53b88e20 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java @@ -8,7 +8,8 @@ import com.genersoft.iot.vmp.common.InviteSessionType; import com.genersoft.iot.vmp.common.StreamInfo; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.conf.UserSetting; -import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; +import com.genersoft.iot.vmp.gb28181.bean.SendRtpInfo; +import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService; import com.genersoft.iot.vmp.media.abl.bean.AblServerConfig; import com.genersoft.iot.vmp.media.abl.bean.hook.OnStreamArriveABLHookParam; import com.genersoft.iot.vmp.media.bean.MediaInfo; @@ -17,10 +18,10 @@ import com.genersoft.iot.vmp.media.event.media.MediaDepartureEvent; import com.genersoft.iot.vmp.media.event.media.MediaRecordMp4Event; import com.genersoft.iot.vmp.media.event.media.MediaRecordProcessEvent; import com.genersoft.iot.vmp.media.service.IMediaNodeServerService; -import com.genersoft.iot.vmp.service.IInviteStreamService; import com.genersoft.iot.vmp.service.bean.CloudRecordItem; import com.genersoft.iot.vmp.service.bean.DownloadFileInfo; import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper; +import com.genersoft.iot.vmp.streamProxy.bean.StreamProxy; import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import org.slf4j.Logger; @@ -30,10 +31,7 @@ import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Service("abl") public class ABLMediaNodeServerService implements IMediaNodeServerService { @@ -183,7 +181,7 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { streamInfoResult.setApp(app); String addr = mediaServer.getStreamIp(); streamInfoResult.setIp(addr); - streamInfoResult.setMediaServerId(mediaServer.getId()); + streamInfoResult.setMediaServer(mediaServer); String callIdParam = ObjectUtils.isEmpty(callId)?"":"?callId=" + callId; streamInfoResult.setRtmp(addr, mediaServer.getRtmpPort(),mediaServer.getRtmpSSlPort(), app, stream, callIdParam); streamInfoResult.setRtsp(addr, mediaServer.getRtspPort(),mediaServer.getRtspSSLPort(), app, stream, callIdParam); @@ -207,8 +205,8 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { } @Override - public void getSnap(MediaServer mediaServerItem, String app, String stream, int timeoutSec, int expireSec, String path, String fileName) { - ablresTfulUtils.getSnap(mediaServerItem, app, stream, timeoutSec, path, fileName); + public void getSnap(MediaServer mediaServer, String app, String stream, int timeoutSec, int expireSec, String path, String fileName) { + ablresTfulUtils.getSnap(mediaServer, app, stream, timeoutSec, path, fileName); } @Override @@ -258,12 +256,6 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { return null; } - @Override - public WVPResult addStreamProxy(MediaServer mediaServer, String app, String stream, String url, boolean enableAudio, boolean enableMp4, String rtpType) { - logger.warn("[abl-addStreamProxy] 未实现"); - return null; - } - @Override public Boolean delFFmpegSource(MediaServer mediaServer, String streamKey) { logger.warn("[abl-delFFmpegSource] 未实现"); @@ -282,16 +274,6 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { return null; } - @Override - public void startSendRtpPassive(MediaServer mediaServer, SendRtpItem sendRtpItem, Integer timeout) { - logger.warn("[abl-startSendRtpPassive] 未实现"); - } - - @Override - public void startSendRtpStream(MediaServer mediaServer, SendRtpItem sendRtpItem) { - logger.warn("[abl-startSendRtpStream] 未实现"); - } - // 接受进度通知 @EventListener public void onApplicationEvent(MediaRecordProcessEvent event) { @@ -307,11 +289,12 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { } @EventListener public void onApplicationEvent(MediaRecordMp4Event event) { - InviteInfo inviteInfo = inviteStreamService.getInviteInfo(InviteSessionType.DOWNLOAD, null, null, event.getStream()); + InviteInfo inviteInfo = inviteStreamService.getInviteInfo(InviteSessionType.DOWNLOAD, null, event.getStream()); if (inviteInfo == null || inviteInfo.getStreamInfo() == null) { return; } - List cloudRecordItemList = cloudRecordServiceMapper.getList(null, event.getApp(), event.getStream(), null, null, null, null, null); + List cloudRecordItemList = cloudRecordServiceMapper.getList(null, event.getApp(), event.getStream(), + null, null, null, null, null, null); if (cloudRecordItemList.isEmpty()) { return; } @@ -337,14 +320,62 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { @Override public Long updateDownloadProcess(MediaServer mediaServer, String app, String stream) { - List list = cloudRecordServiceMapper.getList(null, app, stream, null, null, null, null, null); + List list = cloudRecordServiceMapper.getList(null, app, stream, null, + null, null, null, null, null); if (list.isEmpty()) { return null; } - Long downloadProcess = 0L; + long downloadProcess = 0L; for (CloudRecordItem cloudRecordItem : list) { - downloadProcess += cloudRecordItem.getTimeLen(); + downloadProcess += (long) cloudRecordItem.getTimeLen(); } return downloadProcess; } + + @Override + public WVPResult addStreamProxy(MediaServer mediaServer, String app, String stream, String url, boolean enableAudio, boolean enableMp4, String rtpType, Integer timeout) { + logger.warn("[abl-addStreamProxy] 未实现"); + return null; + } + + @Override + public Integer startSendRtpPassive(MediaServer mediaServer, SendRtpInfo sendRtpItem, Integer timeout) { + logger.warn("[abl-startSendRtpPassive] 未实现"); + return 0; + } + + @Override + public void startSendRtpStream(MediaServer mediaServer, SendRtpInfo sendRtpItem) { + logger.warn("[abl-startSendRtpStream] 未实现"); + } + + @Override + public void startProxy(MediaServer mediaServer, StreamProxy streamProxy) { + logger.warn("[abl-startProxy] 未实现"); + } + + @Override + public void stopProxy(MediaServer mediaServer, String streamKey) { + logger.warn("[abl-stopProxy] 未实现"); + } + + @Override + public List listRtpServer(MediaServer mediaServer) { + return Collections.emptyList(); + } + + @Override + public void loadMP4File(MediaServer mediaServer, String app, String stream, String datePath) { + logger.warn("[abl-loadMP4File] 未实现"); + } + + @Override + public void seekRecordStamp(MediaServer mediaServer, String app, String stream, Double stamp, String schema) { + logger.warn("[abl-seekRecordStamp] 未实现"); + } + + @Override + public void setRecordSpeed(MediaServer mediaServer, String app, String stream, Integer speed, String schema) { + logger.warn("[abl-setRecordSpeed] 未实现"); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java index 067c9e587..c2978090f 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java @@ -64,13 +64,13 @@ public class ABLMediaServerStatusManger { || event.getMediaServerItemList().isEmpty()) { return; } - for (MediaServer mediaServerItem : event.getMediaServerItemList()) { - if (!type.equals(mediaServerItem.getType())) { + for (MediaServer mediaServer : event.getMediaServerItemList()) { + if (!type.equals(mediaServer.getType())) { continue; } - logger.info("[ABL-添加待上线节点] ID:" + mediaServerItem.getId()); - offlineABLPrimaryMap.put(mediaServerItem.getId(), mediaServerItem); - offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis()); + logger.info("[ABL-添加待上线节点] ID:" + mediaServer.getId()); + offlineABLPrimaryMap.put(mediaServer.getId(), mediaServer); + offlineAblTimeMap.put(mediaServer.getId(), System.currentTimeMillis()); } execute(); } @@ -108,13 +108,13 @@ public class ABLMediaServerStatusManger { @Async("taskExecutor") @EventListener public void onApplicationEvent(MediaServerDeleteEvent event) { - if (event.getMediaServerId() == null) { + if (event.getMediaServer() == null) { return; } - logger.info("[ABL-节点被移除] ID:" + event.getMediaServerId()); - offlineABLPrimaryMap.remove(event.getMediaServerId()); - offlineAblsecondaryMap.remove(event.getMediaServerId()); - offlineAblTimeMap.remove(event.getMediaServerId()); + logger.info("[ABL-节点被移除] ID:" + event.getMediaServer().getServerId()); + offlineABLPrimaryMap.remove(event.getMediaServer().getServerId()); + offlineAblsecondaryMap.remove(event.getMediaServer().getServerId()); + offlineAblTimeMap.remove(event.getMediaServer().getServerId()); } @Scheduled(fixedDelay = 10*1000) //每隔10秒检查一次 diff --git a/src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java b/src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java index 0efee177a..0fe2aa513 100755 --- a/src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/media/service/IMediaServerService.java @@ -85,7 +85,7 @@ public interface IMediaServerService { Boolean connectRtpServer(MediaServer mediaServerItem, String address, int port, String stream); - void getSnap(MediaServer mediaServerItemInuse, String app, String stream, int timeoutSec, int expireSec, String path, String fileName); + void getSnap(MediaServer mediaServer, String app, String stream, int timeoutSec, int expireSec, String path, String fileName); MediaInfo getMediaInfo(MediaServer mediaServerItem, String app, String stream); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java index 45b2b8b3d..c094b4882 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java @@ -253,9 +253,9 @@ public class ZLMMediaNodeServerService implements IMediaNodeServerService { public void getSnap(MediaServer mediaServer, String app, String stream, int timeoutSec, int expireSec, String path, String fileName) { String streamUrl; if (mediaServer.getRtspPort() != 0) { - streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServer.getRtspPort(), app, stream); - }else { - streamUrl = String.format("http://127.0.0.1:%s/%s/%s.live.mp4", mediaServer.getHttpPort(), app, stream); + streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServer.getRtspPort(), "rtp", stream); + } else { + streamUrl = String.format("http://127.0.0.1:%s/%s/%s.live.mp4", mediaServer.getHttpPort(), "rtp", stream); } zlmresTfulUtils.getSnap(mediaServer, streamUrl, timeoutSec, expireSec, path, fileName); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 67213e8a3..e517a764e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,4 +2,4 @@ spring: application: name: wvp profiles: - active: 274-dev + active: 274-plus