去除媒体节点接入时过多的端口配置,端口使用媒体服务返回的端口,不再支持docker内网不一致的情况

This commit is contained in:
lin
2025-11-30 00:11:08 +08:00
parent f4ca65882f
commit 8674cc6213
9 changed files with 157 additions and 245 deletions

View File

@@ -44,42 +44,6 @@ public class MediaConfig{
@Value("${media.http-port:0}")
private Integer httpPort;
@Value("${media.flv-port:0}")
private Integer flvPort = 0;
@Value("${media.mp4-port:0}")
private Integer mp4Port = 0;
@Value("${media.ws-flv-port:0}")
private Integer wsFlvPort = 0;
@Value("${media.http-ssl-port:0}")
private Integer httpSSlPort = 0;
@Value("${media.flv-ssl-port:0}")
private Integer flvSSlPort = 0;
@Value("${media.ws-flv-ssl-port:0}")
private Integer wsFlvSSlPort = 0;
@Value("${media.rtmp-port:0}")
private Integer rtmpPort = 0;
@Value("${media.rtmp-ssl-port:0}")
private Integer rtmpSSlPort = 0;
@Value("${media.rtp-proxy-port:0}")
private Integer rtpProxyPort = 0;
@Value("${media.jtt-proxy-port:0}")
private Integer jttProxyPort = 0;
@Value("${media.rtsp-port:0}")
private Integer rtspPort = 0;
@Value("${media.rtsp-ssl-port:0}")
private Integer rtspSSLPort = 0;
@Value("${media.auto-config:true}")
private boolean autoConfig = true;
@@ -108,24 +72,6 @@ public class MediaConfig{
private String type;
public int getRtpProxyPort() {
if (rtpProxyPort == null) {
return 0;
}else {
return rtpProxyPort;
}
}
public Integer getJttProxyPort() {
if (jttProxyPort == null) {
return 0;
}else {
return jttProxyPort;
}
}
public String getSdpIp() {
if (ObjectUtils.isEmpty(sdpIp)){
return ip;
@@ -153,7 +99,7 @@ public class MediaConfig{
}
}
public MediaServer getMediaSerItem(){
public MediaServer buildMediaSer(){
MediaServer mediaServer = new MediaServer();
mediaServer.setId(id);
mediaServer.setIp(ip);
@@ -162,19 +108,6 @@ public class MediaConfig{
mediaServer.setSdpIp(getSdpIp());
mediaServer.setStreamIp(getStreamIp());
mediaServer.setHttpPort(httpPort);
mediaServer.setFlvPort(flvPort);
mediaServer.setMp4Port(mp4Port);
mediaServer.setWsFlvPort(wsFlvPort);
mediaServer.setFlvSSLPort(flvSSlPort);
mediaServer.setWsFlvSSLPort(wsFlvSSlPort);
mediaServer.setHttpSSlPort(httpSSlPort);
mediaServer.setRtmpPort(rtmpPort);
mediaServer.setRtmpSSlPort(rtmpSSlPort);
mediaServer.setRtpProxyPort(getRtpProxyPort());
mediaServer.setJttProxyPort(getJttProxyPort());
mediaServer.setRtspPort(rtspPort);
mediaServer.setRtspSSLPort(rtspSSLPort);
mediaServer.setAutoConfig(autoConfig);
mediaServer.setSecret(secret);
mediaServer.setRtpEnable(rtpEnable);

View File

@@ -39,26 +39,14 @@ public class MediaServerConfig implements CommandLineRunner {
public void run(String... strings) throws Exception {
// 清理所有在线节点的缓存信息
mediaServerService.clearMediaServerForOnline();
MediaServer defaultMediaServer = mediaServerService.getDefaultMediaServer();
MediaServer mediaSerItemInConfig = mediaConfig.getMediaSerItem();
MediaServer mediaSerItemInConfig = mediaConfig.buildMediaSer();
mediaSerItemInConfig.setServerId(userSetting.getServerId());
if (defaultMediaServer != null && mediaSerItemInConfig.getId().equals(defaultMediaServer.getId())) {
mediaServerService.update(mediaSerItemInConfig);
}else {
if (defaultMediaServer != null) {
mediaServerService.delete(defaultMediaServer);
}
MediaServer mediaServerItem = mediaServerService.getOneFromDatabase(mediaSerItemInConfig.getId());
if (mediaServerItem == null) {
mediaServerService.add(mediaSerItemInConfig);
}else {
mediaServerService.update(mediaSerItemInConfig);
}
}
mediaServerService.deleteDefault();
// 发送媒体节点变化事件
mediaServerService.syncCatchFromDatabase();
// 获取所有的zlm 并开启主动连接
List<MediaServer> all = mediaServerService.getAllFromDatabase();
List<MediaServer> all = mediaServerService.getAllFromDatabaseWithOutDefault();
all.add(mediaSerItemInConfig);
log.info("[媒体节点] 加载节点列表, 共{}个节点", all.size());
MediaServerChangeEvent event = new MediaServerChangeEvent(this);
event.setMediaServerItemList(all);

View File

@@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.media.abl;
import com.alibaba.fastjson2.JSONArray;
import com.genersoft.iot.vmp.conf.DynamicTask;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
import com.genersoft.iot.vmp.media.abl.bean.ABLResult;
import com.genersoft.iot.vmp.media.abl.bean.AblServerConfig;
import com.genersoft.iot.vmp.media.abl.bean.ConfigKeyId;
@@ -12,8 +13,7 @@ import com.genersoft.iot.vmp.media.bean.MediaServer;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.event.EventListener;
@@ -29,10 +29,9 @@ import java.util.concurrent.ConcurrentHashMap;
* 管理zlm流媒体节点的状态
*/
@Component
@Slf4j
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<>();
@@ -55,6 +54,9 @@ public class ABLMediaServerStatusManger {
@Autowired
private UserSetting userSetting;
@Autowired
private EventPublisher eventPublisher;
private final String type = "abl";
@Async("taskExecutor")
@@ -68,7 +70,7 @@ public class ABLMediaServerStatusManger {
if (!type.equals(mediaServer.getType())) {
continue;
}
logger.info("[ABL-添加待上线节点] ID" + mediaServer.getId());
log.info("[ABL-添加待上线节点] ID" + mediaServer.getId());
offlineABLPrimaryMap.put(mediaServer.getId(), mediaServer);
offlineAblTimeMap.put(mediaServer.getId(), System.currentTimeMillis());
}
@@ -87,7 +89,7 @@ public class ABLMediaServerStatusManger {
if (serverItem == null) {
return;
}
logger.info("[ABL-HOOK事件-服务启动] ID" + event.getMediaServerItem().getId());
log.info("[ABL-HOOK事件-服务启动] ID" + event.getMediaServerItem().getId());
online(serverItem, null);
}
@@ -101,7 +103,7 @@ public class ABLMediaServerStatusManger {
if (serverItem == null) {
return;
}
logger.info("[ABL-HOOK事件-心跳] ID" + event.getMediaServerItem().getId());
log.info("[ABL-HOOK事件-心跳] ID" + event.getMediaServerItem().getId());
online(serverItem, null);
}
@@ -111,7 +113,7 @@ public class ABLMediaServerStatusManger {
if (event.getMediaServer() == null) {
return;
}
logger.info("[ABL-节点被移除] ID" + event.getMediaServer().getServerId());
log.info("[ABL-节点被移除] ID" + event.getMediaServer().getServerId());
offlineABLPrimaryMap.remove(event.getMediaServer().getServerId());
offlineAblsecondaryMap.remove(event.getMediaServer().getServerId());
offlineAblTimeMap.remove(event.getMediaServer().getServerId());
@@ -130,17 +132,17 @@ public class ABLMediaServerStatusManger {
offlineABLPrimaryMap.remove(mediaServerItem.getId());
continue;
}
logger.info("[ABL-尝试连接] ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
log.info("[ABL-尝试连接] ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServerItem);
AblServerConfig ablServerConfig = null;
if (ablResult.getCode() != 0) {
logger.info("[ABL-尝试连接]失败, ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
log.info("[ABL-尝试连接]失败, ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
continue;
}
JSONArray params = ablResult.getParams();
if (params == null || params.isEmpty()) {
logger.info("[ABL-尝试连接]失败, ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
log.info("[ABL-尝试连接]失败, ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
}else {
ablServerConfig = AblServerConfig.getInstance(params);
initPort(mediaServerItem, ablServerConfig);
@@ -153,17 +155,17 @@ public class ABLMediaServerStatusManger {
if (offlineAblTimeMap.get(mediaServerItem.getId()) < System.currentTimeMillis() - 30*60*1000) {
continue;
}
logger.info("[ABL-尝试连接] ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
log.info("[ABL-尝试连接] ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServerItem);
AblServerConfig ablServerConfig = null;
if (ablResult.getCode() != 0) {
logger.info("[ABL-尝试连接]失败, ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
log.info("[ABL-尝试连接]失败, ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
continue;
}
JSONArray params = ablResult.getParams();
if (params == null || params.isEmpty()) {
logger.info("[ABL-尝试连接]失败, ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
log.info("[ABL-尝试连接]失败, ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
}else {
ablServerConfig = AblServerConfig.getInstance(params);
@@ -175,33 +177,30 @@ public class ABLMediaServerStatusManger {
}
private void online(MediaServer mediaServer, AblServerConfig config) {
if (config == null) {
ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServer);
JSONArray data = ablResult.getParams();
if (data != null && !data.isEmpty()) {
config = AblServerConfig.getInstance(data);
}else {
log.info("[ABL-连接成功] 读取流媒体配置失败 ID{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort());
return;
}
}
offlineABLPrimaryMap.remove(mediaServer.getId());
offlineAblsecondaryMap.remove(mediaServer.getId());
offlineAblTimeMap.remove(mediaServer.getId());
if (!mediaServer.isStatus()) {
logger.info("[ABL-连接成功] ID{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort());
mediaServer.setStatus(true);
mediaServer.setHookAliveInterval(10F);
mediaServerService.update(mediaServer);
if(mediaServer.isAutoConfig()) {
if (config == null) {
ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServer);
JSONArray data = ablResult.getParams();
if (data != null && !data.isEmpty()) {
config = AblServerConfig.getInstance(data);
}
}
if (config != null) {
initPort(mediaServer, config);
setAblConfig(mediaServer, false, config);
}
}
mediaServerService.update(mediaServer);
}
log.info("[ABL-连接成功] ID{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort());
mediaServer.setStatus(true);
mediaServer.setHookAliveInterval(10F);
initPort(mediaServer, config);
// 发送上线通知
eventPublisher.mediaServerOnlineEventPublish(mediaServer);
mediaServerService.update(mediaServer);
// 设置两次心跳未收到则认为zlm离线
String key = "ABL-keepalive-" + mediaServer.getId();
dynamicTask.startDelay(key, ()->{
logger.warn("[ABL-心跳超时] ID{}", mediaServer.getId());
log.warn("[ABL-心跳超时] ID{}", mediaServer.getId());
mediaServer.setStatus(false);
offlineABLPrimaryMap.put(mediaServer.getId(), mediaServer);
offlineAblTimeMap.put(mediaServer.getId(), System.currentTimeMillis());
@@ -238,16 +237,16 @@ public class ABLMediaServerStatusManger {
public void setAblConfig(MediaServer mediaServerItem, boolean restart, AblServerConfig config) {
try {
if (config.getHookEnable() == 0) {
logger.info("[媒体服务节点-ABL] 开启HOOK功能 {}", mediaServerItem.getId());
log.info("[媒体服务节点-ABL] 开启HOOK功能 {}", mediaServerItem.getId());
ABLResult ablResult = ablResTfulUtils.setConfigParamValue(mediaServerItem, "hook_enable", "1");
if (ablResult.getCode() == 0) {
logger.info("[媒体服务节点-ABL] 开启HOOK功能成功 {}", mediaServerItem.getId());
log.info("[媒体服务节点-ABL] 开启HOOK功能成功 {}", mediaServerItem.getId());
}else {
logger.info("[媒体服务节点-ABL] 开启HOOK功能失败 {}->{}", mediaServerItem.getId(), ablResult.getMemo());
log.info("[媒体服务节点-ABL] 开启HOOK功能失败 {}->{}", mediaServerItem.getId(), ablResult.getMemo());
}
}
}catch (Exception e) {
logger.info("[媒体服务节点-ABL] 开启HOOK功能失败 {}", mediaServerItem.getId(), e);
log.info("[媒体服务节点-ABL] 开启HOOK功能失败 {}", mediaServerItem.getId(), e);
}
// 设置相关的HOOK
String[] hookUrlArray = {
@@ -280,16 +279,16 @@ public class ABLMediaServerStatusManger {
if (!hookUrl.equals(field.get(config))) {
ABLResult ablResult = ablResTfulUtils.setConfigParamValue(mediaServerItem, hook, hookUrl);
if (ablResult.getCode() == 0) {
logger.info("[媒体服务节点-ABL] 设置HOOK {} 成功 {}", hook, mediaServerItem.getId());
log.info("[媒体服务节点-ABL] 设置HOOK {} 成功 {}", hook, mediaServerItem.getId());
}else {
logger.info("[媒体服务节点-ABL] 设置HOOK {} 失败 {}->{}", hook, mediaServerItem.getId(), ablResult.getMemo());
log.info("[媒体服务节点-ABL] 设置HOOK {} 失败 {}->{}", hook, mediaServerItem.getId(), ablResult.getMemo());
}
}
}
}
}
}catch (Exception e) {
logger.info("[媒体服务节点-ABL] 设置HOOK 失败 {}", mediaServerItem.getId(), e);
log.info("[媒体服务节点-ABL] 设置HOOK 失败 {}", mediaServerItem.getId(), e);
}
}
@@ -342,15 +341,15 @@ public class ABLMediaServerStatusManger {
//
// if (responseJSON != null && responseJSON.getInteger("code") == 0) {
// if (restart) {
// logger.info("[媒体服务节点] 设置成功,开始重启以保证配置生效 {} -> {}:{}",
// log.info("[媒体服务节点] 设置成功,开始重启以保证配置生效 {} -> {}:{}",
// mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
// ablResTfulUtils.restartServer(mediaServerItem);
// }else {
// logger.info("[媒体服务节点] 设置成功 {} -> {}:{}",
// log.info("[媒体服务节点] 设置成功 {} -> {}:{}",
// mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
// }
// }else {
// logger.info("[媒体服务节点] 设置媒体服务节点失败 {} -> {}:{}",
// log.info("[媒体服务节点] 设置媒体服务节点失败 {} -> {}:{}",
// mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
// }
}

View File

@@ -22,7 +22,7 @@ public interface IMediaServerService {
List<MediaServer> getAll();
List<MediaServer> getAllFromDatabase();
List<MediaServer> getAllFromDatabaseWithOutDefault();
List<MediaServer> getAllOnline();
@@ -175,4 +175,7 @@ public interface IMediaServerService {
DownloadFileInfo getDownloadFilePath(MediaServer mediaServer, RecordInfo recordInfo);
void loadMP4File(MediaServer mediaServer, String app, String stream, String filePath, String fileName, ErrorCallback<StreamInfo> callback);
void deleteDefault();
}

View File

@@ -340,7 +340,12 @@ public class MediaServerServiceImpl implements IMediaServerService {
@Override
public void update(MediaServer mediaSerItem) {
mediaServerMapper.update(mediaSerItem);
if (mediaServerMapper.queryOne(mediaSerItem.getId(), userSetting.getServerId()) != null) {
mediaServerMapper.update(mediaSerItem);
}else {
mediaServerMapper.add(mediaSerItem);
}
MediaServer mediaServerInRedis = getOne(mediaSerItem.getId());
// 获取完整数据
MediaServer mediaServerInDataBase = mediaServerMapper.queryOne(mediaSerItem.getId(), userSetting.getServerId());
@@ -409,8 +414,8 @@ public class MediaServerServiceImpl implements IMediaServerService {
@Override
public List<MediaServer> getAllFromDatabase() {
return mediaServerMapper.queryAll(userSetting.getServerId());
public List<MediaServer> getAllFromDatabaseWithOutDefault() {
return mediaServerMapper.queryAllWithOutDefault(userSetting.getServerId());
}
@Override
@@ -441,7 +446,15 @@ public class MediaServerServiceImpl implements IMediaServerService {
return null;
}
String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId();
return (MediaServer) redisTemplate.opsForHash().get(key, mediaServerId);
MediaServer mediaServer = (MediaServer) redisTemplate.opsForHash().get(key, mediaServerId);
if (mediaServer == null) {
// 尝试从数据库获取
mediaServer = mediaServerMapper.queryOne(mediaServerId, userSetting.getServerId());
if (mediaServer != null) {
redisTemplate.opsForHash().put(key, mediaServer.getId(), mediaServer);
}
}
return mediaServer;
}
/**
@@ -992,6 +1005,11 @@ public class MediaServerServiceImpl implements IMediaServerService {
mediaNodeServerService.loadMP4File(mediaServer, app, stream, filePath, fileName, callback);
}
@Override
public void deleteDefault() {
mediaServerMapper.deleteDefault(userSetting.getServerId());
}
@Override
public void seekRecordStamp(MediaServer mediaServer, String app, String stream, Double stamp, String schema) {
IMediaNodeServerService mediaNodeServerService = nodeServerServiceMap.get(mediaServer.getType());

View File

@@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.media.zlm;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.conf.MediaConfig;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.media.bean.MediaServer;
import com.genersoft.iot.vmp.media.bean.ResultForOnPublish;
@@ -26,6 +27,7 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* @description:针对 ZLMediaServer的hook事件监听
@@ -44,6 +46,9 @@ public class ZLMHttpHookListener {
@Autowired
private IMediaService mediaService;
@Autowired
private MediaConfig mediaConfig;
@Autowired
private UserSetting userSetting;
@@ -226,13 +231,19 @@ public class ZLMHttpHookListener {
jsonObject.put("ip", request.getRemoteAddr());
ZLMServerConfig zlmServerConfig = JSON.to(ZLMServerConfig.class, jsonObject);
zlmServerConfig.setIp(request.getRemoteAddr());
log.info("[ZLM HOOK] zlm 启动 " + zlmServerConfig.getGeneralMediaServerId());
log.info("[ZLM HOOK] zlm 启动 {}", zlmServerConfig.getGeneralMediaServerId());
try {
HookZlmServerStartEvent event = new HookZlmServerStartEvent(this);
MediaServer mediaServerItem = mediaServerService.getOne(zlmServerConfig.getMediaServerId());
if (mediaServerItem != null) {
event.setMediaServerItem(mediaServerItem);
MediaServer mediaServer = mediaServerService.getOne(zlmServerConfig.getMediaServerId());
if (mediaServer == null && Objects.equals(mediaConfig.getId(), zlmServerConfig.getGeneralMediaServerId())) {
mediaServer = mediaConfig.buildMediaSer();
}
if (mediaServer != null) {
event.setMediaServer(mediaServer);
event.setConfig(zlmServerConfig);
applicationEventPublisher.publishEvent(event);
}else {
log.info("[ZLM HOOK] 此zlm未接入 {}", zlmServerConfig.getGeneralMediaServerId());
}
}catch (Exception e) {
log.info("[ZLM-HOOK-ZLM启动] 发送通知失败 ", e);

View File

@@ -73,7 +73,7 @@ public class ZLMMediaServerStatusManager {
if (!type.equals(mediaServerItem.getType())) {
continue;
}
log.info("[ZLM-添加待上线节点] ID" + mediaServerItem.getId());
log.info("[ZLM-添加待上线节点] ID{}", mediaServerItem.getId());
offlineZlmPrimaryMap.put(mediaServerItem.getId(), mediaServerItem);
offlineZlmTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
execute();
@@ -83,17 +83,13 @@ public class ZLMMediaServerStatusManager {
@Async("taskExecutor")
@EventListener
public void onApplicationEvent(HookZlmServerStartEvent event) {
if (event.getMediaServerItem() == null
|| !type.equals(event.getMediaServerItem().getType())
|| event.getMediaServerItem().isStatus()) {
if (event.getMediaServer() == null
|| !type.equals(event.getMediaServer().getType())
|| event.getMediaServer().isStatus()) {
return;
}
MediaServer serverItem = mediaServerService.getOne(event.getMediaServerItem().getId());
if (serverItem == null) {
return;
}
log.info("[ZLM-HOOK事件-服务启动] ID" + event.getMediaServerItem().getId());
online(serverItem, null);
log.info("[ZLM-HOOK事件-服务启动] ID{}", event.getMediaServer().getId());
online(event.getMediaServer(), event.getConfig());
}
@Async("taskExecutor")
@@ -102,12 +98,12 @@ public class ZLMMediaServerStatusManager {
if (event.getMediaServerItem() == null) {
return;
}
MediaServer serverItem = mediaServerService.getOne(event.getMediaServerItem().getId());
if (serverItem == null) {
MediaServer mediaServer = mediaServerService.getOne(event.getMediaServerItem().getId());
if (mediaServer == null) {
return;
}
log.debug("[ZLM-HOOK事件-心跳] ID" + event.getMediaServerItem().getId());
online(serverItem, null);
log.debug("[ZLM-HOOK事件-心跳] ID{}", event.getMediaServerItem().getId());
online(mediaServer, null);
}
@Async("taskExecutor")
@@ -179,70 +175,49 @@ public class ZLMMediaServerStatusManager {
}
}
private void online(MediaServer mediaServerItem, ZLMServerConfig config) {
offlineZlmPrimaryMap.remove(mediaServerItem.getId());
offlineZlmsecondaryMap.remove(mediaServerItem.getId());
offlineZlmTimeMap.remove(mediaServerItem.getId());
if (!mediaServerItem.isStatus()) {
log.info("[ZLM-连接成功] ID{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort());
mediaServerItem.setStatus(true);
mediaServerItem.setHookAliveInterval(10F);
// 发送上线通知
eventPublisher.mediaServerOnlineEventPublish(mediaServerItem);
if(mediaServerItem.isAutoConfig()) {
if (config == null) {
ZLMResult<List<JSONObject>> mediaServerConfig = zlmresTfulUtils.getMediaServerConfig(mediaServerItem);
List<JSONObject> data = mediaServerConfig.getData();
if (data != null && !data.isEmpty()) {
config = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class);
}
}
if (config != null) {
initPort(mediaServerItem, config);
setZLMConfig(mediaServerItem, "0".equals(config.getHookEnable())
|| !Objects.equals(mediaServerItem.getHookAliveInterval(), config.getHookAliveInterval()));
}
private void online(MediaServer mediaServer, ZLMServerConfig config) {
if (config == null) {
ZLMResult<List<JSONObject>> mediaServerConfig = zlmresTfulUtils.getMediaServerConfig(mediaServer);
List<JSONObject> data = mediaServerConfig.getData();
if (data != null && !data.isEmpty()) {
config = JSON.parseObject(JSON.toJSONString(data.get(0)), ZLMServerConfig.class);
}else {
log.info("[ZLM-连接成功] 读取流媒体配置失败 ID{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort());
return;
}
mediaServerService.update(mediaServerItem);
}
offlineZlmPrimaryMap.remove(mediaServer.getId());
offlineZlmsecondaryMap.remove(mediaServer.getId());
offlineZlmTimeMap.remove(mediaServer.getId());
mediaServer.setStatus(true);
mediaServer.setHookAliveInterval(config.getHookAliveInterval());
initPort(mediaServer, config);
log.info("[ZLM-连接成功] ID{}, 地址: {}:{}", mediaServer.getId(), mediaServer.getIp(), mediaServer.getHttpPort());
// 发送上线通知
eventPublisher.mediaServerOnlineEventPublish(mediaServer);
mediaServerService.update(mediaServer);
// 设置两次心跳未收到则认为zlm离线
String key = "zlm-keepalive-" + mediaServerItem.getId();
String key = "zlm-keepalive-" + mediaServer.getId();
dynamicTask.startDelay(key, ()->{
log.warn("[ZLM-心跳超时] ID{}", mediaServerItem.getId());
mediaServerItem.setStatus(false);
offlineZlmPrimaryMap.put(mediaServerItem.getId(), mediaServerItem);
offlineZlmTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis());
log.warn("[ZLM-心跳超时] ID{}", mediaServer.getId());
mediaServer.setStatus(false);
offlineZlmPrimaryMap.put(mediaServer.getId(), mediaServer);
offlineZlmTimeMap.put(mediaServer.getId(), System.currentTimeMillis());
// 发送离线通知
eventPublisher.mediaServerOfflineEventPublish(mediaServerItem);
mediaServerService.update(mediaServerItem);
}, (int)(mediaServerItem.getHookAliveInterval() * 2 * 1000));
eventPublisher.mediaServerOfflineEventPublish(mediaServer);
mediaServerService.update(mediaServer);
}, (int)(mediaServer.getHookAliveInterval() * 2 * 1000));
}
private void initPort(MediaServer mediaServerItem, ZLMServerConfig zlmServerConfig) {
// 端口只会从配置中读取一次,一旦自己配置或者读取过了将不在配置
if (mediaServerItem.getHttpSSlPort() == 0) {
mediaServerItem.setHttpSSlPort(zlmServerConfig.getHttpSSLport());
}
if (mediaServerItem.getRtmpPort() == 0) {
mediaServerItem.setRtmpPort(zlmServerConfig.getRtmpPort());
}
if (mediaServerItem.getRtmpSSlPort() == 0) {
mediaServerItem.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort());
}
if (mediaServerItem.getRtspPort() == 0) {
mediaServerItem.setRtspPort(zlmServerConfig.getRtspPort());
}
if (mediaServerItem.getRtspSSLPort() == 0) {
mediaServerItem.setRtspSSLPort(zlmServerConfig.getRtspSSlport());
}
if (mediaServerItem.getRtpProxyPort() == 0) {
mediaServerItem.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
}
if (mediaServerItem.getFlvSSLPort() == 0) {
mediaServerItem.setFlvSSLPort(zlmServerConfig.getHttpSSLport());
}
if (mediaServerItem.getWsFlvSSLPort() == 0) {
mediaServerItem.setWsFlvSSLPort(zlmServerConfig.getHttpSSLport());
}
mediaServerItem.setHttpSSlPort(zlmServerConfig.getHttpSSLport());
mediaServerItem.setRtmpPort(zlmServerConfig.getRtmpPort());
mediaServerItem.setRtmpSSlPort(zlmServerConfig.getRtmpSslPort());
mediaServerItem.setRtspPort(zlmServerConfig.getRtspPort());
mediaServerItem.setRtspSSLPort(zlmServerConfig.getRtspSSlport());
mediaServerItem.setRtpProxyPort(zlmServerConfig.getRtpProxyPort());
mediaServerItem.setFlvSSLPort(zlmServerConfig.getHttpSSLport());
mediaServerItem.setWsFlvSSLPort(zlmServerConfig.getHttpSSLport());
if (Objects.isNull(zlmServerConfig.getTranscodeSuffix())) {
mediaServerItem.setTranscodeSuffix(null);
}else {

View File

@@ -1,24 +1,23 @@
package com.genersoft.iot.vmp.media.zlm.event;
import com.genersoft.iot.vmp.media.bean.MediaServer;
import com.genersoft.iot.vmp.media.zlm.dto.ZLMServerConfig;
import lombok.Getter;
import lombok.Setter;
import org.springframework.context.ApplicationEvent;
/**
* zlm server_start事件
*/
@Setter
@Getter
public class HookZlmServerStartEvent extends ApplicationEvent {
public HookZlmServerStartEvent(Object source) {
super(source);
}
private MediaServer mediaServerItem;
private MediaServer mediaServer;
private ZLMServerConfig config;
public MediaServer getMediaServerItem() {
return mediaServerItem;
}
public void setMediaServerItem(MediaServer mediaServerItem) {
this.mediaServerItem = mediaServerItem;
}
}

View File

@@ -86,34 +86,15 @@ public interface MediaServerMapper {
@Update(value = {" <script>" +
"UPDATE wvp_media_server " +
"SET update_time=#{updateTime}, transcode_suffix=#{transcodeSuffix} " +
"<if test=\"ip != null\">, ip=#{ip}</if>" +
"<if test=\"hookIp != null\">, hook_ip=#{hookIp}</if>" +
"<if test=\"sdpIp != null\">, sdp_ip=#{sdpIp}</if>" +
"<if test=\"streamIp != null\">, stream_ip=#{streamIp}</if>" +
"<if test=\"httpPort != null\">, http_port=#{httpPort}</if>" +
"<if test=\"httpSSlPort != null\">, http_ssl_port=#{httpSSlPort}</if>" +
"<if test=\"rtmpPort != null\">, rtmp_port=#{rtmpPort}</if>" +
"<if test=\"rtmpSSlPort != null\">, rtmp_ssl_port=#{rtmpSSlPort}</if>" +
"<if test=\"rtpProxyPort != null\">, rtp_proxy_port=#{rtpProxyPort}</if>" +
"<if test=\"jttProxyPort != null\">, jtt_proxy_port=#{jttProxyPort}</if>" +
"<if test=\"rtspPort != null\">, rtsp_port=#{rtspPort}</if>" +
"<if test=\"rtspSSLPort != null\">, rtsp_ssl_port=#{rtspSSLPort}</if>" +
"<if test=\"flvPort != null\">, flv_port=#{flvPort}</if>" +
"<if test=\"mp4Port != null\">, mp4_port=#{mp4Port}</if>" +
"<if test=\"flvSSLPort != null\">, flv_ssl_port=#{flvSSLPort}</if>" +
"<if test=\"wsFlvPort != null\">, ws_flv_port=#{wsFlvPort}</if>" +
"<if test=\"wsFlvSSLPort != null\">, ws_flv_ssl_port=#{wsFlvSSLPort}</if>" +
"<if test=\"autoConfig != null\">, auto_config=#{autoConfig}</if>" +
"<if test=\"rtpEnable != null\">, rtp_enable=#{rtpEnable}</if>" +
"<if test=\"rtpPortRange != null\">, rtp_port_range=#{rtpPortRange}</if>" +
"<if test=\"sendRtpPortRange != null\">, send_rtp_port_range=#{sendRtpPortRange}</if>" +
"<if test=\"secret != null\">, secret=#{secret}</if>" +
"<if test=\"recordAssistPort != null\">, record_assist_port=#{recordAssistPort}</if>" +
"<if test=\"hookAliveInterval != null\">, hook_alive_interval=#{hookAliveInterval}</if>" +
"<if test=\"recordDay != null\">, record_day=#{recordDay}</if>" +
"<if test=\"recordPath != null\">, record_path=#{recordPath}</if>" +
"<if test=\"serverId != null\">, server_id=#{serverId}</if>" +
"<if test=\"type != null\">, type=#{type}</if>" +
", ip=#{ip}, hook_ip=#{hookIp}, sdp_ip=#{sdpIp}, stream_ip=#{streamIp}, http_port=#{httpPort}" +
", http_ssl_port=#{httpSSlPort}, rtmp_port=#{rtmpPort}, rtmp_ssl_port=#{rtmpSSlPort}" +
", rtp_proxy_port=#{rtpProxyPort}, jtt_proxy_port=#{jttProxyPort}, rtsp_port=#{rtspPort}" +
", rtsp_ssl_port=#{rtspSSLPort}, flv_port=#{flvPort}, mp4_port=#{mp4Port}" +
", flv_ssl_port=#{flvSSLPort}, ws_flv_port=#{wsFlvPort}, ws_flv_ssl_port=#{wsFlvSSLPort}" +
", auto_config=#{autoConfig}, rtp_enable=#{rtpEnable}, rtp_port_range=#{rtpPortRange}" +
", send_rtp_port_range=#{sendRtpPortRange}, secret=#{secret}, record_assist_port=#{recordAssistPort}" +
", hook_alive_interval=#{hookAliveInterval}, record_day=#{recordDay}, record_path=#{recordPath}" +
", server_id=#{serverId}, type=#{type}" +
"WHERE id=#{id}"+
" </script>"})
int update(MediaServer mediaServerItem);
@@ -159,6 +140,9 @@ public interface MediaServerMapper {
@Select("SELECT * FROM wvp_media_server where server_id = #{serverId}")
List<MediaServer> queryAll(@Param("serverId") String serverId);
@Select("SELECT * FROM wvp_media_server where default_server=false AND server_id = #{serverId}")
List<MediaServer> queryAllWithOutDefault(@Param("serverId") String serverId);
@Delete("DELETE FROM wvp_media_server WHERE id=#{id} and server_id = #{serverId}")
void delOne(String id, @Param("serverId") String serverId);
@@ -171,4 +155,6 @@ public interface MediaServerMapper {
@Select("SELECT * FROM wvp_media_server WHERE record_assist_port > 0 and server_id = #{serverId}")
List<MediaServer> queryAllWithAssistPort(@Param("serverId") String serverId);
@Delete("DELETE FROM wvp_media_server WHERE default_server=true and server_id = #{serverId}")
void deleteDefault(@Param("serverId") String serverId);
}