优化ABL结果封装完成

This commit is contained in:
lin
2025-09-16 17:57:59 +08:00
parent c1672728d3
commit 403e7648f9
10 changed files with 350 additions and 312 deletions

View File

@@ -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<String, Object> 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<String, Object> 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<StreamInfo> 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<StreamInfo> 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<String> 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<String> 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<String> 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;
}

View File

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

View File

@@ -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<String, Object> param, RequestCallback callback) {
public String sendPost(MediaServer mediaServerItem, String api, Map<String, Object> param, RequestCallback callback) {
return sendPost(mediaServerItem, api, param, callback, null);
}
public JSONObject sendPost(MediaServer mediaServerItem, String api, Map<String, Object> param, RequestCallback callback, Integer readTimeOut) {
public String sendPost(MediaServer mediaServerItem, String api, Map<String, Object> 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<String, Object> param) {
public String sendGet(MediaServer mediaServerItem, String api, Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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;
}
}
}

View File

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

View File

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

View File

@@ -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<ABLMedia> 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) : "") +
'}';
}
}

View File

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

View File

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

View File

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

View File

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