[abl] 合并主线

This commit is contained in:
lin
2025-07-03 15:28:47 +08:00
parent bab5534134
commit 5bcdf5dfb6
7 changed files with 83 additions and 69 deletions

View File

@@ -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());

View File

@@ -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);

View File

@@ -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<String> 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<CloudRecordItem> cloudRecordItemList = cloudRecordServiceMapper.getList(null, event.getApp(), event.getStream(), null, null, null, null, null);
List<CloudRecordItem> 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<CloudRecordItem> list = cloudRecordServiceMapper.getList(null, app, stream, null, null, null, null, null);
List<CloudRecordItem> 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<String> 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<String> 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] 未实现");
}
}

View File

@@ -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秒检查一次

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -2,4 +2,4 @@ spring:
application:
name: wvp
profiles:
active: 274-dev
active: 274-plus