From 5d901b5e3f033e8b04e53420d68626cbd87431c8 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 06 五月 2022 10:12:34 +0800 Subject: [PATCH] 使用阿里代码规范。规范代码写法 --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java | 241 ++++++++++++++++++++++++++++++----------------- 1 files changed, 152 insertions(+), 89 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java index 5919c9f..a7e6016 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java @@ -2,18 +2,15 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.genersoft.iot.vmp.conf.MediaConfig; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; -import com.genersoft.iot.vmp.gb28181.session.SsrcUtil; -import com.genersoft.iot.vmp.media.zlm.dto.IMediaServerItem; import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; -import java.util.HashMap; -import java.util.Map; +import java.util.*; @Component public class ZLMRTPServerFactory { @@ -21,73 +18,101 @@ private Logger logger = LoggerFactory.getLogger("ZLMRTPServerFactory"); @Autowired - private MediaConfig mediaConfig; - - @Autowired private ZLMRESTfulUtils zlmresTfulUtils; private int[] portRangeArray = new int[2]; - private int currentPort = 0; - - private Map<String, Integer> currentStreams = null; - - public int createRTPServer(IMediaServerItem mediaServerItem, String streamId) { - if (currentStreams == null) { - currentStreams = new HashMap<>(); - JSONObject jsonObject = zlmresTfulUtils.listRtpServer(mediaServerItem); - if (jsonObject != null) { - JSONArray data = jsonObject.getJSONArray("data"); - if (data != null) { - for (int i = 0; i < data.size(); i++) { - JSONObject dataItem = data.getJSONObject(i); - currentStreams.put(dataItem.getString("stream_id"), dataItem.getInteger("port")); - } + public int getFreePort(MediaServerItem mediaServerItem, int startPort, int endPort, List<Integer> usedFreelist) { + if (endPort <= startPort) { + return -1; + } + if (usedFreelist == null) { + usedFreelist = new ArrayList<>(); + } + JSONObject listRtpServerJsonResult = zlmresTfulUtils.listRtpServer(mediaServerItem); + if (listRtpServerJsonResult != null) { + JSONArray data = listRtpServerJsonResult.getJSONArray("data"); + if (data != null) { + for (int i = 0; i < data.size(); i++) { + JSONObject dataItem = data.getJSONObject(i); + usedFreelist.add(dataItem.getInteger("port")); } } - } - // 宸茬粡鍦ㄦ帹娴� - if (currentStreams.get(streamId) != null) { - Map<String, Object> closeRtpServerParam = new HashMap<>(); - closeRtpServerParam.put("stream_id", streamId); - zlmresTfulUtils.closeRtpServer(mediaServerItem, closeRtpServerParam); - currentStreams.remove(streamId); } Map<String, Object> param = new HashMap<>(); int result = -1; - int newPort = getPortFromportRange(); - param.put("port", newPort); + // 璁剧疆鎺ㄦ祦绔彛 + if (startPort%2 == 1) { + startPort ++; + } + boolean checkPort = false; + for (int i = startPort; i < endPort + 1; i+=2) { + if (!usedFreelist.contains(i)){ + checkPort = true; + startPort = i; + break; + } + } + if (!checkPort) { + logger.warn("鏈壘鍒拌妭鐐箋}涓婅寖鍥碵{}-{}]鐨勭┖闂茬鍙�", mediaServerItem.getId(), startPort, endPort); + return -1; + } + param.put("port", startPort); + String stream = UUID.randomUUID().toString(); param.put("enable_tcp", 1); - param.put("stream_id", streamId); - JSONObject jsonObject = zlmresTfulUtils.openRtpServer(mediaServerItem, param); + param.put("stream_id", stream); + param.put("port", 0); + JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param); - if (jsonObject != null) { - switch (jsonObject.getInteger("code")){ - case 0: - result= newPort; - break; - case -300: // id宸茬粡瀛樺湪, 鍙兘宸茬粡鍦ㄥ叾浠栫鍙f帹娴� - Map<String, Object> closeRtpServerParam = new HashMap<>(); - closeRtpServerParam.put("stream_id", streamId); - zlmresTfulUtils.closeRtpServer(mediaServerItem, closeRtpServerParam); - result = newPort; - break; - case -400: // 绔彛鍗犵敤 - result= createRTPServer(mediaServerItem, streamId); - break; - default: - logger.error("鍒涘缓RTP Server 澶辫触 {}: " + jsonObject.getString("msg"), newPort); - break; + if (openRtpServerResultJson != null) { + if (openRtpServerResultJson.getInteger("code") == 0) { + result= openRtpServerResultJson.getInteger("port"); + Map<String, Object> closeRtpServerParam = new HashMap<>(); + closeRtpServerParam.put("stream_id", stream); + zlmresTfulUtils.closeRtpServer(mediaServerItem, closeRtpServerParam); + }else { + usedFreelist.add(startPort); + startPort +=2; + result = getFreePort(mediaServerItem, startPort, endPort,usedFreelist); } }else { // 妫�鏌LM鐘舵�� - logger.error("鍒涘缓RTP Server 澶辫触 {}: 璇锋鏌LM鏈嶅姟", newPort); + logger.error("鍒涘缓RTP Server 澶辫触 {}: 璇锋鏌LM鏈嶅姟", param.get("port")); } return result; } - public boolean closeRTPServer(IMediaServerItem serverItem, String streamId) { + public int createRTPServer(MediaServerItem mediaServerItem, String streamId, int ssrc) { + int result = -1; + // 鏌ヨ姝tp server 鏄惁宸茬粡瀛樺湪 + JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId); + if (rtpInfo != null && rtpInfo.getInteger("code") == 0 && rtpInfo.getBoolean("exist")) { + result = rtpInfo.getInteger("local_port"); + return result; + } + Map<String, Object> param = new HashMap<>(); + // 鎺ㄦ祦绔彛璁剧疆0鍒欎娇鐢ㄩ殢鏈虹鍙� + param.put("enable_tcp", 1); + param.put("stream_id", streamId); + param.put("port", 0); + param.put("ssrc", ssrc); + JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param); + + if (openRtpServerResultJson != null) { + if (openRtpServerResultJson.getInteger("code") == 0) { + result= openRtpServerResultJson.getInteger("port"); + }else { + logger.error("鍒涘缓RTP Server 澶辫触 {}: ", openRtpServerResultJson.getString("msg")); + } + }else { + // 妫�鏌LM鐘舵�� + logger.error("鍒涘缓RTP Server 澶辫触 {}: 璇锋鏌LM鏈嶅姟", param.get("port")); + } + return result; + } + + public boolean closeRTPServer(MediaServerItem serverItem, String streamId) { boolean result = false; if (serverItem !=null){ Map<String, Object> param = new HashMap<>(); @@ -107,23 +132,32 @@ return result; } - private int getPortFromportRange() { - if (currentPort == 0) { - String[] portRangeStrArray = mediaConfig.getRtpPortRange().split(","); - portRangeArray[0] = Integer.parseInt(portRangeStrArray[0]); - portRangeArray[1] = Integer.parseInt(portRangeStrArray[1]); - } - - if (currentPort == 0 || currentPort++ > portRangeArray[1]) { - currentPort = portRangeArray[0]; - return portRangeArray[0]; - } else { - if (currentPort % 2 == 1) { - currentPort++; - } - return currentPort++; - } - } +// private int getPortFromportRange(MediaServerItem mediaServerItem) { +// int currentPort = mediaServerItem.getCurrentPort(); +// if (currentPort == 0) { +// String[] portRangeStrArray = mediaServerItem.getSendRtpPortRange().split(","); +// if (portRangeStrArray.length != 2) { +// portRangeArray[0] = 30000; +// portRangeArray[1] = 30500; +// }else { +// portRangeArray[0] = Integer.parseInt(portRangeStrArray[0]); +// portRangeArray[1] = Integer.parseInt(portRangeStrArray[1]); +// } +// } +// +// if (currentPort == 0 || currentPort++ > portRangeArray[1]) { +// currentPort = portRangeArray[0]; +// mediaServerItem.setCurrentPort(currentPort); +// return portRangeArray[0]; +// } else { +// if (currentPort % 2 == 1) { +// currentPort++; +// } +// currentPort++; +// mediaServerItem.setCurrentPort(currentPort); +// return currentPort; +// } +// } /** * 鍒涘缓涓�涓浗鏍囨帹娴� @@ -135,12 +169,21 @@ * @param tcp 鏄惁涓簍cp * @return SendRtpItem */ - public SendRtpItem createSendRtpItem(IMediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String deviceId, String channelId, boolean tcp){ - String playSsrc = SsrcUtil.getPlaySsrc(); - int localPort = createRTPServer(serverItem, SsrcUtil.getPlaySsrc()); - if (localPort != -1) { - closeRTPServer(serverItem, playSsrc); + public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String deviceId, String channelId, boolean tcp){ + + // 浣跨敤RTPServer 鍔熻兘鎵句竴涓彲鐢ㄧ殑绔彛 + String sendRtpPortRange = serverItem.getSendRtpPortRange(); + if (StringUtils.isEmpty(sendRtpPortRange)) { + return null; + } + String[] portRangeStrArray = serverItem.getSendRtpPortRange().split(","); + int localPort = -1; + if (portRangeStrArray.length != 2) { + localPort = getFreePort(serverItem, 30000, 30500, null); }else { + localPort = getFreePort(serverItem, Integer.parseInt(portRangeStrArray[0]), Integer.parseInt(portRangeStrArray[1]), null); + } + if (localPort == -1) { logger.error("娌℃湁鍙敤鐨勭鍙�"); return null; } @@ -168,12 +211,20 @@ * @param tcp 鏄惁涓簍cp * @return SendRtpItem */ - public SendRtpItem createSendRtpItem(IMediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String app, String stream, String channelId, boolean tcp){ - String playSsrc = SsrcUtil.getPlaySsrc(); - int localPort = createRTPServer(serverItem, SsrcUtil.getPlaySsrc()); - if (localPort != -1) { - closeRTPServer(serverItem, playSsrc); + public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String app, String stream, String channelId, boolean tcp){ + // 浣跨敤RTPServer 鍔熻兘鎵句竴涓彲鐢ㄧ殑绔彛 + String sendRtpPortRange = serverItem.getSendRtpPortRange(); + if (StringUtils.isEmpty(sendRtpPortRange)) { + return null; + } + String[] portRangeStrArray = serverItem.getSendRtpPortRange().split(","); + int localPort = -1; + if (portRangeStrArray.length != 2) { + localPort = getFreePort(serverItem, 30000, 30500, null); }else { + localPort = getFreePort(serverItem, Integer.parseInt(portRangeStrArray[0]), Integer.parseInt(portRangeStrArray[1]), null); + } + if (localPort == -1) { logger.error("娌℃湁鍙敤鐨勭鍙�"); return null; } @@ -192,20 +243,20 @@ } /** - * 璋冪敤zlm RESTful API 鈥斺�� startSendRtp + * 璋冪敤zlm RESTFUL API 鈥斺�� startSendRtp */ - public Boolean startSendRtpStream(IMediaServerItem mediaServerItem, Map<String, Object>param) { + public JSONObject startSendRtpStream(MediaServerItem mediaServerItem, Map<String, Object>param) { Boolean result = false; JSONObject jsonObject = zlmresTfulUtils.startSendRtp(mediaServerItem, param); if (jsonObject == null) { logger.error("RTP鎺ㄦ祦澶辫触: 璇锋鏌LM鏈嶅姟"); } else if (jsonObject.getInteger("code") == 0) { result= true; - logger.info("RTP鎺ㄦ祦[ {}/{} ]璇锋眰鎴愬姛锛屾湰鍦版帹娴佺鍙o細{}" ,param.get("app"), param.get("stream"), jsonObject.getString("local_port")); + logger.info("RTP鎺ㄦ祦鎴愬姛[ {}/{} ]锛寋}->{}:{}, " ,param.get("app"), param.get("stream"), jsonObject.getString("local_port"), param.get("dst_url"), param.get("dst_port")); } else { - logger.error("RTP鎺ㄦ祦澶辫触: " + jsonObject.getString("msg")); + logger.error("RTP鎺ㄦ祦澶辫触: {}, 鍙傛暟锛歿}",jsonObject.getString("msg"),JSONObject.toJSON(param)); } - return result; + return jsonObject; } /** @@ -219,7 +270,7 @@ /** * 鏌ヨ寰呰浆鎺ㄧ殑娴佹槸鍚﹀氨缁� */ - public Boolean isStreamReady(IMediaServerItem mediaServerItem, String app, String streamId) { + public Boolean isStreamReady(MediaServerItem mediaServerItem, String app, String streamId) { JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtmp", streamId); return (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")); } @@ -229,15 +280,27 @@ * @param streamId * @return */ - public int totalReaderCount(IMediaServerItem mediaServerItem, String app, String streamId) { + public int totalReaderCount(MediaServerItem mediaServerItem, String app, String streamId) { JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtmp", streamId); + Integer code = mediaInfo.getInteger("code"); + if (mediaInfo == null) { + return 0; + } + if ( code < 0) { + logger.warn("鏌ヨ娴�({}/{})鏄惁鏈夊叾瀹冭鐪嬭�呮椂寰楀埌锛� {}", app, streamId, mediaInfo.getString("msg")); + return -1; + } + if ( code == 0 && ! mediaInfo.getBoolean("online")) { + logger.warn("鏌ヨ娴�({}/{})鏄惁鏈夊叾瀹冭鐪嬭�呮椂寰楀埌锛� {}", app, streamId, mediaInfo.getString("msg")); + return -1; + } return mediaInfo.getInteger("totalReaderCount"); } /** * 璋冪敤zlm RESTful API 鈥斺�� stopSendRtp */ - public Boolean stopSendRtpStream(IMediaServerItem mediaServerItem,Map<String, Object>param) { + public Boolean stopSendRtpStream(MediaServerItem mediaServerItem, Map<String, Object>param) { Boolean result = false; JSONObject jsonObject = zlmresTfulUtils.stopSendRtp(mediaServerItem, param); if (jsonObject == null) { @@ -246,7 +309,7 @@ result= true; logger.info("鍋滄RTP鎺ㄦ祦鎴愬姛"); } else { - logger.error("鍋滄RTP鎺ㄦ祦澶辫触: " + jsonObject.getString("msg")); + logger.error("鍋滄RTP鎺ㄦ祦澶辫触: {}, 鍙傛暟锛歿}",jsonObject.getString("msg"),JSONObject.toJSON(param)); } return result; } -- Gitblit v1.8.0