From 403e7648f9677a59016b51d7110986280e65c084 Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Tue, 16 Sep 2025 17:57:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ABL=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E5=B0=81=E8=A3=85=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../media/abl/ABLMediaNodeServerService.java | 164 +++++++---------- .../media/abl/ABLMediaServerStatusManger.java | 41 ++--- .../iot/vmp/media/abl/ABLRESTfulUtils.java | 168 +++++++++++++----- .../iot/vmp/media/abl/bean/ABLMedia.java | 25 +++ .../iot/vmp/media/abl/bean/ABLRecordFile.java | 10 ++ .../iot/vmp/media/abl/bean/ABLResult.java | 48 +++++ .../iot/vmp/media/abl/bean/ABLUrls.java | 21 +++ .../bean/hook/OnStreamArriveABLHookParam.java | 141 +-------------- .../iot/vmp/media/bean/MediaInfo.java | 36 +++- .../vmp/service/impl/MediaServiceImpl.java | 8 +- 10 files changed, 350 insertions(+), 312 deletions(-) create mode 100644 src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLMedia.java create mode 100644 src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLRecordFile.java create mode 100644 src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLResult.java create mode 100644 src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLUrls.java diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java index 75efe7fc3..4d63cae6c 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java @@ -1,7 +1,6 @@ package com.genersoft.iot.vmp.media.abl; import com.alibaba.fastjson2.JSONArray; -import com.alibaba.fastjson2.JSONObject; import com.genersoft.iot.vmp.common.CommonCallback; import com.genersoft.iot.vmp.common.InviteInfo; import com.genersoft.iot.vmp.common.InviteSessionType; @@ -11,8 +10,9 @@ import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.gb28181.bean.SendRtpInfo; import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService; +import com.genersoft.iot.vmp.media.abl.bean.ABLMedia; +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.hook.OnStreamArriveABLHookParam; import com.genersoft.iot.vmp.media.bean.MediaInfo; import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.event.media.MediaRecordMp4Event; @@ -32,7 +32,10 @@ import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Service("abl") public class ABLMediaNodeServerService implements IMediaNodeServerService { @@ -70,18 +73,10 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { if (mediaServer == null) { return; } - Map param = new HashMap<>(); - param.put("stream_id", streamId); - param.put("force", 1); - JSONObject jsonObject = ablresTfulUtils.closeStreams(mediaServer, "rtp", streamId); - logger.info("关闭RTP Server " + jsonObject); - if (jsonObject != null ) { - if (jsonObject.getInteger("code") != 0) { - logger.error("[closeRtpServer] 失败: " + jsonObject.getString("memo")); - } - }else { - // 检查ZLM状态 - logger.error("[closeRtpServer] 失败: 请检查ZLM服务"); + ABLResult result = ablresTfulUtils.closeStreams(mediaServer, "rtp", streamId); + logger.info("关闭RTP Server " + result); + if (result.getCode() != 0) { + logger.error("[closeRtpServer] 失败: {}", result.getMemo()); } } @@ -96,31 +91,18 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { if (mediaServer == null) { return; } - JSONObject jsonObject = ablresTfulUtils.closeStreams(mediaServer, "1078", streamId); - logger.info("关闭RTP Server " + jsonObject); - if (jsonObject != null ) { - if (jsonObject.getInteger("code") != 0) { - logger.error("[closeRtpServer] 失败: " + jsonObject.getString("memo")); - } - }else { - // 检查ZLM状态 - logger.error("[closeRtpServer] 失败: 请检查ZLM服务"); + ABLResult result = ablresTfulUtils.closeStreams(mediaServer, "1078", streamId); + logger.info("关闭JT-RTP Server " + result); + if (result.getCode() != 0) { + logger.error("[JT-closeRtpServer] 失败: {}", result.getMemo()); } } @Override public void closeStreams(MediaServer mediaServer, String app, String streamId) { - Map param = new HashMap<>(); - param.put("stream_id", streamId); - param.put("force", 1); - JSONObject jsonObject = ablresTfulUtils.closeStreams(mediaServer, app, streamId); - if (jsonObject != null ) { - if (jsonObject.getInteger("code") != 0) { - logger.error("[closeStreams] 失败: " + jsonObject.getString("memo")); - } - }else { - // 检查ZLM状态 - logger.error("[closeStreams] 失败: 请检查ZLM服务"); + ABLResult result = ablresTfulUtils.closeStreams(mediaServer, app, streamId); + if (result.getCode() != 0) { + logger.error("[closeStreams] 失败: {}", result.getMemo()); } } @@ -146,8 +128,8 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { mediaServer.setIp(ip); mediaServer.setHttpPort(port); mediaServer.setSecret(secret); - JSONObject responseJSON = ablresTfulUtils.getServerConfig(mediaServer); - JSONArray data = responseJSON.getJSONArray("params"); + ABLResult result = ablresTfulUtils.getServerConfig(mediaServer); + JSONArray data = result.getParams(); if (data != null && !data.isEmpty()) { AblServerConfig config = AblServerConfig.getInstance(data); config.setServerIp(ip); @@ -173,19 +155,17 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { @Override public List getMediaList(MediaServer mediaServer, String app, String stream, String callId) { - JSONObject jsonObject = ablresTfulUtils.getMediaList(mediaServer, app, stream); - if (jsonObject == null || jsonObject.getInteger("code") != 0) { + ABLResult result = ablresTfulUtils.getMediaList(mediaServer, app, stream); + if (result.getCode() != 0) { return null; } - JSONArray mediaList = jsonObject.getJSONArray("mediaList"); - if (mediaList == null || mediaList.isEmpty()) { + if (result.getMediaList() == null || result.getMediaList().isEmpty()) { return new ArrayList<>(); } List streamInfoList = new ArrayList<>(); - for (int i = 0; i < mediaList.size(); i++) { - JSONObject mediaJSON = mediaList.getJSONObject(i); - OnStreamArriveABLHookParam onStreamArriveABLHookParam = mediaJSON.to(OnStreamArriveABLHookParam.class); - MediaInfo mediaInfo = MediaInfo.getInstance(onStreamArriveABLHookParam, mediaServer); + for (int i = 0; i < result.getMediaList().size(); i++) { + ABLMedia ablMedia = result.getMediaList().get(i); + MediaInfo mediaInfo = MediaInfo.getInstance(ablMedia, mediaServer); StreamInfo streamInfo = getStreamInfoByAppAndStream(mediaServer, app, stream, mediaInfo, callId, true); if (streamInfo != null) { streamInfoList.add(streamInfo); @@ -230,37 +210,26 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { @Override public MediaInfo getMediaInfo(MediaServer mediaServer, String app, String stream) { - JSONObject jsonObject = ablresTfulUtils.getMediaList(mediaServer, app, stream); - if (jsonObject == null || jsonObject.getInteger("code") != 0) { + ABLResult ablResult = ablresTfulUtils.getMediaList(mediaServer, app, stream); + if (ablResult.getCode() != 0) { return null; } - JSONArray mediaList = jsonObject.getJSONArray("mediaList"); - if (mediaList == null || mediaList.isEmpty()) { + if (ablResult.getMediaList() == null || ablResult.getMediaList().isEmpty()) { return null; } - MediaInfo mediaInfo = null; - for (int i = 0; i < mediaList.size(); i++) { - JSONObject mediaJSON = mediaList.getJSONObject(i); - OnStreamArriveABLHookParam onStreamArriveABLHookParam = mediaJSON.to(OnStreamArriveABLHookParam.class); - if (onStreamArriveABLHookParam == null) { - continue; - } - mediaInfo = MediaInfo.getInstance(onStreamArriveABLHookParam, mediaServer); - - } - return mediaInfo; + return MediaInfo.getInstance(ablResult.getMediaList().get(0), mediaServer); } @Override public Boolean pauseRtpCheck(MediaServer mediaServer, String streamKey) { - logger.warn("[abl-pauseRtpCheck] 未实现"); - return null; + ABLResult ablResult = ablresTfulUtils.pauseRtpServer(mediaServer, streamKey); + return ablResult.getCode() == 0; } @Override public Boolean resumeRtpCheck(MediaServer mediaServer, String streamKey) { - logger.warn("[abl-resumeRtpCheck] 未实现"); - return null; + ABLResult ablResult = ablresTfulUtils.resumeRtpServer(mediaServer, streamKey); + return ablResult.getCode() == 0; } @Override @@ -270,14 +239,14 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { @Override public Boolean delFFmpegSource(MediaServer mediaServer, String streamKey) { - JSONObject jsonObject = ablresTfulUtils.delFFmpegProxy(mediaServer, streamKey); - return jsonObject.getInteger("code") == 0; + ABLResult ablResult = ablresTfulUtils.delFFmpegProxy(mediaServer, streamKey); + return ablResult.getCode() == 0; } @Override public Boolean delStreamProxy(MediaServer mediaServer, String streamKey) { - JSONObject jsonObject = ablresTfulUtils.delStreamProxy(mediaServer, streamKey); - return jsonObject.getInteger("code") == 0; + ABLResult ablResult = ablresTfulUtils.delStreamProxy(mediaServer, streamKey); + return ablResult.getCode() == 0; } @Override @@ -311,17 +280,15 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { } long startTime = cloudRecordItemList.get(cloudRecordItemList.size() - 1).getStartTime(); long endTime = cloudRecordItemList.get(0).getEndTime(); - JSONObject jsonObject = ablresTfulUtils.queryRecordList(event.getMediaServer(), event.getApp(), event.getStream(), DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss(startTime), + ABLResult ablResult = ablresTfulUtils.queryRecordList(event.getMediaServer(), event.getApp(), event.getStream(), DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss(startTime), DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss(endTime)); - System.err.println(jsonObject); - if (jsonObject == null || jsonObject.getInteger("code") != 0) { + if (ablResult.getCode() != 0) { return; } - JSONObject urlJson = jsonObject.getJSONObject("url"); - if (urlJson == null) { + if (ablResult.getUrl() == null) { return; } - String download = urlJson.getString("http-mp4") + "?download_speed=6"; + String download = ablResult.getUrl().getDownload(); DownloadFileInfo downloadFileInfo = new DownloadFileInfo(); downloadFileInfo.setHttpPath(download); downloadFileInfo.setHttpsPath(download); @@ -346,11 +313,11 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { @Override public WVPResult addStreamProxy(MediaServer mediaServer, String app, String stream, String url, boolean enableAudio, boolean enableMp4, String rtpType, Integer timeout) { - JSONObject jsonObject = ablresTfulUtils.addStreamProxy(mediaServer, app, stream, url, !enableAudio, enableMp4, rtpType, timeout); - if (jsonObject.getInteger("code") != 0) { - return WVPResult.fail(ErrorCode.ERROR100.getCode(), jsonObject.getString("memo")); + ABLResult result = ablresTfulUtils.addStreamProxy(mediaServer, app, stream, url, !enableAudio, enableMp4, rtpType, timeout); + if (result.getCode() != 0) { + return WVPResult.fail(ErrorCode.ERROR100.getCode(), result.getMemo()); }else { - return WVPResult.success(jsonObject.getString("key")); + return WVPResult.success(result.getKey()); } } @@ -380,25 +347,23 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { closeStreams(mediaServer, streamProxy.getApp(), streamProxy.getStream()); } - JSONObject jsonObject = null; + ABLResult ablResult = null; if ("ffmpeg".equalsIgnoreCase(streamProxy.getType())){ if (streamProxy.getTimeout() == 0) { streamProxy.setTimeout(15); } - jsonObject = ablresTfulUtils.addFFmpegProxy(mediaServer, streamProxy.getApp(), streamProxy.getStream(), streamProxy.getSrcUrl().trim(), + ablResult = ablresTfulUtils.addFFmpegProxy(mediaServer, streamProxy.getApp(), streamProxy.getStream(), streamProxy.getSrcUrl().trim(), !streamProxy.isEnableAudio(), streamProxy.isEnableMp4(), streamProxy.getRtspType(), streamProxy.getTimeout()); }else { - jsonObject = ablresTfulUtils.addStreamProxy(mediaServer, streamProxy.getApp(), streamProxy.getStream(), streamProxy.getSrcUrl().trim(), + ablResult = ablresTfulUtils.addStreamProxy(mediaServer, streamProxy.getApp(), streamProxy.getStream(), streamProxy.getSrcUrl().trim(), streamProxy.isEnableAudio(), streamProxy.isEnableMp4(), streamProxy.getRtspType(), streamProxy.getTimeout()); } - if (jsonObject == null) { - throw new ControllerException(ErrorCode.ERROR100.getCode(), "请求失败"); - }else if (jsonObject.getInteger("code") != 0) { - throw new ControllerException(jsonObject.getInteger("code"), jsonObject.getString("memo")); + if (ablResult.getCode() != 0) { + throw new ControllerException(ablResult.getCode(), ablResult.getMemo()); }else { - String key = jsonObject.getString("key"); + String key = ablResult.getKey(); if (key == null) { - throw new ControllerException(jsonObject.getInteger("code"), "代理结果异常: " + jsonObject); + throw new ControllerException(ablResult.getCode(), "代理结果异常: " + ablResult); }else { return key; } @@ -407,33 +372,30 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { @Override public void stopProxy(MediaServer mediaServer, String streamKey, String type) { - JSONObject jsonObject = null; + ABLResult ablResult = null; if ("ffmpeg".equalsIgnoreCase(type)){ - jsonObject = ablresTfulUtils.delFFmpegProxy(mediaServer, streamKey); + ablResult = ablresTfulUtils.delFFmpegProxy(mediaServer, streamKey); }else { - jsonObject = ablresTfulUtils.delStreamProxy(mediaServer, streamKey); + ablResult = ablresTfulUtils.delStreamProxy(mediaServer, streamKey); } - if (jsonObject == null) { - throw new ControllerException(ErrorCode.ERROR100.getCode(), "请求失败"); - }else if (jsonObject.getInteger("code") != 0) { - throw new ControllerException(jsonObject.getInteger("code"), jsonObject.getString("memo")); + if (ablResult.getCode() != 0) { + throw new ControllerException(ablResult.getCode(), ablResult.getMemo()); } } @Override public List listRtpServer(MediaServer mediaServer) { - JSONObject jsonObject = ablresTfulUtils.getMediaList(mediaServer, "rtp", null); - if (jsonObject == null || jsonObject.getInteger("code") != 0) { + ABLResult ablResult = ablresTfulUtils.getMediaList(mediaServer, "rtp", null); + if (ablResult.getCode() != 0) { return null; } - JSONArray mediaList = jsonObject.getJSONArray("mediaList"); - if (mediaList == null || mediaList.isEmpty()) { + if (ablResult.getMediaList() == null || ablResult.getMediaList().isEmpty()) { return new ArrayList<>(); } List result = new ArrayList<>(); - for (int i = 0; i < mediaList.size(); i++) { - JSONObject mediaJSON = mediaList.getJSONObject(i); - result.add(mediaJSON.getString("stream")); + for (int i = 0; i < ablResult.getMediaList().size(); i++) { + ABLMedia ablMedia = ablResult.getMediaList().get(i); + result.add(ablMedia.getStream()); } return result; } diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java index 66e48b82f..377cdd346 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaServerStatusManger.java @@ -1,17 +1,17 @@ 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.ABLResult; 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.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 com.genersoft.iot.vmp.media.bean.MediaServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -131,17 +131,18 @@ public class ABLMediaServerStatusManger { continue; } logger.info("[ABL-尝试连接] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); - JSONObject responseJson = ablResTfulUtils.getServerConfig(mediaServerItem); + ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServerItem); AblServerConfig ablServerConfig = null; - if (responseJson == null) { + if (ablResult.getCode() != 0) { logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); continue; } - JSONArray data = responseJson.getJSONArray("params"); - if (data == null || data.isEmpty()) { + JSONArray params = ablResult.getParams(); + + if (params == null || params.isEmpty()) { logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); }else { - ablServerConfig = AblServerConfig.getInstance(data); + ablServerConfig = AblServerConfig.getInstance(params); initPort(mediaServerItem, ablServerConfig); online(mediaServerItem, ablServerConfig); } @@ -153,19 +154,19 @@ public class ABLMediaServerStatusManger { continue; } logger.info("[ABL-尝试连接] ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); - JSONObject responseJson = ablResTfulUtils.getServerConfig(mediaServerItem); + ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServerItem); AblServerConfig ablServerConfig = null; - if (responseJson == null) { + if (ablResult.getCode() != 0) { 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()) { + JSONArray params = ablResult.getParams(); + if (params == null || params.isEmpty()) { logger.info("[ABL-尝试连接]失败, ID:{}, 地址: {}:{}", mediaServerItem.getId(), mediaServerItem.getIp(), mediaServerItem.getHttpPort()); offlineAblTimeMap.put(mediaServerItem.getId(), System.currentTimeMillis()); }else { - ablServerConfig = AblServerConfig.getInstance(data); + ablServerConfig = AblServerConfig.getInstance(params); initPort(mediaServerItem, ablServerConfig); online(mediaServerItem, ablServerConfig); } @@ -184,8 +185,8 @@ public class ABLMediaServerStatusManger { mediaServerService.update(mediaServerItem); if(mediaServerItem.isAutoConfig()) { if (config == null) { - JSONObject responseJSON = ablResTfulUtils.getServerConfig(mediaServerItem); - JSONArray data = responseJSON.getJSONArray("params"); + ABLResult ablResult = ablResTfulUtils.getServerConfig(mediaServerItem); + JSONArray data = ablResult.getParams(); if (data != null && !data.isEmpty()) { config = AblServerConfig.getInstance(data); } @@ -247,11 +248,11 @@ public class ABLMediaServerStatusManger { try { if (config.getHookEnable() == 0) { logger.info("[媒体服务节点-ABL] 开启HOOK功能 :{}", mediaServerItem.getId()); - JSONObject responseJSON = ablResTfulUtils.setConfigParamValue(mediaServerItem, "hook_enable", "1"); - if (responseJSON.getInteger("code") == 0) { + ABLResult ablResult = ablResTfulUtils.setConfigParamValue(mediaServerItem, "hook_enable", "1"); + if (ablResult.getCode() == 0) { logger.info("[媒体服务节点-ABL] 开启HOOK功能成功 :{}", mediaServerItem.getId()); }else { - logger.info("[媒体服务节点-ABL] 开启HOOK功能失败 :{}->{}", mediaServerItem.getId(), responseJSON.getString("memo")); + logger.info("[媒体服务节点-ABL] 开启HOOK功能失败 :{}->{}", mediaServerItem.getId(), ablResult.getMemo()); } } }catch (Exception e) { @@ -286,11 +287,11 @@ public class ABLMediaServerStatusManger { field.setAccessible(true); // 利用反射获取值后对比是否与配置中相同,不同则进行设置 if (!hookUrl.equals(field.get(config))) { - JSONObject responseJSON = ablResTfulUtils.setConfigParamValue(mediaServerItem, hook, hookUrl); - if (responseJSON.getInteger("code") == 0) { + ABLResult ablResult = ablResTfulUtils.setConfigParamValue(mediaServerItem, hook, hookUrl); + if (ablResult.getCode() == 0) { logger.info("[媒体服务节点-ABL] 设置HOOK {} 成功 :{}", hook, mediaServerItem.getId()); }else { - logger.info("[媒体服务节点-ABL] 设置HOOK {} 失败 :{}->{}", hook, mediaServerItem.getId(), responseJSON.getString("memo")); + logger.info("[媒体服务节点-ABL] 设置HOOK {} 失败 :{}->{}", hook, mediaServerItem.getId(), ablResult.getMemo()); } } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java index fef7cbadc..b019eef68 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java @@ -1,7 +1,7 @@ package com.genersoft.iot.vmp.media.abl; import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONObject; +import com.genersoft.iot.vmp.media.abl.bean.ABLResult; import com.genersoft.iot.vmp.media.bean.MediaServer; import okhttp3.*; import org.jetbrains.annotations.NotNull; @@ -27,7 +27,10 @@ public class ABLRESTfulUtils { private OkHttpClient client; public interface RequestCallback{ - void run(JSONObject response); + void run(String response); + } + public interface ResultCallback{ + void run(ABLResult response); } private OkHttpClient getClient(){ @@ -53,26 +56,23 @@ public class ABLRESTfulUtils { } - public JSONObject sendPost(MediaServer mediaServerItem, String api, Map param, RequestCallback callback) { + public String sendPost(MediaServer mediaServerItem, String api, Map param, RequestCallback callback) { return sendPost(mediaServerItem, api, param, callback, null); } - public JSONObject sendPost(MediaServer mediaServerItem, String api, Map param, RequestCallback callback, Integer readTimeOut) { + public String sendPost(MediaServer mediaServerItem, String api, Map param, RequestCallback callback, Integer readTimeOut) { OkHttpClient client = getClient(readTimeOut); if (mediaServerItem == null) { return null; } String url = String.format("http://%s:%s/index/api/%s", mediaServerItem.getIp(), mediaServerItem.getHttpPort(), api); - JSONObject responseJSON = new JSONObject(); - //-2自定义流媒体 调用错误码 - responseJSON.put("code",-2); - responseJSON.put("msg","流媒体调用失败"); + String result = null; FormBody.Builder builder = new FormBody.Builder(); builder.add("secret",mediaServerItem.getSecret()); - if (param != null && param.keySet().size() > 0) { + if (param != null && !param.isEmpty()) { for (String key : param.keySet()){ if (param.get(key) != null) { builder.add(key, param.get(key).toString()); @@ -93,8 +93,7 @@ public class ABLRESTfulUtils { if (response.isSuccessful()) { ResponseBody responseBody = response.body(); if (responseBody != null) { - String responseStr = responseBody.string(); - responseJSON = JSON.parseObject(responseStr); + result = responseBody.string(); } }else { response.close(); @@ -123,7 +122,7 @@ public class ABLRESTfulUtils { if (response.isSuccessful()) { try { String responseStr = Objects.requireNonNull(response.body()).string(); - callback.run(JSON.parseObject(responseStr)); + callback.run(responseStr); } catch (IOException e) { logger.error(String.format("[ %s ]请求失败: %s", url, e.getMessage())); } @@ -149,19 +148,16 @@ public class ABLRESTfulUtils { } }); } - - - - return responseJSON; + return result; } - public JSONObject sendGet(MediaServer mediaServerItem, String api, Map param) { + public String sendGet(MediaServer mediaServerItem, String api, Map param) { OkHttpClient client = getClient(); if (mediaServerItem == null) { return null; } - JSONObject responseJSON = null; + String result = null; StringBuilder stringBuffer = new StringBuilder(); stringBuffer.append(String.format("http://%s:%s/index/api/%s", mediaServerItem.getIp(), mediaServerItem.getHttpPort(), api)); if (param != null && !param.keySet().isEmpty()) { @@ -188,8 +184,7 @@ public class ABLRESTfulUtils { if (response.isSuccessful()) { ResponseBody responseBody = response.body(); if (responseBody != null) { - String responseStr = responseBody.string(); - responseJSON = JSON.parseObject(responseStr); + result = responseBody.string(); } }else { response.close(); @@ -201,10 +196,7 @@ public class ABLRESTfulUtils { }catch (IOException e) { logger.error(String.format("[ %s ]请求失败: %s", url, e.getMessage())); } - - - - return responseJSON; + return result; } public void sendGetForImg(MediaServer mediaServerItem, String api, Map params, String targetPath, String fileName) { @@ -330,32 +322,55 @@ public class ABLRESTfulUtils { param.put("enable_mp4", 1); } - JSONObject jsonObject = sendPost(mediaServer, "openRtpServer", param, null); - if (jsonObject.getInteger("code") == 0) { - return jsonObject.getInteger("port"); - }else { + String response = sendPost(mediaServer, "openRtpServer", param, null); + if (response == null) { return 0; + }else { + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult.getCode() == 0) { + return ablResult.getPort(); + }else { + return 0; + } } } - public JSONObject closeStreams(MediaServer mediaServerItem, String app, String stream) { + public ABLResult closeStreams(MediaServer mediaServerItem, String app, String stream) { Map param = new HashMap<>(); param.put("vhost", "__defaultVhost__"); param.put("app", app); param.put("stream", stream); param.put("force", 1); - return sendPost(mediaServerItem, "close_streams",param, null); + String response = sendPost(mediaServerItem, "close_streams", param, null); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } - public JSONObject getServerConfig(MediaServer mediaServerItem){ - return sendPost(mediaServerItem, "getServerConfig",null, null); + public ABLResult getServerConfig(MediaServer mediaServerItem){ + String response = sendPost(mediaServerItem, "getServerConfig", null, null); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } - public JSONObject setConfigParamValue(MediaServer mediaServerItem, String key, Object value){ + public ABLResult setConfigParamValue(MediaServer mediaServerItem, String key, Object value){ Map param = new HashMap<>(); param.put("key", key); param.put("value", value); - return sendGet(mediaServerItem,"setConfigParamValue", param); + String response = sendGet(mediaServerItem, "setConfigParamValue", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } public void stopSendRtp(MediaServer mediaServer,String key) { @@ -364,22 +379,35 @@ public class ABLRESTfulUtils { sendPost(mediaServer,"stopSendRtp", param, null); } - public JSONObject getMediaList(MediaServer mediaServer, String app, String stream) { + public ABLResult getMediaList(MediaServer mediaServer, String app, String stream) { Map param = new HashMap<>(); param.put("app", app); if (stream != null) { param.put("stream", stream); } - return sendPost(mediaServer,"getMediaList", param, null); + + String response = sendGet(mediaServer, "getMediaList", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } - public JSONObject queryRecordList(MediaServer mediaServer, String app, String stream, String startTime, String endTime) { + public ABLResult queryRecordList(MediaServer mediaServer, String app, String stream, String startTime, String endTime) { Map param = new HashMap<>(); param.put("app", app); param.put("stream", stream); param.put("starttime", startTime); param.put("endtime", endTime); - return sendPost(mediaServer,"queryRecordList", param, null); + String response = sendGet(mediaServer, "queryRecordList", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } public void getSnap(MediaServer mediaServer, String app, String stream, int timeoutSec, String path, String fileName) { @@ -397,7 +425,7 @@ public class ABLRESTfulUtils { } - public JSONObject addStreamProxy(MediaServer mediaServer, String app, String stream, String url, boolean disableAudio, boolean enableMp4, String rtpType, Integer timeout) { + public ABLResult addStreamProxy(MediaServer mediaServer, String app, String stream, String url, boolean disableAudio, boolean enableMp4, String rtpType, Integer timeout) { Map param = new HashMap<>(); param.put("app", app); param.put("stream", stream); @@ -405,10 +433,16 @@ public class ABLRESTfulUtils { param.put("disableAudio", disableAudio? "1" : "0"); param.put("enable_mp4", enableMp4 ? "1" : "0"); // TODO rtpType timeout 尚不支持 - return sendPost(mediaServer,"addStreamProxy", param, null); + String response = sendGet(mediaServer, "addStreamProxy", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } - public JSONObject addFFmpegProxy(MediaServer mediaServer, String app, String stream, String url, boolean disableAudio, boolean enableMp4, String rtpType, Integer timeout) { + public ABLResult addFFmpegProxy(MediaServer mediaServer, String app, String stream, String url, boolean disableAudio, boolean enableMp4, String rtpType, Integer timeout) { Map param = new HashMap<>(); param.put("app", app); param.put("stream", stream); @@ -416,19 +450,61 @@ public class ABLRESTfulUtils { param.put("disableAudio", disableAudio); param.put("enable_mp4", enableMp4); // TODO rtpType timeout 尚不支持 - return sendPost(mediaServer,"addFFmpegProxy", param, null); + String response = sendGet(mediaServer, "addFFmpegProxy", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } - public JSONObject delStreamProxy(MediaServer mediaServer, String streamKey) { + public ABLResult delStreamProxy(MediaServer mediaServer, String streamKey) { Map param = new HashMap<>(); param.put("key", streamKey); - return sendPost(mediaServer,"delStreamProxy", param, null); + String response = sendGet(mediaServer, "delStreamProxy", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } - public JSONObject delFFmpegProxy(MediaServer mediaServer, String streamKey) { + public ABLResult delFFmpegProxy(MediaServer mediaServer, String streamKey) { Map param = new HashMap<>(); param.put("key", streamKey); - return sendPost(mediaServer,"delFFmpegProxy", param, null); + String response = sendGet(mediaServer, "delFFmpegProxy", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } + } + + public ABLResult pauseRtpServer(MediaServer mediaServer, String streamKey) { + Map param = new HashMap<>(); + param.put("key", streamKey); + String response = sendGet(mediaServer, "pauseRtpServer", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } + } + + public ABLResult resumeRtpServer(MediaServer mediaServer, String streamKey) { + Map param = new HashMap<>(); + param.put("key", streamKey); + String response = sendGet(mediaServer, "resumeRtpServer", param); + ABLResult ablResult = JSON.parseObject(response, ABLResult.class); + if (ablResult == null) { + return ABLResult.getFailForMediaServer(); + }else { + return ablResult; + } } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLMedia.java b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLMedia.java new file mode 100644 index 000000000..66532c6fc --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLMedia.java @@ -0,0 +1,25 @@ +package com.genersoft.iot.vmp.media.abl.bean; + +import lombok.Data; + +@Data +public class ABLMedia { + private String key; + private String app; + private String stream; + private Integer sourceType; + private Long duration; + private String sim; + private Boolean status; + private Boolean enable_hls; + private Boolean transcodingStatus; + private String sourceURL; + private Integer networkType; + private Integer readerCount; + private String videoCodec; + private Integer width; + private Integer height; + private String audioCodec; + private Integer audioChannels; + private Integer audioSampleRate; +} diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLRecordFile.java b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLRecordFile.java new file mode 100644 index 000000000..4af189fe6 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLRecordFile.java @@ -0,0 +1,10 @@ +package com.genersoft.iot.vmp.media.abl.bean; + +import lombok.Data; + +@Data +public class ABLRecordFile { + private String file; + private Long duration; + private ABLUrls url; +} diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLResult.java b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLResult.java new file mode 100644 index 000000000..d76d916cf --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLResult.java @@ -0,0 +1,48 @@ +package com.genersoft.iot.vmp.media.abl.bean; + +import com.alibaba.fastjson2.JSONArray; +import lombok.Data; + +import java.util.List; + +@Data +public class ABLResult { + private int code; + private String memo; + + + private String key; + private Integer port; + private JSONArray params; + private List mediaList; + + private String app; + private String stream; + private String starttime; + private String endtime; + private ABLUrls url; + private ABLRecordFile recordFileList; + + public static ABLResult getFailForMediaServer() { + ABLResult zlmResult = new ABLResult(); + zlmResult.setCode(-2); + zlmResult.setMemo("流媒体调用失败"); + return zlmResult; + } + + public static ABLResult getMediaServer(int code, String msg) { + ABLResult zlmResult = new ABLResult(); + zlmResult.setCode(code); + zlmResult.setMemo(msg); + return zlmResult; + } + @Override + public String toString() { + return "ZLMResult{" + + "code=" + code + + ", memo='" + memo + '\'' + + (key != null ? (", key=" + key) : "") + + (port != null ? (", port=" + port) : "") + + '}'; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLUrls.java b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLUrls.java new file mode 100644 index 000000000..23a37c0e3 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/ABLUrls.java @@ -0,0 +1,21 @@ +package com.genersoft.iot.vmp.media.abl.bean; + +import com.alibaba.fastjson2.annotation.JSONField; +import lombok.Data; + +@Data +public class ABLUrls { + private String rtsp; + private String rtmp; + + @JSONField(name = "http-flv") + private String httpFlv; + + @JSONField(name = "ws-flv") + private String wsFlv; + + @JSONField(name = "http-mp4") + private String httpMp4; + + private String download; +} diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/OnStreamArriveABLHookParam.java b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/OnStreamArriveABLHookParam.java index efe9b1269..0f552d1c2 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/OnStreamArriveABLHookParam.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/OnStreamArriveABLHookParam.java @@ -1,10 +1,14 @@ package com.genersoft.iot.vmp.media.abl.bean.hook; import com.genersoft.iot.vmp.media.abl.bean.AblUrls; +import lombok.Getter; +import lombok.Setter; /** * 流到来的事件 */ +@Getter +@Setter public class OnStreamArriveABLHookParam extends ABLHookParam{ @@ -105,141 +109,4 @@ public class OnStreamArriveABLHookParam extends ABLHookParam{ 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; - } } diff --git a/src/main/java/com/genersoft/iot/vmp/media/bean/MediaInfo.java b/src/main/java/com/genersoft/iot/vmp/media/bean/MediaInfo.java index 9904186e5..54cf6ebcd 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/bean/MediaInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/media/bean/MediaInfo.java @@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.media.bean; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.genersoft.iot.vmp.media.abl.bean.ABLMedia; 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.OriginType; @@ -270,7 +271,38 @@ public class MediaInfo { return mediaInfo; } - public static MediaInfo getInstanceForAblJson(JSONObject mediaJSON, MediaServer mediaServer) { - return null; + public static MediaInfo getInstance(ABLMedia ablMedia, MediaServer mediaServer) { + MediaInfo mediaInfo = new MediaInfo(); + mediaInfo.setApp(ablMedia.getApp()); + mediaInfo.setStream(ablMedia.getStream()); + mediaInfo.setMediaServer(mediaServer); + mediaInfo.setReaderCount(ablMedia.getReaderCount()); + mediaInfo.setOnline(true); + mediaInfo.setVideoCodec(ablMedia.getVideoCodec()); + switch (ablMedia.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(ablMedia.getWidth()); + mediaInfo.setHeight(ablMedia.getHeight()); + mediaInfo.setAudioCodec(ablMedia.getAudioCodec()); + mediaInfo.setAudioChannels(ablMedia.getAudioChannels()); + mediaInfo.setAudioSampleRate(ablMedia.getAudioSampleRate()); + + return mediaInfo; } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java index ed57ab4dd..27e85a9d0 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java @@ -7,13 +7,10 @@ import com.genersoft.iot.vmp.common.VideoManagerConstants; import com.genersoft.iot.vmp.conf.UserSetting; import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; -import com.genersoft.iot.vmp.gb28181.bean.SendRtpInfo; import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; import com.genersoft.iot.vmp.gb28181.service.IDeviceChannelService; import com.genersoft.iot.vmp.gb28181.service.IInviteStreamService; import com.genersoft.iot.vmp.gb28181.session.SipInviteSessionManager; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander; -import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommanderForPlatform; import com.genersoft.iot.vmp.jt1078.bean.JTMediaStreamType; import com.genersoft.iot.vmp.jt1078.service.Ijt1078PlayService; import com.genersoft.iot.vmp.jt1078.service.Ijt1078Service; @@ -21,8 +18,8 @@ import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.bean.ResultForOnPublish; import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; import com.genersoft.iot.vmp.service.IMediaService; -import com.genersoft.iot.vmp.service.ISendRtpServerService; import com.genersoft.iot.vmp.service.IRecordPlanService; +import com.genersoft.iot.vmp.service.ISendRtpServerService; import com.genersoft.iot.vmp.service.IUserService; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.streamProxy.bean.StreamProxy; @@ -37,7 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; -import java.util.List; import java.util.Map; @Slf4j @@ -170,7 +166,7 @@ public class MediaServiceImpl implements IMediaService { inviteInfo = inviteStreamService.getInviteInfoBySSRC(ssrc); if (inviteInfo != null) { result.setStream_replace(inviteInfo.getStream()); - log.info("[ZLM HOOK]推流鉴权 stream: {} 替换为 {}", stream, inviteInfo.getStream()); + log.info("[HOOK]推流鉴权 stream: {} 替换为 {}", stream, inviteInfo.getStream()); stream = inviteInfo.getStream(); } }