From 764d04b497356ba6bcbb75fd42b51eca750f7223 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期三, 29 五月 2024 15:02:51 +0800 Subject: [PATCH] 调整上级观看消息的发送 --- src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java | 621 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 507 insertions(+), 114 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java old mode 100644 new mode 100755 index fe49c3b..d3f69d6 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java @@ -1,47 +1,78 @@ package com.genersoft.iot.vmp.service.impl; -import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.gb28181.bean.GbStream; -import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; -import com.genersoft.iot.vmp.media.zlm.dto.IMediaServerItem; -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.genersoft.iot.vmp.common.GeneralCallback; +import com.genersoft.iot.vmp.common.StreamInfo; +import com.genersoft.iot.vmp.conf.DynamicTask; +import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.conf.exception.ControllerException; +import com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent; +import com.genersoft.iot.vmp.media.bean.MediaInfo; +import com.genersoft.iot.vmp.media.bean.MediaServer; +import com.genersoft.iot.vmp.media.event.hook.Hook; +import com.genersoft.iot.vmp.media.event.hook.HookSubscribe; +import com.genersoft.iot.vmp.media.event.hook.HookType; +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.service.IMediaServerService; import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; import com.genersoft.iot.vmp.service.IGbStreamService; -import com.genersoft.iot.vmp.service.IMediaServerService; +import com.genersoft.iot.vmp.service.IStreamProxyService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; -import com.genersoft.iot.vmp.storager.IVideoManagerStorager; +import com.genersoft.iot.vmp.storager.IVideoManagerStorage; import com.genersoft.iot.vmp.storager.dao.GbStreamMapper; import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper; import com.genersoft.iot.vmp.storager.dao.StreamProxyMapper; -import com.genersoft.iot.vmp.service.IStreamProxyService; +import com.genersoft.iot.vmp.utils.DateUtil; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; +import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo; +import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import com.github.pagehelper.PageInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.TransactionStatus; +import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; -import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 瑙嗛浠g悊涓氬姟 */ @Service +@DS("master") public class StreamProxyServiceImpl implements IStreamProxyService { private final static Logger logger = LoggerFactory.getLogger(StreamProxyServiceImpl.class); @Autowired - private IVideoManagerStorager videoManagerStorager; + private IVideoManagerStorage videoManagerStorager; + + @Autowired + private StreamProxyMapper streamProxyMapper; @Autowired private IRedisCatchStorage redisCatchStorage; @Autowired - private ZLMRESTfulUtils zlmresTfulUtils;; + private IVideoManagerStorage storager; @Autowired - private StreamProxyMapper streamProxyMapper; + private UserSetting userSetting; @Autowired private GbStreamMapper gbStreamMapper; @@ -55,94 +86,310 @@ @Autowired private IMediaServerService mediaServerService; + @Autowired + private HookSubscribe hookSubscribe; - @Override - public String save(StreamProxyItem param) { - IMediaServerItem mediaInfo; - if ("auto".equals(param.getMediaServerId())){ - mediaInfo = mediaServerService.getMediaServerForMinimumLoad(); - }else { - mediaInfo = mediaServerService.getOne(param.getMediaServerId()); - } - if (mediaInfo == null) { - logger.warn("淇濆瓨浠g悊鏈壘鍒板湪绾跨殑ZLM..."); - return "淇濆瓨澶辫触"; - } - String dstUrl = String.format("rtmp://%s:%s/%s/%s", "127.0.0.1", mediaInfo.getRtmpPort(), param.getApp(), - param.getStream() ); - param.setDst_url(dstUrl); - StringBuffer result = new StringBuffer(); - boolean streamLive = false; - param.setMediaServerId(mediaInfo.getId()); - // 鏇存柊 - if (videoManagerStorager.queryStreamProxy(param.getApp(), param.getStream()) != null) { - if (videoManagerStorager.updateStreamProxy(param)) { - result.append("淇濆瓨鎴愬姛"); - if (param.isEnable()){ - JSONObject jsonObject = addStreamProxyToZlm(param); - if (jsonObject == null) { - result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤"); - param.setEnable(false); - videoManagerStorager.updateStreamProxy(param); - } - } - } - }else { // 鏂板 - if (videoManagerStorager.addStreamProxy(param)){ - result.append("淇濆瓨鎴愬姛"); - streamLive = true; - if (param.isEnable()) { - JSONObject jsonObject = addStreamProxyToZlm(param); - if (jsonObject == null) { - streamLive = false; - result.append(", 浣嗘槸鍚敤澶辫触锛岃妫�鏌ユ祦鍦板潃鏄惁鍙敤"); - param.setEnable(false); - videoManagerStorager.updateStreamProxy(param); - } - } - }else { - result.append("淇濆瓨澶辫触"); - } + @Autowired + private DynamicTask dynamicTask; + @Autowired + DataSourceTransactionManager dataSourceTransactionManager; + + @Autowired + TransactionDefinition transactionDefinition; + + /** + * 娴佸埌鏉ョ殑澶勭悊 + */ + @Async("taskExecutor") + @org.springframework.context.event.EventListener + public void onApplicationEvent(MediaArrivalEvent event) { + if ("rtsp".equals(event.getSchema())) { + updateStatus(true, event.getApp(), event.getStream()); } - if (param.getPlatformGbId() != null && streamLive) { - List<GbStream> gbStreams = new ArrayList<>(); - gbStreams.add(param); - if (gbStreamService.addPlatformInfo(gbStreams, param.getPlatformGbId())){ - result.append(", 鍏宠仈鍥芥爣骞冲彴[ " + param.getPlatformGbId() + " ]鎴愬姛"); - }else { - result.append(", 鍏宠仈鍥芥爣骞冲彴[ " + param.getPlatformGbId() + " ]澶辫触"); - } - } - return result.toString(); } - @Override - public JSONObject addStreamProxyToZlm(StreamProxyItem param) { - JSONObject result = null; - IMediaServerItem mediaServerItem = null; - if (param.getMediaServerId() == null) { - logger.warn("娣诲姞浠g悊鏃禡ediaServerId 涓簄ull"); - return null; - }else { - mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); + /** + * 娴佺寮�鐨勫鐞� + */ + @Async("taskExecutor") + @EventListener + public void onApplicationEvent(MediaDepartureEvent event) { + if ("rtsp".equals(event.getSchema())) { + updateStatus(false, event.getApp(), event.getStream()); } - if ("default".equals(param.getType())){ - result = zlmresTfulUtils.addStreamProxy(mediaServerItem, param.getApp(), param.getStream(), param.getUrl(), - param.isEnable_hls(), param.isEnable_mp4(), param.getRtp_type()); - }else if ("ffmpeg".equals(param.getType())) { - result = zlmresTfulUtils.addFFmpegSource(mediaServerItem, param.getSrc_url(), param.getDst_url(), - param.getTimeout_ms() + "", param.isEnable_hls(), param.isEnable_mp4(), - param.getFfmpeg_cmd_key()); + } + + /** + * 娴佺寮�鐨勫鐞� + */ + @Async("taskExecutor") + @EventListener + public void onApplicationEvent(MediaNotFoundEvent event) { + if ("rtp".equals(event.getApp())) { + return; + } + // 鎷夋祦浠g悊 + StreamProxyItem streamProxyByAppAndStream = getStreamProxyByAppAndStream(event.getApp(), event.getStream()); + if (streamProxyByAppAndStream != null && streamProxyByAppAndStream.isEnableDisableNoneReader()) { + start(event.getApp(), event.getStream()); + } + } + + + @Override + public void save(StreamProxyItem param, GeneralCallback<StreamInfo> callback) { + MediaServer mediaServer; + if (ObjectUtils.isEmpty(param.getMediaServerId()) || "auto".equals(param.getMediaServerId())){ + mediaServer = mediaServerService.getMediaServerForMinimumLoad(null); + }else { + mediaServer = mediaServerService.getOne(param.getMediaServerId()); + } + if (mediaServer == null) { + logger.warn("淇濆瓨浠g悊鏈壘鍒板湪绾跨殑ZLM..."); + throw new ControllerException(ErrorCode.ERROR100.getCode(), "淇濆瓨浠g悊鏈壘鍒板湪绾跨殑ZLM"); + } + String dstUrl; + if ("ffmpeg".equalsIgnoreCase(param.getType())) { + + String ffmpegCmd = mediaServerService.getFfmpegCmd(mediaServer, param.getFfmpegCmdKey()); + + if (ffmpegCmd == null) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "ffmpeg鎷夋祦浠g悊鏃犳硶鑾峰彇ffmpeg cmd"); + } + String schema = getSchemaFromFFmpegCmd(ffmpegCmd); + if (schema == null) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "ffmpeg鎷夋祦浠g悊鏃犳硶浠巉fmpeg cmd涓幏鍙栧埌杈撳嚭鏍煎紡"); + } + int port; + String schemaForUri; + if (schema.equalsIgnoreCase("rtsp")) { + port = mediaServer.getRtspPort(); + schemaForUri = schema; + }else if (schema.equalsIgnoreCase("flv")) { + port = mediaServer.getRtmpPort(); + schemaForUri = schema; + }else { + port = mediaServer.getRtmpPort(); + schemaForUri = schema; + } + + dstUrl = String.format("%s://%s:%s/%s/%s", schemaForUri, "127.0.0.1", port, param.getApp(), + param.getStream()); + }else { + dstUrl = String.format("rtsp://%s:%s/%s/%s", "127.0.0.1", mediaServer.getRtspPort(), param.getApp(), + param.getStream()); + } + param.setDstUrl(dstUrl); + logger.info("[鎷夋祦浠g悊] 杈撳嚭鍦板潃涓猴細{}", dstUrl); + param.setMediaServerId(mediaServer.getId()); + boolean saveResult; + // 鏇存柊 + if (videoManagerStorager.queryStreamProxy(param.getApp(), param.getStream()) != null) { + saveResult = updateStreamProxy(param); + }else { // 鏂板 + saveResult = addStreamProxy(param); + } + if (!saveResult) { + callback.run(ErrorCode.ERROR100.getCode(), "淇濆瓨澶辫触", null); + return; + } + Hook hook = Hook.getInstance(HookType.on_media_arrival, param.getApp(), param.getStream(), mediaServer.getId()); + hookSubscribe.addSubscribe(hook, (hookData) -> { + StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStream( + mediaServer, param.getApp(), param.getStream(), null, null); + callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); + }); + if (param.isEnable()) { + String talkKey = UUID.randomUUID().toString(); + String delayTalkKey = UUID.randomUUID().toString(); + dynamicTask.startDelay(delayTalkKey, ()->{ + StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStreamWithCheck(param.getApp(), param.getStream(), mediaServer.getId(), false); + if (streamInfo != null) { + callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); + }else { + dynamicTask.stop(talkKey); + callback.run(ErrorCode.ERROR100.getCode(), "瓒呮椂", null); + } + }, 7000); + WVPResult<String> result = addStreamProxyToZlm(param); + if (result != null && result.getCode() == 0) { + hookSubscribe.removeSubscribe(hook); + dynamicTask.stop(talkKey); + StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStream( + mediaServer, param.getApp(), param.getStream(), null, null); + callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); + }else { + param.setEnable(false); + // 鐩存帴绉婚櫎 + if (param.isEnableRemoveNoneReader()) { + del(param.getApp(), param.getStream()); + }else { + updateStreamProxy(param); + } + if (result == null){ + callback.run(ErrorCode.ERROR100.getCode(), "璁板綍宸蹭繚瀛橈紝鍚敤澶辫触", null); + }else { + callback.run(ErrorCode.ERROR100.getCode(), result.getMsg(), null); + } + } + } + else{ + StreamInfo streamInfo = mediaServerService.getStreamInfoByAppAndStream( + mediaServer, param.getApp(), param.getStream(), null, null); + callback.run(ErrorCode.SUCCESS.getCode(), ErrorCode.SUCCESS.getMsg(), streamInfo); + } + } + + private String getSchemaFromFFmpegCmd(String ffmpegCmd) { + ffmpegCmd = ffmpegCmd.replaceAll(" + ", " "); + String[] paramArray = ffmpegCmd.split(" "); + if (paramArray.length == 0) { + return null; + } + for (int i = 0; i < paramArray.length; i++) { + if (paramArray[i].equalsIgnoreCase("-f")) { + if (i + 1 < paramArray.length - 1) { + return paramArray[i+1]; + }else { + return null; + } + + } + } + return null; + } + + /** + * 鏂板浠g悊娴� + * @param streamProxyItem + * @return + */ + private boolean addStreamProxy(StreamProxyItem streamProxyItem) { + TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); + boolean result = false; + streamProxyItem.setStreamType("proxy"); + streamProxyItem.setStatus(true); + String now = DateUtil.getNow(); + streamProxyItem.setCreateTime(now); + try { + if (streamProxyMapper.add(streamProxyItem) > 0) { + if (!ObjectUtils.isEmpty(streamProxyItem.getGbId())) { + if (gbStreamMapper.add(streamProxyItem) < 0) { + //浜嬪姟鍥炴粴 + dataSourceTransactionManager.rollback(transactionStatus); + return false; + } + } + }else { + //浜嬪姟鍥炴粴 + dataSourceTransactionManager.rollback(transactionStatus); + return false; + } + result = true; + dataSourceTransactionManager.commit(transactionStatus); //鎵嬪姩鎻愪氦 + }catch (Exception e) { + logger.error("鍚戞暟鎹簱娣诲姞娴佷唬鐞嗗け璐ワ細", e); + dataSourceTransactionManager.rollback(transactionStatus); + } + + + return result; + } + + /** + * 鏇存柊浠g悊娴� + * @param streamProxyItem + * @return + */ + @Override + public boolean updateStreamProxy(StreamProxyItem streamProxyItem) { + TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition); + boolean result = false; + streamProxyItem.setStreamType("proxy"); + try { + if (streamProxyMapper.update(streamProxyItem) > 0) { + if (!ObjectUtils.isEmpty(streamProxyItem.getGbId())) { + if (gbStreamMapper.updateByAppAndStream(streamProxyItem) == 0) { + //浜嬪姟鍥炴粴 + dataSourceTransactionManager.rollback(transactionStatus); + return false; + } + } + } else { + //浜嬪姟鍥炴粴 + dataSourceTransactionManager.rollback(transactionStatus); + return false; + } + + dataSourceTransactionManager.commit(transactionStatus); //鎵嬪姩鎻愪氦 + result = true; + }catch (Exception e) { + logger.error("鏈鐞嗙殑寮傚父 ", e); + dataSourceTransactionManager.rollback(transactionStatus); } return result; } @Override - public JSONObject removeStreamProxyFromZlm(StreamProxyItem param) { - if (param ==null) return null; - IMediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); - JSONObject result = zlmresTfulUtils.closeStreams(mediaServerItem, param.getApp(), param.getStream()); + public WVPResult<String> addStreamProxyToZlm(StreamProxyItem param) { + WVPResult<String> result = null; + MediaServer mediaServer = null; + if (param.getMediaServerId() == null) { + logger.warn("娣诲姞浠g悊鏃禡ediaServerId 涓簄ull"); + return null; + }else { + mediaServer = mediaServerService.getOne(param.getMediaServerId()); + } + if (mediaServer == null) { + return null; + } + if (mediaServerService.isStreamReady(mediaServer, param.getApp(), param.getStream())) { + mediaServerService.closeStreams(mediaServer, param.getApp(), param.getStream()); + } + String msgResult; + if ("ffmpeg".equalsIgnoreCase(param.getType())){ + if (param.getTimeoutMs() == 0) { + param.setTimeoutMs(15); + } + result = mediaServerService.addFFmpegSource(mediaServer, param.getSrcUrl().trim(), param.getDstUrl(), + param.getTimeoutMs(), param.isEnableAudio(), param.isEnableMp4(), + param.getFfmpegCmdKey()); + }else { + result = mediaServerService.addStreamProxy(mediaServer, param.getApp(), param.getStream(), param.getUrl().trim(), + param.isEnableAudio(), param.isEnableMp4(), param.getRtpType()); + } + if (result != null && result.getCode() == 0) { + String key = result.getData(); + if (key == null) { + logger.warn("[鑾峰彇鎷夋祦浠g悊鐨勭粨鏋滄暟鎹瓺ata] 澶辫触锛� {}", result ); + return result; + } + param.setStreamKey(key); + streamProxyMapper.update(param); + } + return result; + } + + @Override + public Boolean removeStreamProxyFromZlm(StreamProxyItem param) { + if (param ==null) { + return null; + } + MediaServer mediaServer = mediaServerService.getOne(param.getMediaServerId()); + if (mediaServer == null) { + return null; + } + List<StreamInfo> mediaList = mediaServerService.getMediaList(mediaServer, param.getApp(), param.getStream(), null); + if (mediaList == null || mediaList.isEmpty()) { + return true; + } + Boolean result = false; + if ("ffmpeg".equalsIgnoreCase(param.getType())){ + result = mediaServerService.delFFmpegSource(mediaServer, param.getStreamKey()); + }else { + result = mediaServerService.delStreamProxy(mediaServer, param.getStreamKey()); + } return result; } @@ -155,30 +402,42 @@ public void del(String app, String stream) { StreamProxyItem streamProxyItem = videoManagerStorager.queryStreamProxy(app, stream); if (streamProxyItem != null) { + gbStreamService.sendCatalogMsg(streamProxyItem, CatalogEvent.DEL); + + // 濡傛灉鍏宠仈浜嗗浗鏍囬偅涔堢Щ闄ゅ叧鑱� + platformGbStreamMapper.delByAppAndStream(app, stream); + gbStreamMapper.del(app, stream); videoManagerStorager.deleteStreamProxy(app, stream); - JSONObject jsonObject = removeStreamProxyFromZlm(streamProxyItem); - if (jsonObject != null && jsonObject.getInteger("code") == 0) { - // 濡傛灉鍏宠仈浜嗗浗鏍囬偅涔堢Щ闄ゅ叧鑱� - gbStreamMapper.del(app, stream); - platformGbStreamMapper.delByAppAndStream(app, stream); - // TODO 濡傛灉鍏宠仈鐨勬帹娴侊紝 閭d箞鐘舵�佽缃负绂荤嚎 + redisCatchStorage.removeStream(streamProxyItem.getMediaServerId(), "PULL", app, stream); + redisCatchStorage.removeStream(streamProxyItem.getMediaServerId(), "PUSH", app, stream); + Boolean result = removeStreamProxyFromZlm(streamProxyItem); + if (result != null && result) { + logger.info("[绉婚櫎浠g悊]锛� 浠g悊锛� {}/{}, 浠巣lm绉婚櫎鎴愬姛", app, stream); + }else { + logger.info("[绉婚櫎浠g悊]锛� 浠g悊锛� {}/{}, 浠巣lm绉婚櫎澶辫触", app, stream); } } - } @Override public boolean start(String app, String stream) { boolean result = false; StreamProxyItem streamProxy = videoManagerStorager.queryStreamProxy(app, stream); - if (!streamProxy.isEnable() && streamProxy != null) { - JSONObject jsonObject = addStreamProxyToZlm(streamProxy); - if (jsonObject == null) return false; - if (jsonObject.getInteger("code") == 0) { + if (streamProxy != null && !streamProxy.isEnable() ) { + WVPResult<String> wvpResult = addStreamProxyToZlm(streamProxy); + if (wvpResult == null) { + return false; + } + if (wvpResult.getCode() == 0) { result = true; streamProxy.setEnable(true); - videoManagerStorager.updateStreamProxy(streamProxy); + updateStreamProxy(streamProxy); + }else { + logger.info("鍚敤浠g悊澶辫触锛� {}/{}->{}({})", app, stream, wvpResult.getMsg(), + streamProxy.getSrcUrl() == null? streamProxy.getUrl():streamProxy.getSrcUrl()); } + } else if (streamProxy != null && streamProxy.isEnable()) { + return true ; } return result; } @@ -188,30 +447,164 @@ boolean result = false; StreamProxyItem streamProxyDto = videoManagerStorager.queryStreamProxy(app, stream); if (streamProxyDto != null && streamProxyDto.isEnable()) { - JSONObject jsonObject = removeStreamProxyFromZlm(streamProxyDto); - if (jsonObject.getInteger("code") == 0) { + Boolean removed = removeStreamProxyFromZlm(streamProxyDto); + if (removed != null && removed) { streamProxyDto.setEnable(false); - result = videoManagerStorager.updateStreamProxy(streamProxyDto); + result = updateStreamProxy(streamProxyDto); } } return result; } @Override - public JSONObject getFFmpegCMDs(IMediaServerItem mediaServerItem) { - JSONObject result = new JSONObject(); - JSONObject mediaServerConfigResuly = zlmresTfulUtils.getMediaServerConfig(mediaServerItem); - if (mediaServerConfigResuly != null && mediaServerConfigResuly.getInteger("code") == 0 - && mediaServerConfigResuly.getJSONArray("data").size() > 0){ - JSONObject mediaServerConfig = mediaServerConfigResuly.getJSONArray("data").getJSONObject(0); + public Map<String, String> getFFmpegCMDs(MediaServer mediaServer) { + return mediaServerService.getFFmpegCMDs(mediaServer); + } - for (String key : mediaServerConfig.keySet()) { - if (key.startsWith("ffmpeg.cmd")){ - result.put(key, mediaServerConfig.getString(key)); + + @Override + public StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId) { + return videoManagerStorager.getStreamProxyByAppAndStream(app, streamId); + } + + @Override + public void zlmServerOnline(String mediaServerId) { + // 绉婚櫎寮�鍚簡鏃犱汉瑙傜湅鑷姩绉婚櫎鐨勬祦 + List<StreamProxyItem> streamProxyItemList = streamProxyMapper.selectAutoRemoveItemByMediaServerId(mediaServerId); + if (streamProxyItemList.size() > 0) { + gbStreamMapper.batchDel(streamProxyItemList); + } + streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId); + + // 绉婚櫎鎷夋祦浠g悊鐢熸垚鐨勬祦淇℃伅 + syncPullStream(mediaServerId); + + // 鎭㈠娴佷唬鐞�, 鍙煡鎵捐繖涓繖涓祦濯掍綋 + List<StreamProxyItem> streamProxyListForEnable = storager.getStreamProxyListForEnableInMediaServer( + mediaServerId, true); + for (StreamProxyItem streamProxyDto : streamProxyListForEnable) { + logger.info("鎭㈠娴佷唬鐞嗭紝" + streamProxyDto.getApp() + "/" + streamProxyDto.getStream()); + WVPResult<String> wvpResult = addStreamProxyToZlm(streamProxyDto); + if (wvpResult == null) { + // 璁剧疆涓虹绾� + logger.info("鎭㈠娴佷唬鐞嗗け璐�" + streamProxyDto.getApp() + "/" + streamProxyDto.getStream()); + updateStatus(false, streamProxyDto.getApp(), streamProxyDto.getStream()); + }else { + updateStatus(true, streamProxyDto.getApp(), streamProxyDto.getStream()); + } + } + } + + @Override + public void zlmServerOffline(String mediaServerId) { + // 绉婚櫎寮�鍚簡鏃犱汉瑙傜湅鑷姩绉婚櫎鐨勬祦 + List<StreamProxyItem> streamProxyItemList = streamProxyMapper.selectAutoRemoveItemByMediaServerId(mediaServerId); + if (streamProxyItemList.size() > 0) { + gbStreamMapper.batchDel(streamProxyItemList); + } + streamProxyMapper.deleteAutoRemoveItemByMediaServerId(mediaServerId); + // 鍏朵粬鐨勬祦璁剧疆绂荤嚎 + streamProxyMapper.updateStatusByMediaServerId(mediaServerId, false); + String type = "PULL"; + + // 鍙戦�乺edis娑堟伅 + List<MediaInfo> mediaInfoList = redisCatchStorage.getStreams(mediaServerId, type); + if (mediaInfoList.size() > 0) { + for (MediaInfo mediaInfo : mediaInfoList) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("serverId", userSetting.getServerId()); + jsonObject.put("app", mediaInfo.getApp()); + jsonObject.put("stream", mediaInfo.getStream()); + jsonObject.put("register", false); + jsonObject.put("mediaServerId", mediaServerId); + redisCatchStorage.sendStreamChangeMsg(type, jsonObject); + // 绉婚櫎redis鍐呮祦鐨勪俊鎭� + redisCatchStorage.removeStream(mediaServerId, type, mediaInfo.getApp(), mediaInfo.getStream()); + } + } + } + + @Override + public void clean() { + + } + + @Override + public int updateStatus(boolean status, String app, String stream) { + return streamProxyMapper.updateStatus(app, stream, status); + } + + private void syncPullStream(String mediaServerId){ + MediaServer mediaServer = mediaServerService.getOne(mediaServerId); + if (mediaServer != null) { + List<MediaInfo> mediaInfoList = redisCatchStorage.getStreams(mediaServerId, "PULL"); + if (!mediaInfoList.isEmpty()) { + List<StreamInfo> mediaList = mediaServerService.getMediaList(mediaServer, null, null, null); + Map<String, StreamInfo> stringStreamInfoMap = new HashMap<>(); + if (mediaList != null && !mediaList.isEmpty()) { + for (StreamInfo streamInfo : mediaList) { + stringStreamInfoMap.put(streamInfo.getApp() + streamInfo.getStream(), streamInfo); + } + } + if (stringStreamInfoMap.isEmpty()) { + redisCatchStorage.removeStream(mediaServerId, "PULL"); + }else { + for (String key : stringStreamInfoMap.keySet()) { + StreamInfo streamInfo = stringStreamInfoMap.get(key); + if (stringStreamInfoMap.get(streamInfo.getApp() + streamInfo.getStream()) == null) { + redisCatchStorage.removeStream(mediaServerId, "PULL", streamInfo.getApp(), + streamInfo.getStream()); + } + } } } } + } - return result; + @Override + public ResourceBaseInfo getOverview() { + + int total = streamProxyMapper.getAllCount(); + int online = streamProxyMapper.getOnline(); + + return new ResourceBaseInfo(total, online); + } + + + @Scheduled(cron = "* 0/10 * * * ?") + public void asyncCheckStreamProxyStatus() { + + List<MediaServer> all = mediaServerService.getAllOnline(); + + if (CollectionUtils.isEmpty(all)){ + return; + } + + Map<String, MediaServer> serverItemMap = all.stream().collect(Collectors.toMap(MediaServer::getId, Function.identity(), (m1, m2) -> m1)); + + List<StreamProxyItem> list = videoManagerStorager.getStreamProxyListForEnable(true); + + if (CollectionUtils.isEmpty(list)){ + return; + } + + for (StreamProxyItem streamProxyItem : list) { + + MediaServer mediaServerItem = serverItemMap.get(streamProxyItem.getMediaServerId()); + + MediaInfo mediaInfo = mediaServerService.getMediaInfo(mediaServerItem, streamProxyItem.getApp(), streamProxyItem.getStream()); + + if (mediaInfo == null){ + streamProxyItem.setStatus(false); + } else { + if (mediaInfo.getOnline() != null && mediaInfo.getOnline()) { + streamProxyItem.setStatus(true); + } else { + streamProxyItem.setStatus(false); + } + } + + updateStreamProxy(streamProxyItem); + } } } -- Gitblit v1.8.0