恢复abl实现
parent
7ed84bed7f
commit
5457407601
|
@ -0,0 +1,413 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.genersoft.iot.vmp.conf.UserSetting;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
|
||||||
|
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.callback.DeferredResultHolder;
|
||||||
|
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;
|
||||||
|
import com.genersoft.iot.vmp.media.abl.event.HookAblServerStartEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
|
import com.genersoft.iot.vmp.media.bean.ResultForOnPublish;
|
||||||
|
import com.genersoft.iot.vmp.media.event.hook.HookSubscribe;
|
||||||
|
import com.genersoft.iot.vmp.media.event.media.MediaArrivalEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.event.media.MediaDepartureEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.event.media.MediaNotFoundEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.event.media.MediaRtpServerTimeoutEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.service.IMediaServerService;
|
||||||
|
import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
|
||||||
|
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;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.context.ApplicationEventPublisher;
|
||||||
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ABL 的hook事件监听
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/index/hook/abl")
|
||||||
|
public class ABLHttpHookListener {
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(ABLHttpHookListener.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ABLRESTfulUtils ablresTfulUtils;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISIPCommanderForPlatform commanderFroPlatform;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AudioBroadcastManager audioBroadcastManager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IPlayService playService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IVideoManagerStorage storager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisCatchStorage redisCatchStorage;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IInviteStreamService inviteStreamService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IDeviceService deviceService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMediaServerService mediaServerService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IStreamProxyService streamProxyService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DeferredResultHolder resultHolder;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMediaService mediaService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private EventPublisher eventPublisher;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ZLMMediaListManager zlmMediaListManager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private HookSubscribe subscribe;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserSetting userSetting;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IUserService userService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ICloudRecordService cloudRecordService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private VideoStreamSessionManager sessionManager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SSRCFactory ssrcFactory;
|
||||||
|
|
||||||
|
@Qualifier("taskExecutor")
|
||||||
|
@Autowired
|
||||||
|
private ThreadPoolTaskExecutor taskExecutor;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisTemplate<Object, Object> redisTemplate;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApplicationEventPublisher applicationEventPublisher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 服务器定时上报时间,上报间隔可配置,默认10s上报一次
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onServerKeepalive(@RequestBody OnServerKeepaliveABLHookParam param) {
|
||||||
|
try {
|
||||||
|
HookAblServerKeepaliveEvent event = new HookAblServerKeepaliveEvent(this);
|
||||||
|
MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
if (mediaServerItem != null) {
|
||||||
|
event.setMediaServerItem(mediaServerItem);
|
||||||
|
applicationEventPublisher.publishEvent(event);
|
||||||
|
}
|
||||||
|
}catch (Exception e) {
|
||||||
|
logger.info("[ZLM-HOOK-心跳] 发送通知失败 ", e);
|
||||||
|
}
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 播放器鉴权事件,rtsp/rtmp/http-flv/ws-flv/hls的播放都将触发此鉴权事件。
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_play", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onPlay(@RequestBody OnPlayABLHookParam param) {
|
||||||
|
|
||||||
|
MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
if (mediaServer == null) {
|
||||||
|
return new HookResultForOnPublish(0, "success");
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, String> paramMap = urlParamToMap(param.getParams());
|
||||||
|
// 对于播放流进行鉴权
|
||||||
|
boolean authenticateResult = mediaService.authenticatePlay(param.getApp(), param.getStream(), paramMap.get("callId"));
|
||||||
|
if (!authenticateResult) {
|
||||||
|
logger.info("[ABL HOOK] 播放鉴权 失败:{}->{}", param.getMediaServerId(), param);
|
||||||
|
ablresTfulUtils.closeStreams(mediaServer, param.getApp(), param.getStream());
|
||||||
|
|
||||||
|
}
|
||||||
|
logger.info("[ABL HOOK] 播放鉴权成功:{}->{}", param.getMediaServerId(), param);
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rtsp/rtmp/rtp推流鉴权事件。
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_publish", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onPublish(@RequestBody OnPublishABLHookParam param) {
|
||||||
|
|
||||||
|
|
||||||
|
logger.info("[ABL HOOK] 推流鉴权:{}->{}", param.getMediaServerId(), param);
|
||||||
|
// TODO 加快处理速度
|
||||||
|
|
||||||
|
MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
if (mediaServer == null) {
|
||||||
|
return new HookResultForOnPublish(0, "success");
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultForOnPublish resultForOnPublish = mediaService.authenticatePublish(mediaServer, param.getApp(), param.getStream(), param.getParams());
|
||||||
|
if (resultForOnPublish == null) {
|
||||||
|
logger.info("[ABL HOOK]推流鉴权 拒绝 响应:{}->{}", param.getMediaServerId(), param);
|
||||||
|
ablresTfulUtils.closeStreams(mediaServer, param.getApp(), param.getStream());
|
||||||
|
}
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果某一个码流进行MP4录像(enable_mp4=1),会触发录像进度通知事件
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_record_progress", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onRecordProgress(@RequestBody OnRecordProgressABLHookParam param) {
|
||||||
|
|
||||||
|
|
||||||
|
logger.info("[ABL HOOK] 录像进度通知:{}->{}/{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream(), param.getCurrentFileDuration(), param.getTotalVideoDuration());
|
||||||
|
|
||||||
|
// TODO 这里用来做录像进度
|
||||||
|
// MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
// if (mediaServer == null) {
|
||||||
|
// return new HookResultForOnPublish(0, "success");
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// ResultForOnPublish resultForOnPublish = mediaService.authenticatePublish(mediaServer, param.getApp(), param.getStream(), param.getParams());
|
||||||
|
// if (resultForOnPublish == null) {
|
||||||
|
// logger.info("[ABL HOOK]推流鉴权 拒绝 响应:{}->{}", param.getMediaServerId(), param);
|
||||||
|
// ablresTfulUtils.closeStreams(mediaServer, param.getApp(), param.getStream());
|
||||||
|
// }
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当代理拉流、国标接入等等 码流不到达时会发出 码流不到达的事件通知
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_stream_not_arrive", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onStreamNotArrive(@RequestBody ABLHookParam param) {
|
||||||
|
|
||||||
|
|
||||||
|
logger.info("[ABL HOOK] 码流不到达通知:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
|
||||||
|
try {
|
||||||
|
if ("rtp".equals(param.getApp())) {
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
MediaRtpServerTimeoutEvent event = new MediaRtpServerTimeoutEvent(this);
|
||||||
|
MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
if (mediaServerItem != null) {
|
||||||
|
event.setMediaServer(mediaServerItem);
|
||||||
|
event.setApp("rtp");
|
||||||
|
applicationEventPublisher.publishEvent(event);
|
||||||
|
}
|
||||||
|
}catch (Exception e) {
|
||||||
|
logger.info("[ABL-HOOK-码流不到达通知] 发送通知失败 ", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 如果某一个码流进行MP4录像(enable_mp4=1),当某个MP4文件被删除会触发该事件通知
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_delete_record_mp4", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onDeleteRecordMp4(@RequestBody OnRecordMp4ABLHookParam param) {
|
||||||
|
|
||||||
|
|
||||||
|
logger.info("[ABL HOOK] MP4文件被删除通知:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
|
||||||
|
|
||||||
|
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rtsp/rtmp流注册或注销时触发此事件;此事件对回复不敏感。
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_stream_arrive", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onStreamArrive(@RequestBody OnStreamArriveABLHookParam param) {
|
||||||
|
|
||||||
|
MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
if (mediaServer == null) {
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info("[ABL HOOK] 码流到达, {}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
|
||||||
|
MediaArrivalEvent mediaArrivalEvent = MediaArrivalEvent.getInstance(this, param, mediaServer);
|
||||||
|
applicationEventPublisher.publishEvent(mediaArrivalEvent);
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流无人观看时事件,用户可以通过此事件选择是否关闭无人看的流。
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_stream_none_reader", produces = "application/json;charset=UTF-8")
|
||||||
|
public JSONObject onStreamNoneReader(@RequestBody ABLHookParam param) {
|
||||||
|
|
||||||
|
logger.info("[ZLM HOOK]流无人观看:{}->{}/{}", param.getMediaServerId(),
|
||||||
|
param.getApp(), param.getStream());
|
||||||
|
JSONObject ret = new JSONObject();
|
||||||
|
|
||||||
|
boolean close = mediaService.closeStreamOnNoneReader(param.getMediaServerId(), param.getApp(), param.getStream(), null);
|
||||||
|
ret.put("code", close);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当播放一个url,如果不存在时,会发出一个消息通知
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_stream_not_found", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onStreamNotFound(@RequestBody ABLHookParam param) {
|
||||||
|
logger.info("[ABL HOOK] 流未找到:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
|
||||||
|
|
||||||
|
|
||||||
|
MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
if (!userSetting.isAutoApplyPlay() || mediaServer == null) {
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
MediaNotFoundEvent mediaNotFoundEvent = MediaNotFoundEvent.getInstance(this, param, mediaServer);
|
||||||
|
applicationEventPublisher.publishEvent(mediaNotFoundEvent);
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ABLMediaServer启动时会发送上线通知
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_server_started", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onServerStarted(HttpServletRequest request, @RequestBody OnServerStaredABLHookParam param) {
|
||||||
|
|
||||||
|
logger.info("[ABL HOOK] 启动 " + param.getMediaServerId());
|
||||||
|
try {
|
||||||
|
HookAblServerStartEvent event = new HookAblServerStartEvent(this);
|
||||||
|
MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
if (mediaServerItem != null) {
|
||||||
|
event.setMediaServerItem(mediaServerItem);
|
||||||
|
applicationEventPublisher.publishEvent(event);
|
||||||
|
}
|
||||||
|
}catch (Exception e) {
|
||||||
|
logger.info("[ABL-HOOK-启动] 发送通知失败 ", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO 发送rtp(startSendRtp)被动关闭时回调
|
||||||
|
*/
|
||||||
|
// @ResponseBody
|
||||||
|
// @PostMapping(value = "/on_send_rtp_stopped", produces = "application/json;charset=UTF-8")
|
||||||
|
// public HookResult onSendRtpStopped(HttpServletRequest request, @RequestBody OnSendRtpStoppedHookParam param) {
|
||||||
|
//
|
||||||
|
// logger.info("[ZLM HOOK] rtp发送关闭:{}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
|
||||||
|
//
|
||||||
|
// // 查找对应的上级推流,发送停止
|
||||||
|
// if (!"rtp".equals(param.getApp())) {
|
||||||
|
// return HookResult.SUCCESS();
|
||||||
|
// }
|
||||||
|
// try {
|
||||||
|
// MediaSendRtpStoppedEvent event = new MediaSendRtpStoppedEvent(this);
|
||||||
|
// MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
// if (mediaServerItem != null) {
|
||||||
|
// event.setMediaServer(mediaServerItem);
|
||||||
|
// applicationEventPublisher.publishEvent(event);
|
||||||
|
// }
|
||||||
|
// }catch (Exception e) {
|
||||||
|
// logger.info("[ZLM-HOOK-rtp发送关闭] 发送通知失败 ", e);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return HookResult.SUCCESS();
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO 录像完成事件
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onRecordMp4(HttpServletRequest request, @RequestBody OnRecordMp4ABLHookParam param) {
|
||||||
|
logger.info("[ABL HOOK] 录像完成事件:{}->{}", param.getMediaServerId(), param.getFileName());
|
||||||
|
|
||||||
|
// try {
|
||||||
|
// MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
// if (mediaServerItem != null) {
|
||||||
|
// MediaRecordMp4Event event = MediaRecordMp4Event.getInstance(this, param, mediaServerItem);
|
||||||
|
// event.setMediaServer(mediaServerItem);
|
||||||
|
// applicationEventPublisher.publishEvent(event);
|
||||||
|
// }
|
||||||
|
// }catch (Exception e) {
|
||||||
|
// logger.info("[ZLM-HOOK-rtpServer收流超时] 发送通知失败 ", e);
|
||||||
|
// }
|
||||||
|
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当某一路码流断开时会发送通知
|
||||||
|
*/
|
||||||
|
@ResponseBody
|
||||||
|
@PostMapping(value = "/on_stream_disconnect", produces = "application/json;charset=UTF-8")
|
||||||
|
public HookResult onRecordMp4(HttpServletRequest request, @RequestBody ABLHookParam param) {
|
||||||
|
logger.info("[ABL HOOK] 码流断开事件, {}->{}/{}", param.getMediaServerId(), param.getApp(), param.getStream());
|
||||||
|
|
||||||
|
MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId());
|
||||||
|
if (mediaServer == null) {
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
MediaDepartureEvent mediaDepartureEvent = MediaDepartureEvent.getInstance(this, param, mediaServer);
|
||||||
|
applicationEventPublisher.publishEvent(mediaDepartureEvent);
|
||||||
|
|
||||||
|
return HookResult.SUCCESS();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> urlParamToMap(String params) {
|
||||||
|
HashMap<String, String> map = new HashMap<>();
|
||||||
|
if (ObjectUtils.isEmpty(params)) {
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
String[] paramsArray = params.split("&");
|
||||||
|
if (paramsArray.length == 0) {
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
for (String param : paramsArray) {
|
||||||
|
String[] paramArray = param.split("=");
|
||||||
|
if (paramArray.length == 2) {
|
||||||
|
map.put(paramArray[0], paramArray[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,151 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.genersoft.iot.vmp.common.CommonCallback;
|
||||||
|
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
|
import com.genersoft.iot.vmp.media.bean.MediaInfo;
|
||||||
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
|
import com.genersoft.iot.vmp.media.service.IMediaNodeServerService;
|
||||||
|
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Service("abl")
|
||||||
|
public class ABLMediaNodeServerService implements IMediaNodeServerService {
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(ABLMediaNodeServerService.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ABLRESTfulUtils ablresTfulUtils;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int createRTPServer(MediaServer mediaServer, String stream, long ssrc, Integer port, Boolean onlyAuto, Boolean disableAudio, Boolean reUsePort, Integer tcpMode) {
|
||||||
|
return ablresTfulUtils.openRtpServer(mediaServer, "rtp", stream, 96, port, tcpMode, disableAudio?1:0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeRtpServer(MediaServer mediaServer, String streamId) {
|
||||||
|
closeRtpServer(mediaServer, streamId, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeRtpServer(MediaServer serverItem, String streamId, CommonCallback<Boolean> callback) {
|
||||||
|
if (serverItem == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Map<String, Object> param = new HashMap<>();
|
||||||
|
param.put("stream_id", streamId);
|
||||||
|
param.put("force", 1);
|
||||||
|
JSONObject jsonObject = ablresTfulUtils.closeStreams(serverItem, "rtp", streamId);
|
||||||
|
logger.info("关闭RTP Server " + jsonObject);
|
||||||
|
if (jsonObject != null ) {
|
||||||
|
if (jsonObject.getInteger("code") != 0) {
|
||||||
|
logger.error("关闭RTP Server 失败: " + jsonObject.getString("msg"));
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
// 检查ZLM状态
|
||||||
|
logger.error("关闭RTP Server 失败: 请检查ZLM服务");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeStreams(MediaServer mediaServerItem, String rtp, String streamId) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean updateRtpServerSSRC(MediaServer mediaServerItem, String streamId, String ssrc) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkNodeId(MediaServer mediaServerItem) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void online(MediaServer mediaServerItem) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MediaServer checkMediaServer(String ip, int port, String secret) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stopSendRtp(MediaServer mediaInfo, String app, String stream, String ssrc) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean deleteRecordDirectory(MediaServer mediaServerItem, String app, String stream, String date, String fileName) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<StreamInfo> getMediaList(MediaServer mediaServerItem, String app, String stream, String callId) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean connectRtpServer(MediaServer mediaServerItem, String address, int port, String stream) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getSnap(MediaServer mediaServerItem, String streamUrl, int timeoutSec, int expireSec, String path, String fileName) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MediaInfo getMediaInfo(MediaServer mediaServerItem, String app, String stream) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean pauseRtpCheck(MediaServer mediaServer, String streamKey) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean resumeRtpCheck(MediaServer mediaServer, String streamKey) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFfmpegCmd(MediaServer mediaServer, String cmdKey) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WVPResult<String> addFFmpegSource(MediaServer mediaServer, String srcUrl, String dstUrl, int timeoutMs, boolean enableAudio, boolean enableMp4, String ffmpegCmdKey) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WVPResult<String> addStreamProxy(MediaServer mediaServer, String app, String stream, String url, boolean enableAudio, boolean enableMp4, String rtpType) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean delFFmpegSource(MediaServer mediaServer, String streamKey) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean delStreamProxy(MediaServer mediaServer, String streamKey) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, String> getFFmpegCMDs(MediaServer mediaServer) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,363 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.genersoft.iot.vmp.conf.DynamicTask;
|
||||||
|
import com.genersoft.iot.vmp.conf.UserSetting;
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.AblServerConfig;
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.ConfigKeyId;
|
||||||
|
import com.genersoft.iot.vmp.media.abl.event.HookAblServerKeepaliveEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.abl.event.HookAblServerStartEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerChangeEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.event.mediaServer.MediaServerDeleteEvent;
|
||||||
|
import com.genersoft.iot.vmp.media.service.IMediaServerService;
|
||||||
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.context.event.EventListener;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 管理zlm流媒体节点的状态
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class ABLMediaServerStatusManger {
|
||||||
|
|
||||||
|
private final static Logger logger = LoggerFactory.getLogger(ABLMediaServerStatusManger.class);
|
||||||
|
|
||||||
|
private final Map<Object, MediaServer> offlineABLPrimaryMap = new ConcurrentHashMap<>();
|
||||||
|
private final Map<Object, MediaServer> offlineAblsecondaryMap = new ConcurrentHashMap<>();
|
||||||
|
private final Map<Object, Long> offlineAblTimeMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ABLRESTfulUtils ablResTfulUtils;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IMediaServerService mediaServerService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DynamicTask dynamicTask;
|
||||||
|
|
||||||
|
@Value("${server.ssl.enabled:false}")
|
||||||
|
private boolean sslEnabled;
|
||||||
|
|
||||||
|
@Value("${server.port}")
|
||||||
|
private Integer serverPort;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserSetting userSetting;
|
||||||
|
|
||||||
|
private final String type = "abl";
|
||||||
|
|
||||||
|
@Async("taskExecutor")
|
||||||
|
@EventListener
|
||||||
|
public void onApplicationEvent(MediaServerChangeEvent event) {
|
||||||
|
if (event.getMediaServerItemList() == null
|
||||||
|
|| event.getMediaServerItemList().isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (MediaServer mediaServerItem : event.getMediaServerItemList()) {
|
||||||
|
if (!type.equals(mediaServerItem.getType())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
logger.info("[ABL-添加待上线节点] ID:" + mediaServerItem.getId());
|
||||||
|
offlineABLPrimaryMap.put(mediaServerItem.getId(), mediaServerItem);
|
||||||
|
offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Async("taskExecutor")
|
||||||
|
@EventListener
|
||||||
|
public void onApplicationEvent(HookAblServerStartEvent event) {
|
||||||
|
if (event.getMediaServerItem() == null
|
||||||
|
|| !type.equals(event.getMediaServerItem().getType())
|
||||||
|
|| event.getMediaServerItem().isStatus()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MediaServer serverItem = mediaServerService.getOne(event.getMediaServerItem().getId());
|
||||||
|
if (serverItem == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.info("[ABL-HOOK事件-服务启动] ID:" + event.getMediaServerItem().getId());
|
||||||
|
online(serverItem, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Async("taskExecutor")
|
||||||
|
@EventListener
|
||||||
|
public void onApplicationEvent(HookAblServerKeepaliveEvent event) {
|
||||||
|
if (event.getMediaServerItem() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MediaServer serverItem = mediaServerService.getOne(event.getMediaServerItem().getId());
|
||||||
|
if (serverItem == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.info("[ABL-HOOK事件-心跳] ID:" + event.getMediaServerItem().getId());
|
||||||
|
online(serverItem, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Async("taskExecutor")
|
||||||
|
@EventListener
|
||||||
|
public void onApplicationEvent(MediaServerDeleteEvent event) {
|
||||||
|
if (event.getMediaServerId() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
logger.info("[ABL-节点被移除] ID:" + event.getMediaServerId());
|
||||||
|
offlineABLPrimaryMap.remove(event.getMediaServerId());
|
||||||
|
offlineAblsecondaryMap.remove(event.getMediaServerId());
|
||||||
|
offlineAblTimeMap.remove(event.getMediaServerId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Scheduled(fixedDelay = 10*1000) //每隔10秒检查一次
|
||||||
|
public void execute(){
|
||||||
|
// 初次加入的离线节点会在30分钟内,每间隔十秒尝试一次,30分钟后如果仍然没有上线,则每隔30分钟尝试一次连接
|
||||||
|
if (offlineABLPrimaryMap.isEmpty() && offlineAblsecondaryMap.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!offlineABLPrimaryMap.isEmpty()) {
|
||||||
|
for (MediaServer mediaServerItem : offlineABLPrimaryMap.values()) {
|
||||||
|
if (offlineAblTimeMap.get(mediaServerItem.getId()) < System.currentTimeMillis() - 30*60*1000) {
|
||||||
|
offlineAblsecondaryMap.put(mediaServerItem.getId(), mediaServerItem);
|
||||||
|
offlineABLPrimaryMap.remove(mediaServerItem.getId());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
logger.info("[ABL-尝试连接] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
JSONObject responseJson = ablResTfulUtils.getServerConfig(mediaServerItem);
|
||||||
|
AblServerConfig ablServerConfig = null;
|
||||||
|
if (responseJson == null) {
|
||||||
|
logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
JSONArray data = responseJson.getJSONArray("params");
|
||||||
|
if (data == null || data.isEmpty()) {
|
||||||
|
logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
}else {
|
||||||
|
ablServerConfig = AblServerConfig.getInstance(data);
|
||||||
|
initPort(mediaServerItem, ablServerConfig);
|
||||||
|
online(mediaServerItem, ablServerConfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!offlineAblsecondaryMap.isEmpty()) {
|
||||||
|
for (MediaServer mediaServerItem : offlineAblsecondaryMap.values()) {
|
||||||
|
if (offlineAblTimeMap.get(mediaServerItem.getId()) < System.currentTimeMillis() - 30*60*1000) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
logger.info("[ABL-尝试连接] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
JSONObject responseJson = ablResTfulUtils.getServerConfig(mediaServerItem);
|
||||||
|
AblServerConfig ablServerConfig = null;
|
||||||
|
if (responseJson == null) {
|
||||||
|
logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
JSONArray data = responseJson.getJSONArray("params");
|
||||||
|
if (data == null || data.isEmpty()) {
|
||||||
|
logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
|
||||||
|
}else {
|
||||||
|
ablServerConfig = AblServerConfig.getInstance(data);
|
||||||
|
initPort(mediaServerItem, ablServerConfig);
|
||||||
|
online(mediaServerItem, ablServerConfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void online(MediaServer mediaServerItem, AblServerConfig config) {
|
||||||
|
offlineABLPrimaryMap.remove(mediaServerItem.getId());
|
||||||
|
offlineAblsecondaryMap.remove(mediaServerItem.getId());
|
||||||
|
offlineAblTimeMap.remove(mediaServerItem.getId());
|
||||||
|
if (!mediaServerItem.isStatus()) {
|
||||||
|
logger.info("[ABL-连接成功] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
mediaServerItem.setStatus(true);
|
||||||
|
mediaServerItem.setHookAliveInterval(10F);
|
||||||
|
mediaServerService.update(mediaServerItem);
|
||||||
|
if(mediaServerItem.isAutoConfig()) {
|
||||||
|
if (config == null) {
|
||||||
|
JSONObject responseJSON = ablResTfulUtils.getServerConfig(mediaServerItem);
|
||||||
|
JSONArray data = responseJSON.getJSONArray("params");
|
||||||
|
if (data != null && !data.isEmpty()) {
|
||||||
|
config = AblServerConfig.getInstance(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (config != null) {
|
||||||
|
initPort(mediaServerItem, config);
|
||||||
|
setAblConfig(mediaServerItem, false, config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mediaServerService.update(mediaServerItem);
|
||||||
|
}
|
||||||
|
// 设置两次心跳未收到则认为zlm离线
|
||||||
|
String key = "ABL-keepalive-" + mediaServerItem.getId();
|
||||||
|
dynamicTask.startDelay(key, ()->{
|
||||||
|
logger.warn("[ABL-心跳超时] ID:{}", mediaServerItem.getId());
|
||||||
|
mediaServerItem.setStatus(false);
|
||||||
|
offlineABLPrimaryMap.put(mediaServerItem.getId(), mediaServerItem);
|
||||||
|
offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
|
||||||
|
// TODO 发送离线通知
|
||||||
|
mediaServerService.update(mediaServerItem);
|
||||||
|
}, (int)(mediaServerItem.getHookAliveInterval() * 2 * 1000));
|
||||||
|
}
|
||||||
|
private void initPort(MediaServer mediaServerItem, AblServerConfig ablServerConfig) {
|
||||||
|
// 端口只会从配置中读取一次,一旦自己配置或者读取过了将不在配置
|
||||||
|
// if (mediaServerItem.getHttpSSlPort() == 0) {
|
||||||
|
// mediaServerItem.setHttpSSlPort(ablServerConfig.getHttpSSLport());
|
||||||
|
// }
|
||||||
|
if (mediaServerItem.getRtmpPort() != ablServerConfig.getRtmpPort()) {
|
||||||
|
mediaServerItem.setRtmpPort(ablServerConfig.getRtmpPort());
|
||||||
|
}
|
||||||
|
// if (mediaServerItem.getRtmpSSlPort() == 0) {
|
||||||
|
// mediaServerItem.setRtmpSSlPort(ablServerConfig.getRtmpSslPort());
|
||||||
|
// }
|
||||||
|
if (mediaServerItem.getRtspPort() != ablServerConfig.getRtspPort()) {
|
||||||
|
mediaServerItem.setRtspPort(ablServerConfig.getRtspPort());
|
||||||
|
}
|
||||||
|
if (mediaServerItem.getFlvPort() != ablServerConfig.getHttpFlvPort()) {
|
||||||
|
mediaServerItem.setFlvPort(ablServerConfig.getHttpFlvPort());
|
||||||
|
}
|
||||||
|
if (mediaServerItem.getWsFlvPort() != ablServerConfig.getWsPort()) {
|
||||||
|
mediaServerItem.setWsFlvPort(ablServerConfig.getWsPort());
|
||||||
|
}
|
||||||
|
if (mediaServerItem.getRtpProxyPort() != ablServerConfig.getPsTsRecvPort()) {
|
||||||
|
mediaServerItem.setRtpProxyPort(ablServerConfig.getPsTsRecvPort());
|
||||||
|
}
|
||||||
|
// if (mediaServerItem.getRtspSSLPort() == 0) {
|
||||||
|
// mediaServerItem.setRtspSSLPort(ablServerConfig.getRtspSSlport());
|
||||||
|
// }
|
||||||
|
// if (mediaServerItem.getRtpProxyPort() == 0) {
|
||||||
|
// mediaServerItem.setRtpProxyPort(ablServerConfig.getRtpProxyPort());
|
||||||
|
// }
|
||||||
|
mediaServerItem.setHookAliveInterval(10F);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAblConfig(MediaServer mediaServerItem, boolean restart, AblServerConfig config) {
|
||||||
|
try {
|
||||||
|
if (config.getHookEnable() == 0) {
|
||||||
|
logger.info("[媒体服务节点-ABL] 开启HOOK功能 :{}", mediaServerItem.getId());
|
||||||
|
JSONObject responseJSON = ablResTfulUtils.setConfigParamValue(mediaServerItem, "hook_enable", "1");
|
||||||
|
if (responseJSON.getInteger("code") == 0) {
|
||||||
|
logger.info("[媒体服务节点-ABL] 开启HOOK功能成功 :{}", mediaServerItem.getId());
|
||||||
|
}else {
|
||||||
|
logger.info("[媒体服务节点-ABL] 开启HOOK功能失败 :{}->{}", mediaServerItem.getId(), responseJSON.getString("memo"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch (Exception e) {
|
||||||
|
logger.info("[媒体服务节点-ABL] 开启HOOK功能失败 :{}", mediaServerItem.getId(), e);
|
||||||
|
}
|
||||||
|
// 设置相关的HOOK
|
||||||
|
String[] hookUrlArray = {
|
||||||
|
"on_stream_arrive",
|
||||||
|
"on_stream_none_reader",
|
||||||
|
"on_record_mp4",
|
||||||
|
"on_stream_disconnect",
|
||||||
|
"on_stream_not_found",
|
||||||
|
"on_server_started",
|
||||||
|
"on_publish",
|
||||||
|
"on_play",
|
||||||
|
"on_record_progress",
|
||||||
|
"on_server_keepalive",
|
||||||
|
"on_stream_not_arrive",
|
||||||
|
"on_delete_record_mp4",
|
||||||
|
};
|
||||||
|
|
||||||
|
String protocol = sslEnabled ? "https" : "http";
|
||||||
|
String hookPrefix = String.format("%s://%s:%s/index/hook/abl", protocol, mediaServerItem.getHookIp(), serverPort);
|
||||||
|
Field[] fields = AblServerConfig.class.getDeclaredFields();
|
||||||
|
for (Field field : fields) {
|
||||||
|
try {
|
||||||
|
if (field.isAnnotationPresent(ConfigKeyId.class)) {
|
||||||
|
ConfigKeyId configKeyId = field.getAnnotation(ConfigKeyId.class);
|
||||||
|
for (String hook : hookUrlArray) {
|
||||||
|
if (configKeyId.value().equals(hook)) {
|
||||||
|
String hookUrl = String.format("%s/%s", hookPrefix, hook);
|
||||||
|
field.setAccessible(true);
|
||||||
|
// 利用反射获取值后对比是否与配置中相同,不同则进行设置
|
||||||
|
if (!hookUrl.equals(field.get(config))) {
|
||||||
|
JSONObject responseJSON = ablResTfulUtils.setConfigParamValue(mediaServerItem, hook, hookUrl);
|
||||||
|
if (responseJSON.getInteger("code") == 0) {
|
||||||
|
logger.info("[媒体服务节点-ABL] 设置HOOK {} 成功 :{}", hook, mediaServerItem.getId());
|
||||||
|
}else {
|
||||||
|
logger.info("[媒体服务节点-ABL] 设置HOOK {} 失败 :{}->{}", hook, mediaServerItem.getId(), responseJSON.getString("memo"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch (Exception e) {
|
||||||
|
logger.info("[媒体服务节点-ABL] 设置HOOK 失败 :{}", mediaServerItem.getId(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Map<String, Object> param = new HashMap<>();
|
||||||
|
// param.put("api.secret",mediaServerItem.getSecret()); // -profile:v Baseline
|
||||||
|
// if (mediaServerItem.getRtspPort() != 0) {
|
||||||
|
// param.put("ffmpeg.snap", "%s -rtsp_transport tcp -i %s -y -f mjpeg -frames:v 1 %s");
|
||||||
|
// }
|
||||||
|
// param.put("hook.enable","1");
|
||||||
|
// param.put("hook.on_flow_report","");
|
||||||
|
// param.put("hook.on_play",String.format("%s/on_play", hookPrefix));
|
||||||
|
// param.put("hook.on_http_access","");
|
||||||
|
// param.put("hook.on_publish", String.format("%s/on_publish", hookPrefix));
|
||||||
|
// param.put("hook.on_record_ts","");
|
||||||
|
// param.put("hook.on_rtsp_auth","");
|
||||||
|
// param.put("hook.on_rtsp_realm","");
|
||||||
|
// param.put("hook.on_server_started",String.format("%s/on_server_started", hookPrefix));
|
||||||
|
// param.put("hook.on_shell_login","");
|
||||||
|
// param.put("hook.on_stream_changed",String.format("%s/on_stream_changed", hookPrefix));
|
||||||
|
// param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrefix));
|
||||||
|
// param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrefix));
|
||||||
|
// param.put("hook.on_server_keepalive",String.format("%s/on_server_keepalive", hookPrefix));
|
||||||
|
// param.put("hook.on_send_rtp_stopped",String.format("%s/on_send_rtp_stopped", hookPrefix));
|
||||||
|
// param.put("hook.on_rtp_server_timeout",String.format("%s/on_rtp_server_timeout", hookPrefix));
|
||||||
|
// param.put("hook.on_record_mp4",String.format("%s/on_record_mp4", hookPrefix));
|
||||||
|
// param.put("hook.timeoutSec","30");
|
||||||
|
// param.put("hook.alive_interval", mediaServerItem.getHookAliveInterval());
|
||||||
|
// // 推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。
|
||||||
|
// // 置0关闭此特性(推流断开会导致立即断开播放器)
|
||||||
|
// // 此参数不应大于播放器超时时间
|
||||||
|
// // 优化此消息以更快的收到流注销事件
|
||||||
|
// param.put("protocol.continue_push_ms", "3000" );
|
||||||
|
// // 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track, 设置此选项优化那些音频错误的不规范流,
|
||||||
|
// // 等zlm支持给每个rtpServer设置关闭音频的时候可以不设置此选项
|
||||||
|
// if (mediaServerItem.isRtpEnable() && !ObjectUtils.isEmpty(mediaServerItem.getRtpPortRange())) {
|
||||||
|
// param.put("rtp_proxy.port_range", mediaServerItem.getRtpPortRange().replace(",", "-"));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (!ObjectUtils.isEmpty(mediaServerItem.getRecordPath())) {
|
||||||
|
// File recordPathFile = new File(mediaServerItem.getRecordPath());
|
||||||
|
// param.put("protocol.mp4_save_path", recordPathFile.getParentFile().getPath());
|
||||||
|
// param.put("protocol.downloadRoot", recordPathFile.getParentFile().getPath());
|
||||||
|
// param.put("record.appName", recordPathFile.getName());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// JSONObject responseJSON = ablResTfulUtils.setConfigParamValue(mediaServerItem, param);
|
||||||
|
//
|
||||||
|
// if (responseJSON != null && responseJSON.getInteger("code") == 0) {
|
||||||
|
// if (restart) {
|
||||||
|
// logger.info("[媒体服务节点] 设置成功,开始重启以保证配置生效 {} -> {}:{}",
|
||||||
|
// mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
// ablResTfulUtils.restartServer(mediaServerItem);
|
||||||
|
// }else {
|
||||||
|
// logger.info("[媒体服务节点] 设置成功 {} -> {}:{}",
|
||||||
|
// mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
// }
|
||||||
|
// }else {
|
||||||
|
// logger.info("[媒体服务节点] 设置媒体服务节点失败 {} -> {}:{}",
|
||||||
|
// mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,812 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class AblServerConfig {
|
||||||
|
|
||||||
|
@ConfigKeyId("secret")
|
||||||
|
private String secret;
|
||||||
|
|
||||||
|
@ConfigKeyId("ServerIP")
|
||||||
|
private String serverIp;
|
||||||
|
|
||||||
|
@ConfigKeyId("mediaServerID")
|
||||||
|
private String mediaServerId;
|
||||||
|
|
||||||
|
@ConfigKeyId("hook_enable")
|
||||||
|
private Integer hookEnable;
|
||||||
|
|
||||||
|
@ConfigKeyId("enable_audio")
|
||||||
|
private Integer enableAudio;
|
||||||
|
|
||||||
|
@ConfigKeyId("httpServerPort")
|
||||||
|
private Integer httpServerPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtspPort")
|
||||||
|
private Integer rtspPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtmpPort")
|
||||||
|
private Integer rtmpPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("httpFlvPort")
|
||||||
|
private Integer httpFlvPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("hls_enable")
|
||||||
|
private Integer hlsEnable;
|
||||||
|
|
||||||
|
@ConfigKeyId("hlsPort")
|
||||||
|
private Integer hlsPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("wsPort")
|
||||||
|
private Integer wsPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("mp4Port")
|
||||||
|
private Integer mp4Port;
|
||||||
|
|
||||||
|
@ConfigKeyId("ps_tsRecvPort")
|
||||||
|
private Integer psTsRecvPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("hlsCutType")
|
||||||
|
private Integer hlsCutType;
|
||||||
|
|
||||||
|
@ConfigKeyId("h265CutType")
|
||||||
|
private Integer h265CutType;
|
||||||
|
|
||||||
|
@ConfigKeyId("RecvThreadCount")
|
||||||
|
private Integer RecvThreadCount;
|
||||||
|
|
||||||
|
@ConfigKeyId("SendThreadCount")
|
||||||
|
private Integer SendThreadCount;
|
||||||
|
|
||||||
|
@ConfigKeyId("GB28181RtpTCPHeadType")
|
||||||
|
private Integer GB28181RtpTCPHeadType;
|
||||||
|
|
||||||
|
@ConfigKeyId("ReConnectingCount")
|
||||||
|
private Integer ReConnectingCount;
|
||||||
|
|
||||||
|
@ConfigKeyId("maxTimeNoOneWatch")
|
||||||
|
private Integer maxTimeNoOneWatch;
|
||||||
|
|
||||||
|
@ConfigKeyId("pushEnable_mp4")
|
||||||
|
private Integer pushEnableMp4;
|
||||||
|
|
||||||
|
@ConfigKeyId("fileSecond")
|
||||||
|
private Integer fileSecond;
|
||||||
|
|
||||||
|
@ConfigKeyId("fileKeepMaxTime")
|
||||||
|
private Integer fileKeepMaxTime;
|
||||||
|
|
||||||
|
@ConfigKeyId("httpDownloadSpeed")
|
||||||
|
private Integer httpDownloadSpeed;
|
||||||
|
|
||||||
|
@ConfigKeyId("RecordReplayThread")
|
||||||
|
private Integer RecordReplayThread;
|
||||||
|
|
||||||
|
@ConfigKeyId("convertMaxObject")
|
||||||
|
private Integer convertMaxObject;
|
||||||
|
|
||||||
|
@ConfigKeyId("version")
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
@ConfigKeyId("recordPath")
|
||||||
|
private String recordPath;
|
||||||
|
|
||||||
|
@ConfigKeyId("picturePath")
|
||||||
|
private String picturePath;
|
||||||
|
|
||||||
|
@ConfigKeyId("noneReaderDuration")
|
||||||
|
private Integer noneReaderDuration;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_server_started")
|
||||||
|
private String onServerStarted;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_server_keepalive")
|
||||||
|
private String onServerKeepalive;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_play")
|
||||||
|
private String onPlay;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_publish")
|
||||||
|
private String onPublish;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_stream_arrive")
|
||||||
|
private String onStreamArrive;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_stream_not_arrive")
|
||||||
|
private String onStreamNotArrive;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_stream_none_reader")
|
||||||
|
private String onStreamNoneReader;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_stream_disconnect")
|
||||||
|
private String onStreamDisconnect;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_stream_not_found")
|
||||||
|
private String onStreamNotFound;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_record_mp4")
|
||||||
|
private String onRecordMp4;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_delete_record_mp4")
|
||||||
|
private String onDeleteRecordMp4;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_record_progress")
|
||||||
|
private String onRecordProgress;
|
||||||
|
|
||||||
|
@ConfigKeyId("on_record_ts")
|
||||||
|
private String onRecordTs;
|
||||||
|
|
||||||
|
@ConfigKeyId("enable_GetFileDuration")
|
||||||
|
private Integer enableGetFileDuration;
|
||||||
|
|
||||||
|
@ConfigKeyId("keepaliveDuration")
|
||||||
|
private Integer keepaliveDuration;
|
||||||
|
|
||||||
|
@ConfigKeyId("captureReplayType")
|
||||||
|
private Integer captureReplayType;
|
||||||
|
|
||||||
|
@ConfigKeyId("pictureMaxCount")
|
||||||
|
private Integer pictureMaxCount;
|
||||||
|
|
||||||
|
@ConfigKeyId("videoFileFormat")
|
||||||
|
private Integer videoFileFormat;
|
||||||
|
|
||||||
|
@ConfigKeyId("MaxDiconnectTimeoutSecond")
|
||||||
|
private Integer maxDiconnectTimeoutSecond;
|
||||||
|
|
||||||
|
@ConfigKeyId("G711ConvertAAC")
|
||||||
|
private Integer g711ConvertAAC;
|
||||||
|
|
||||||
|
@ConfigKeyId("filterVideo_enable")
|
||||||
|
private Integer filterVideoEnable;
|
||||||
|
|
||||||
|
@ConfigKeyId("filterVideo_text")
|
||||||
|
private String filterVideoText;
|
||||||
|
|
||||||
|
@ConfigKeyId("FilterFontSize")
|
||||||
|
private Integer filterFontSize;
|
||||||
|
|
||||||
|
@ConfigKeyId("FilterFontColor")
|
||||||
|
private String filterFontColor;
|
||||||
|
|
||||||
|
@ConfigKeyId("FilterFontLeft")
|
||||||
|
private Integer filterFontLeft;
|
||||||
|
|
||||||
|
@ConfigKeyId("FilterFontTop")
|
||||||
|
private Integer filterFontTop;
|
||||||
|
|
||||||
|
@ConfigKeyId("FilterFontAlpha")
|
||||||
|
private Double filterFontAlpha;
|
||||||
|
|
||||||
|
@ConfigKeyId("convertOutWidth")
|
||||||
|
private Integer convertOutWidth;
|
||||||
|
|
||||||
|
@ConfigKeyId("convertOutHeight")
|
||||||
|
private Integer convertOutHeight;
|
||||||
|
|
||||||
|
@ConfigKeyId("convertOutBitrate")
|
||||||
|
private Integer convertOutBitrate;
|
||||||
|
|
||||||
|
@ConfigKeyId("flvPlayAddMute")
|
||||||
|
private Integer flvPlayAddMute;
|
||||||
|
|
||||||
|
@ConfigKeyId("gb28181LibraryUse")
|
||||||
|
private Integer gb28181LibraryUse;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtc.listening-ip")
|
||||||
|
private String rtcListeningIp;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtc.listening-port")
|
||||||
|
private Integer rtcListeningIpPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtc.external-ip")
|
||||||
|
private String rtcExternalIp;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtc.realm")
|
||||||
|
private String rtcRealm;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtc.user")
|
||||||
|
private String rtcUser;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtc.min-port")
|
||||||
|
private Integer rtcMinPort;
|
||||||
|
|
||||||
|
@ConfigKeyId("rtc.max-port")
|
||||||
|
private Integer rtcMaxPort;
|
||||||
|
|
||||||
|
public static AblServerConfig getInstance(JSONArray jsonArray) {
|
||||||
|
if (jsonArray == null || jsonArray.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
AblServerConfig ablServerConfig = new AblServerConfig();
|
||||||
|
Field[] fields = AblServerConfig.class.getDeclaredFields();
|
||||||
|
Map<String, Field> fieldMap = new HashMap<>();
|
||||||
|
for (Field field : fields) {
|
||||||
|
if (field.isAnnotationPresent(ConfigKeyId.class)) {
|
||||||
|
ConfigKeyId configKeyId = field.getAnnotation(ConfigKeyId.class);
|
||||||
|
fieldMap.put(configKeyId.value(), field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < jsonArray.size(); i++) {
|
||||||
|
JSONObject jsonObject = jsonArray.getJSONObject(i);
|
||||||
|
if (jsonObject == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (String key : fieldMap.keySet()) {
|
||||||
|
if (jsonObject.containsKey(key)) {
|
||||||
|
Field field = fieldMap.get(key);
|
||||||
|
field.setAccessible(true);
|
||||||
|
try {
|
||||||
|
field.set(ablServerConfig, jsonObject.getObject(key, fieldMap.get(key).getType()));
|
||||||
|
} catch (IllegalAccessException e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ablServerConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSecret() {
|
||||||
|
return secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSecret(String secret) {
|
||||||
|
this.secret = secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getServerIp() {
|
||||||
|
return serverIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setServerIp(String serverIp) {
|
||||||
|
this.serverIp = serverIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMediaServerId() {
|
||||||
|
return mediaServerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMediaServerId(String mediaServerId) {
|
||||||
|
this.mediaServerId = mediaServerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHookEnable() {
|
||||||
|
return hookEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHookEnable(Integer hookEnable) {
|
||||||
|
this.hookEnable = hookEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getEnableAudio() {
|
||||||
|
return enableAudio;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnableAudio(Integer enableAudio) {
|
||||||
|
this.enableAudio = enableAudio;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHttpServerPort() {
|
||||||
|
return httpServerPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpServerPort(Integer httpServerPort) {
|
||||||
|
this.httpServerPort = httpServerPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRtspPort() {
|
||||||
|
return rtspPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtspPort(Integer rtspPort) {
|
||||||
|
this.rtspPort = rtspPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRtmpPort() {
|
||||||
|
return rtmpPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtmpPort(Integer rtmpPort) {
|
||||||
|
this.rtmpPort = rtmpPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHttpFlvPort() {
|
||||||
|
return httpFlvPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpFlvPort(Integer httpFlvPort) {
|
||||||
|
this.httpFlvPort = httpFlvPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHlsEnable() {
|
||||||
|
return hlsEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHlsEnable(Integer hlsEnable) {
|
||||||
|
this.hlsEnable = hlsEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHlsPort() {
|
||||||
|
return hlsPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHlsPort(Integer hlsPort) {
|
||||||
|
this.hlsPort = hlsPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getWsPort() {
|
||||||
|
return wsPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWsPort(Integer wsPort) {
|
||||||
|
this.wsPort = wsPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMp4Port() {
|
||||||
|
return mp4Port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMp4Port(Integer mp4Port) {
|
||||||
|
this.mp4Port = mp4Port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPsTsRecvPort() {
|
||||||
|
return psTsRecvPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPsTsRecvPort(Integer psTsRecvPort) {
|
||||||
|
this.psTsRecvPort = psTsRecvPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHlsCutType() {
|
||||||
|
return hlsCutType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHlsCutType(Integer hlsCutType) {
|
||||||
|
this.hlsCutType = hlsCutType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getH265CutType() {
|
||||||
|
return h265CutType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setH265CutType(Integer h265CutType) {
|
||||||
|
this.h265CutType = h265CutType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRecvThreadCount() {
|
||||||
|
return RecvThreadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRecvThreadCount(Integer recvThreadCount) {
|
||||||
|
RecvThreadCount = recvThreadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSendThreadCount() {
|
||||||
|
return SendThreadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSendThreadCount(Integer sendThreadCount) {
|
||||||
|
SendThreadCount = sendThreadCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getGB28181RtpTCPHeadType() {
|
||||||
|
return GB28181RtpTCPHeadType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGB28181RtpTCPHeadType(Integer GB28181RtpTCPHeadType) {
|
||||||
|
this.GB28181RtpTCPHeadType = GB28181RtpTCPHeadType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getReConnectingCount() {
|
||||||
|
return ReConnectingCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReConnectingCount(Integer reConnectingCount) {
|
||||||
|
ReConnectingCount = reConnectingCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMaxTimeNoOneWatch() {
|
||||||
|
return maxTimeNoOneWatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxTimeNoOneWatch(Integer maxTimeNoOneWatch) {
|
||||||
|
this.maxTimeNoOneWatch = maxTimeNoOneWatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPushEnableMp4() {
|
||||||
|
return pushEnableMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPushEnableMp4(Integer pushEnableMp4) {
|
||||||
|
this.pushEnableMp4 = pushEnableMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getFileSecond() {
|
||||||
|
return fileSecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFileSecond(Integer fileSecond) {
|
||||||
|
this.fileSecond = fileSecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getFileKeepMaxTime() {
|
||||||
|
return fileKeepMaxTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFileKeepMaxTime(Integer fileKeepMaxTime) {
|
||||||
|
this.fileKeepMaxTime = fileKeepMaxTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHttpDownloadSpeed() {
|
||||||
|
return httpDownloadSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpDownloadSpeed(Integer httpDownloadSpeed) {
|
||||||
|
this.httpDownloadSpeed = httpDownloadSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRecordReplayThread() {
|
||||||
|
return RecordReplayThread;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRecordReplayThread(Integer recordReplayThread) {
|
||||||
|
RecordReplayThread = recordReplayThread;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getConvertMaxObject() {
|
||||||
|
return convertMaxObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConvertMaxObject(Integer convertMaxObject) {
|
||||||
|
this.convertMaxObject = convertMaxObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion(String version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRecordPath() {
|
||||||
|
return recordPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRecordPath(String recordPath) {
|
||||||
|
this.recordPath = recordPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPicturePath() {
|
||||||
|
return picturePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPicturePath(String picturePath) {
|
||||||
|
this.picturePath = picturePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getNoneReaderDuration() {
|
||||||
|
return noneReaderDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNoneReaderDuration(Integer noneReaderDuration) {
|
||||||
|
this.noneReaderDuration = noneReaderDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnServerStarted() {
|
||||||
|
return onServerStarted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnServerStarted(String onServerStarted) {
|
||||||
|
this.onServerStarted = onServerStarted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnServerKeepalive() {
|
||||||
|
return onServerKeepalive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnServerKeepalive(String onServerKeepalive) {
|
||||||
|
this.onServerKeepalive = onServerKeepalive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnPlay() {
|
||||||
|
return onPlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnPlay(String onPlay) {
|
||||||
|
this.onPlay = onPlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnPublish() {
|
||||||
|
return onPublish;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnPublish(String onPublish) {
|
||||||
|
this.onPublish = onPublish;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnStreamArrive() {
|
||||||
|
return onStreamArrive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnStreamArrive(String onStreamArrive) {
|
||||||
|
this.onStreamArrive = onStreamArrive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnStreamNotArrive() {
|
||||||
|
return onStreamNotArrive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnStreamNotArrive(String onStreamNotArrive) {
|
||||||
|
this.onStreamNotArrive = onStreamNotArrive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnStreamNoneReader() {
|
||||||
|
return onStreamNoneReader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnStreamNoneReader(String onStreamNoneReader) {
|
||||||
|
this.onStreamNoneReader = onStreamNoneReader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnStreamDisconnect() {
|
||||||
|
return onStreamDisconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnStreamDisconnect(String onStreamDisconnect) {
|
||||||
|
this.onStreamDisconnect = onStreamDisconnect;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnDeleteRecordMp4() {
|
||||||
|
return onDeleteRecordMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnDeleteRecordMp4(String onDeleteRecordMp4) {
|
||||||
|
this.onDeleteRecordMp4 = onDeleteRecordMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnRecordProgress() {
|
||||||
|
return onRecordProgress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnRecordProgress(String onRecordProgress) {
|
||||||
|
this.onRecordProgress = onRecordProgress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnRecordTs() {
|
||||||
|
return onRecordTs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnRecordTs(String onRecordTs) {
|
||||||
|
this.onRecordTs = onRecordTs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getEnableGetFileDuration() {
|
||||||
|
return enableGetFileDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnableGetFileDuration(Integer enableGetFileDuration) {
|
||||||
|
this.enableGetFileDuration = enableGetFileDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getKeepaliveDuration() {
|
||||||
|
return keepaliveDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKeepaliveDuration(Integer keepaliveDuration) {
|
||||||
|
this.keepaliveDuration = keepaliveDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCaptureReplayType() {
|
||||||
|
return captureReplayType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCaptureReplayType(Integer captureReplayType) {
|
||||||
|
this.captureReplayType = captureReplayType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getVideoFileFormat() {
|
||||||
|
return videoFileFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVideoFileFormat(Integer videoFileFormat) {
|
||||||
|
this.videoFileFormat = videoFileFormat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMaxDiconnectTimeoutSecond() {
|
||||||
|
return maxDiconnectTimeoutSecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxDiconnectTimeoutSecond(Integer maxDiconnectTimeoutSecond) {
|
||||||
|
this.maxDiconnectTimeoutSecond = maxDiconnectTimeoutSecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getG711ConvertAAC() {
|
||||||
|
return g711ConvertAAC;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setG711ConvertAAC(Integer g711ConvertAAC) {
|
||||||
|
this.g711ConvertAAC = g711ConvertAAC;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getFilterVideoEnable() {
|
||||||
|
return filterVideoEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilterVideoEnable(Integer filterVideoEnable) {
|
||||||
|
this.filterVideoEnable = filterVideoEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFilterVideoText() {
|
||||||
|
return filterVideoText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilterVideoText(String filterVideoText) {
|
||||||
|
this.filterVideoText = filterVideoText;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getFilterFontSize() {
|
||||||
|
return filterFontSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilterFontSize(Integer filterFontSize) {
|
||||||
|
this.filterFontSize = filterFontSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFilterFontColor() {
|
||||||
|
return filterFontColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilterFontColor(String filterFontColor) {
|
||||||
|
this.filterFontColor = filterFontColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getFilterFontLeft() {
|
||||||
|
return filterFontLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilterFontLeft(Integer filterFontLeft) {
|
||||||
|
this.filterFontLeft = filterFontLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getFilterFontTop() {
|
||||||
|
return filterFontTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilterFontTop(Integer filterFontTop) {
|
||||||
|
this.filterFontTop = filterFontTop;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getFilterFontAlpha() {
|
||||||
|
return filterFontAlpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilterFontAlpha(Double filterFontAlpha) {
|
||||||
|
this.filterFontAlpha = filterFontAlpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getConvertOutWidth() {
|
||||||
|
return convertOutWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConvertOutWidth(Integer convertOutWidth) {
|
||||||
|
this.convertOutWidth = convertOutWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getConvertOutHeight() {
|
||||||
|
return convertOutHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConvertOutHeight(Integer convertOutHeight) {
|
||||||
|
this.convertOutHeight = convertOutHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getConvertOutBitrate() {
|
||||||
|
return convertOutBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConvertOutBitrate(Integer convertOutBitrate) {
|
||||||
|
this.convertOutBitrate = convertOutBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getFlvPlayAddMute() {
|
||||||
|
return flvPlayAddMute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFlvPlayAddMute(Integer flvPlayAddMute) {
|
||||||
|
this.flvPlayAddMute = flvPlayAddMute;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getGb28181LibraryUse() {
|
||||||
|
return gb28181LibraryUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGb28181LibraryUse(Integer gb28181LibraryUse) {
|
||||||
|
this.gb28181LibraryUse = gb28181LibraryUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRtcListeningIp() {
|
||||||
|
return rtcListeningIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtcListeningIp(String rtcListeningIp) {
|
||||||
|
this.rtcListeningIp = rtcListeningIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRtcListeningIpPort() {
|
||||||
|
return rtcListeningIpPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtcListeningIpPort(Integer rtcListeningIpPort) {
|
||||||
|
this.rtcListeningIpPort = rtcListeningIpPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRtcExternalIp() {
|
||||||
|
return rtcExternalIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtcExternalIp(String rtcExternalIp) {
|
||||||
|
this.rtcExternalIp = rtcExternalIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRtcRealm() {
|
||||||
|
return rtcRealm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtcRealm(String rtcRealm) {
|
||||||
|
this.rtcRealm = rtcRealm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRtcUser() {
|
||||||
|
return rtcUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtcUser(String rtcUser) {
|
||||||
|
this.rtcUser = rtcUser;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRtcMinPort() {
|
||||||
|
return rtcMinPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtcMinPort(Integer rtcMinPort) {
|
||||||
|
this.rtcMinPort = rtcMinPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRtcMaxPort() {
|
||||||
|
return rtcMaxPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtcMaxPort(Integer rtcMaxPort) {
|
||||||
|
this.rtcMaxPort = rtcMaxPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnRecordMp4() {
|
||||||
|
return onRecordMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnRecordMp4(String onRecordMp4) {
|
||||||
|
this.onRecordMp4 = onRecordMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPictureMaxCount() {
|
||||||
|
return pictureMaxCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPictureMaxCount(Integer pictureMaxCount) {
|
||||||
|
this.pictureMaxCount = pictureMaxCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOnStreamNotFound() {
|
||||||
|
return onStreamNotFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnStreamNotFound(String onStreamNotFound) {
|
||||||
|
this.onStreamNotFound = onStreamNotFound;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean;
|
||||||
|
|
||||||
|
public class AblUrls {
|
||||||
|
private String rtsp;
|
||||||
|
private String rtmp;
|
||||||
|
private String httpFlv;
|
||||||
|
private String wsFlv;
|
||||||
|
private String httpMp4;
|
||||||
|
private String httpHls;
|
||||||
|
|
||||||
|
public String getRtsp() {
|
||||||
|
return rtsp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtsp(String rtsp) {
|
||||||
|
this.rtsp = rtsp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRtmp() {
|
||||||
|
return rtmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRtmp(String rtmp) {
|
||||||
|
this.rtmp = rtmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHttpFlv() {
|
||||||
|
return httpFlv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpFlv(String httpFlv) {
|
||||||
|
this.httpFlv = httpFlv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWsFlv() {
|
||||||
|
return wsFlv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWsFlv(String wsFlv) {
|
||||||
|
this.wsFlv = wsFlv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHttpMp4() {
|
||||||
|
return httpMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpMp4(String httpMp4) {
|
||||||
|
this.httpMp4 = httpMp4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHttpHls() {
|
||||||
|
return httpHls;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHttpHls(String httpHls) {
|
||||||
|
this.httpHls = httpHls;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Documented
|
||||||
|
public @interface ConfigKeyId {
|
||||||
|
String value();
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean.hook;
|
||||||
|
|
||||||
|
public class ABLHookParam {
|
||||||
|
private String mediaServerId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 应用名
|
||||||
|
*/
|
||||||
|
private String app;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流id
|
||||||
|
*/
|
||||||
|
private String stream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 媒体流来源编号,可以根据这个key进行关闭流媒体 可以调用delMediaStream或close_streams 函数进行关闭
|
||||||
|
*/
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 媒体流来源网络编号,可参考附表
|
||||||
|
*/
|
||||||
|
private Integer networkType;
|
||||||
|
|
||||||
|
public String getMediaServerId() {
|
||||||
|
return mediaServerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMediaServerId(String mediaServerId) {
|
||||||
|
this.mediaServerId = mediaServerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getApp() {
|
||||||
|
return app;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApp(String app) {
|
||||||
|
this.app = app;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStream() {
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStream(String stream) {
|
||||||
|
this.stream = stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKey(String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getNetworkType() {
|
||||||
|
return networkType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNetworkType(Integer networkType) {
|
||||||
|
this.networkType = networkType;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean.hook;
|
||||||
|
|
||||||
|
public class OnPlayABLHookParam extends ABLHookParam{
|
||||||
|
private String ip;
|
||||||
|
private Integer port;
|
||||||
|
private String params;
|
||||||
|
|
||||||
|
public String getIp() {
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIp(String ip) {
|
||||||
|
this.ip = ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(Integer port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParams() {
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParams(String params) {
|
||||||
|
this.params = params;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean.hook;
|
||||||
|
|
||||||
|
public class OnPublishABLHookParam extends ABLHookParam{
|
||||||
|
private String ip;
|
||||||
|
private Integer port;
|
||||||
|
private String params;
|
||||||
|
|
||||||
|
public String getIp() {
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIp(String ip) {
|
||||||
|
this.ip = ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(Integer port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParams() {
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParams(String params) {
|
||||||
|
this.params = params;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean.hook;
|
||||||
|
|
||||||
|
public class OnRecordMp4ABLHookParam extends ABLHookParam{
|
||||||
|
private String fileName;
|
||||||
|
|
||||||
|
public String getFileName() {
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFileName(String fileName) {
|
||||||
|
this.fileName = fileName;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean.hook;
|
||||||
|
|
||||||
|
public class OnRecordProgressABLHookParam extends OnRecordMp4ABLHookParam{
|
||||||
|
private Integer currentFileDuration;
|
||||||
|
private Integer TotalVideoDuration;
|
||||||
|
|
||||||
|
public Integer getCurrentFileDuration() {
|
||||||
|
return currentFileDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrentFileDuration(Integer currentFileDuration) {
|
||||||
|
this.currentFileDuration = currentFileDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getTotalVideoDuration() {
|
||||||
|
return TotalVideoDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalVideoDuration(Integer totalVideoDuration) {
|
||||||
|
TotalVideoDuration = totalVideoDuration;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean.hook;
|
||||||
|
|
||||||
|
public class OnServerKeepaliveABLHookParam {
|
||||||
|
private String localipAddress;
|
||||||
|
private String mediaServerId;
|
||||||
|
private String datetime;
|
||||||
|
|
||||||
|
|
||||||
|
public String getLocalipAddress() {
|
||||||
|
return localipAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocalipAddress(String localipAddress) {
|
||||||
|
this.localipAddress = localipAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMediaServerId() {
|
||||||
|
return mediaServerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMediaServerId(String mediaServerId) {
|
||||||
|
this.mediaServerId = mediaServerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDatetime() {
|
||||||
|
return datetime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDatetime(String datetime) {
|
||||||
|
this.datetime = datetime;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean.hook;
|
||||||
|
|
||||||
|
public class OnServerStaredABLHookParam {
|
||||||
|
private String localipAddress;
|
||||||
|
private String mediaServerId;
|
||||||
|
private String datetime;
|
||||||
|
|
||||||
|
|
||||||
|
public String getLocalipAddress() {
|
||||||
|
return localipAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocalipAddress(String localipAddress) {
|
||||||
|
this.localipAddress = localipAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMediaServerId() {
|
||||||
|
return mediaServerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMediaServerId(String mediaServerId) {
|
||||||
|
this.mediaServerId = mediaServerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDatetime() {
|
||||||
|
return datetime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDatetime(String datetime) {
|
||||||
|
this.datetime = datetime;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,245 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.bean.hook;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.AblUrls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流到来的事件
|
||||||
|
*/
|
||||||
|
public class OnStreamArriveABLHookParam extends ABLHookParam{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 推流鉴权Id
|
||||||
|
*/
|
||||||
|
private String callId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
private Boolean status;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Boolean enableHls;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Boolean transcodingStatus;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private String sourceURL;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer readerCount;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer noneReaderDuration;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private String videoCodec;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer videoFrameSpeed;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer width;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer height;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer videoBitrate;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private String audioCodec;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer audioChannels;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer audioSampleRate;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private Integer audioBitrate;
|
||||||
|
|
||||||
|
|
||||||
|
private AblUrls url;
|
||||||
|
|
||||||
|
|
||||||
|
public String getCallId() {
|
||||||
|
return callId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCallId(String callId) {
|
||||||
|
this.callId = callId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(Boolean status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getEnableHls() {
|
||||||
|
return enableHls;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnableHls(Boolean enableHls) {
|
||||||
|
this.enableHls = enableHls;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getTranscodingStatus() {
|
||||||
|
return transcodingStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTranscodingStatus(Boolean transcodingStatus) {
|
||||||
|
this.transcodingStatus = transcodingStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSourceURL() {
|
||||||
|
return sourceURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceURL(String sourceURL) {
|
||||||
|
this.sourceURL = sourceURL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getReaderCount() {
|
||||||
|
return readerCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReaderCount(Integer readerCount) {
|
||||||
|
this.readerCount = readerCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getNoneReaderDuration() {
|
||||||
|
return noneReaderDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNoneReaderDuration(Integer noneReaderDuration) {
|
||||||
|
this.noneReaderDuration = noneReaderDuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVideoCodec() {
|
||||||
|
return videoCodec;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVideoCodec(String videoCodec) {
|
||||||
|
this.videoCodec = videoCodec;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getVideoFrameSpeed() {
|
||||||
|
return videoFrameSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVideoFrameSpeed(Integer videoFrameSpeed) {
|
||||||
|
this.videoFrameSpeed = videoFrameSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getWidth() {
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWidth(Integer width) {
|
||||||
|
this.width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getHeight() {
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeight(Integer height) {
|
||||||
|
this.height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getVideoBitrate() {
|
||||||
|
return videoBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVideoBitrate(Integer videoBitrate) {
|
||||||
|
this.videoBitrate = videoBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAudioCodec() {
|
||||||
|
return audioCodec;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAudioCodec(String audioCodec) {
|
||||||
|
this.audioCodec = audioCodec;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getAudioChannels() {
|
||||||
|
return audioChannels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAudioChannels(Integer audioChannels) {
|
||||||
|
this.audioChannels = audioChannels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getAudioSampleRate() {
|
||||||
|
return audioSampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAudioSampleRate(Integer audioSampleRate) {
|
||||||
|
this.audioSampleRate = audioSampleRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getAudioBitrate() {
|
||||||
|
return audioBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAudioBitrate(Integer audioBitrate) {
|
||||||
|
this.audioBitrate = audioBitrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AblUrls getUrl() {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUrl(AblUrls url) {
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.event;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
|
import org.springframework.context.ApplicationEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zlm 心跳事件
|
||||||
|
*/
|
||||||
|
public class HookAblServerKeepaliveEvent extends ApplicationEvent {
|
||||||
|
|
||||||
|
public HookAblServerKeepaliveEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
private MediaServer mediaServerItem;
|
||||||
|
|
||||||
|
public MediaServer getMediaServerItem() {
|
||||||
|
return mediaServerItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMediaServerItem(MediaServer mediaServerItem) {
|
||||||
|
this.mediaServerItem = mediaServerItem;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.genersoft.iot.vmp.media.abl.event;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
|
import org.springframework.context.ApplicationEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zlm server_start事件
|
||||||
|
*/
|
||||||
|
public class HookAblServerStartEvent extends ApplicationEvent {
|
||||||
|
|
||||||
|
public HookAblServerStartEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
private MediaServer mediaServerItem;
|
||||||
|
|
||||||
|
public MediaServer getMediaServerItem() {
|
||||||
|
return mediaServerItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMediaServerItem(MediaServer mediaServerItem) {
|
||||||
|
this.mediaServerItem = mediaServerItem;
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,9 @@ package com.genersoft.iot.vmp.media.bean;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSONArray;
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.hook.OnStreamArriveABLHookParam;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
||||||
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OriginType;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -176,6 +178,42 @@ public class MediaInfo {
|
||||||
return mediaInfo;
|
return mediaInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MediaInfo getInstance(OnStreamArriveABLHookParam param, MediaServer mediaServer) {
|
||||||
|
|
||||||
|
MediaInfo mediaInfo = new MediaInfo();
|
||||||
|
mediaInfo.setApp(param.getApp());
|
||||||
|
mediaInfo.setStream(param.getStream());
|
||||||
|
mediaInfo.setMediaServer(mediaServer);
|
||||||
|
mediaInfo.setReaderCount(param.getReaderCount());
|
||||||
|
mediaInfo.setOnline(true);
|
||||||
|
mediaInfo.setVideoCodec(param.getVideoCodec());
|
||||||
|
switch (param.getNetworkType()) {
|
||||||
|
case 21:
|
||||||
|
mediaInfo.setOriginType(OriginType.RTMP_PUSH.ordinal());
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
mediaInfo.setOriginType(OriginType.RTSP_PUSH.ordinal());
|
||||||
|
break;
|
||||||
|
case 30:
|
||||||
|
case 31:
|
||||||
|
case 32:
|
||||||
|
case 33:
|
||||||
|
mediaInfo.setOriginType(OriginType.PULL.ordinal());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mediaInfo.setOriginType(OriginType.UNKNOWN.ordinal());
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
mediaInfo.setWidth(param.getWidth());
|
||||||
|
mediaInfo.setHeight(param.getHeight());
|
||||||
|
mediaInfo.setAudioCodec(param.getAudioCodec());
|
||||||
|
mediaInfo.setAudioChannels(param.getAudioChannels());
|
||||||
|
mediaInfo.setAudioSampleRate(param.getAudioSampleRate());
|
||||||
|
|
||||||
|
return mediaInfo;
|
||||||
|
}
|
||||||
|
|
||||||
public Integer getReaderCount() {
|
public Integer getReaderCount() {
|
||||||
return readerCount;
|
return readerCount;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.genersoft.iot.vmp.media.bean;
|
package com.genersoft.iot.vmp.media.bean;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.hook.OnRecordMp4ABLHookParam;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam;
|
||||||
|
|
||||||
public class RecordInfo {
|
public class RecordInfo {
|
||||||
|
@ -23,6 +24,12 @@ public class RecordInfo {
|
||||||
return recordInfo;
|
return recordInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static RecordInfo getInstance(OnRecordMp4ABLHookParam hookParam) {
|
||||||
|
RecordInfo recordInfo = new RecordInfo();
|
||||||
|
recordInfo.setFileName(hookParam.getFileName());
|
||||||
|
return recordInfo;
|
||||||
|
}
|
||||||
|
|
||||||
public String getFileName() {
|
public String getFileName() {
|
||||||
return fileName;
|
return fileName;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.genersoft.iot.vmp.media.event.media;
|
package com.genersoft.iot.vmp.media.event.media;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.hook.OnStreamArriveABLHookParam;
|
||||||
import com.genersoft.iot.vmp.media.bean.MediaInfo;
|
import com.genersoft.iot.vmp.media.bean.MediaInfo;
|
||||||
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
||||||
|
@ -22,6 +23,15 @@ public class MediaArrivalEvent extends MediaEvent {
|
||||||
mediaArrivalEvent.setCallId(hookParam.getCallId());
|
mediaArrivalEvent.setCallId(hookParam.getCallId());
|
||||||
return mediaArrivalEvent;
|
return mediaArrivalEvent;
|
||||||
}
|
}
|
||||||
|
public static MediaArrivalEvent getInstance(Object source, OnStreamArriveABLHookParam hookParam, MediaServer mediaServer){
|
||||||
|
MediaArrivalEvent mediaArrivalEvent = new MediaArrivalEvent(source);
|
||||||
|
mediaArrivalEvent.setMediaInfo(MediaInfo.getInstance(hookParam, mediaServer));
|
||||||
|
mediaArrivalEvent.setApp(hookParam.getApp());
|
||||||
|
mediaArrivalEvent.setStream(hookParam.getStream());
|
||||||
|
mediaArrivalEvent.setMediaServer(mediaServer);
|
||||||
|
mediaArrivalEvent.setCallId(hookParam.getCallId());
|
||||||
|
return mediaArrivalEvent;
|
||||||
|
}
|
||||||
|
|
||||||
private MediaInfo mediaInfo;
|
private MediaInfo mediaInfo;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.genersoft.iot.vmp.media.event.media;
|
package com.genersoft.iot.vmp.media.event.media;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.hook.ABLHookParam;
|
||||||
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamChangedHookParam;
|
||||||
|
|
||||||
|
@ -19,4 +20,12 @@ public class MediaDepartureEvent extends MediaEvent {
|
||||||
mediaDepartureEven.setMediaServer(mediaServer);
|
mediaDepartureEven.setMediaServer(mediaServer);
|
||||||
return mediaDepartureEven;
|
return mediaDepartureEven;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MediaDepartureEvent getInstance(Object source, ABLHookParam hookParam, MediaServer mediaServer){
|
||||||
|
MediaDepartureEvent mediaDepartureEven = new MediaDepartureEvent(source);
|
||||||
|
mediaDepartureEven.setApp(hookParam.getApp());
|
||||||
|
mediaDepartureEven.setStream(hookParam.getStream());
|
||||||
|
mediaDepartureEven.setMediaServer(mediaServer);
|
||||||
|
return mediaDepartureEven;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.genersoft.iot.vmp.media.event.media;
|
package com.genersoft.iot.vmp.media.event.media;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.hook.ABLHookParam;
|
||||||
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamNotFoundHookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnStreamNotFoundHookParam;
|
||||||
|
|
||||||
|
@ -19,4 +20,12 @@ public class MediaNotFoundEvent extends MediaEvent {
|
||||||
mediaDepartureEven.setMediaServer(mediaServer);
|
mediaDepartureEven.setMediaServer(mediaServer);
|
||||||
return mediaDepartureEven;
|
return mediaDepartureEven;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MediaNotFoundEvent getInstance(Object source, ABLHookParam hookParam, MediaServer mediaServer){
|
||||||
|
MediaNotFoundEvent mediaDepartureEven = new MediaNotFoundEvent(source);
|
||||||
|
mediaDepartureEven.setApp(hookParam.getApp());
|
||||||
|
mediaDepartureEven.setStream(hookParam.getStream());
|
||||||
|
mediaDepartureEven.setMediaServer(mediaServer);
|
||||||
|
return mediaDepartureEven;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package com.genersoft.iot.vmp.media.event.media;
|
package com.genersoft.iot.vmp.media.event.media;
|
||||||
|
|
||||||
|
import com.genersoft.iot.vmp.media.abl.ABLHttpHookListener;
|
||||||
|
import com.genersoft.iot.vmp.media.abl.bean.hook.OnRecordMp4ABLHookParam;
|
||||||
import com.genersoft.iot.vmp.media.bean.RecordInfo;
|
import com.genersoft.iot.vmp.media.bean.RecordInfo;
|
||||||
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam;
|
import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRecordMp4HookParam;
|
||||||
|
@ -24,6 +26,16 @@ public class MediaRecordMp4Event extends MediaEvent {
|
||||||
return mediaRecordMp4Event;
|
return mediaRecordMp4Event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MediaRecordMp4Event getInstance(ABLHttpHookListener source, OnRecordMp4ABLHookParam hookParam, MediaServer mediaServer) {
|
||||||
|
MediaRecordMp4Event mediaRecordMp4Event = new MediaRecordMp4Event(source);
|
||||||
|
mediaRecordMp4Event.setApp(hookParam.getApp());
|
||||||
|
mediaRecordMp4Event.setStream(hookParam.getStream());
|
||||||
|
RecordInfo recordInfo = RecordInfo.getInstance(hookParam);
|
||||||
|
mediaRecordMp4Event.setRecordInfo(recordInfo);
|
||||||
|
mediaRecordMp4Event.setMediaServer(mediaServer);
|
||||||
|
return mediaRecordMp4Event;
|
||||||
|
}
|
||||||
|
|
||||||
public RecordInfo getRecordInfo() {
|
public RecordInfo getRecordInfo() {
|
||||||
return recordInfo;
|
return recordInfo;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,4 +2,4 @@ spring:
|
||||||
application:
|
application:
|
||||||
name: wvp
|
name: wvp
|
||||||
profiles:
|
profiles:
|
||||||
active: local
|
active: abl
|
Loading…
Reference in New Issue