From a42dda2bd3cc1cf8c20cc61e7ad9211eadecbaf3 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期四, 24 二月 2022 16:55:06 +0800 Subject: [PATCH] 规范数据库,添加必要约束,优化通道批量导入功能 --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java | 207 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 153 insertions(+), 54 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 00951ba..30a1509 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 @@ -1,13 +1,14 @@ package com.genersoft.iot.vmp.media.zlm; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; -import com.genersoft.iot.vmp.gb28181.session.SsrcUtil; +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.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; import java.util.HashMap; import java.util.Map; @@ -17,86 +18,120 @@ private Logger logger = LoggerFactory.getLogger("ZLMRTPServerFactory"); - @Value("${media.rtp.udpPortRange}") - private String udpPortRange; - @Autowired private ZLMRESTfulUtils zlmresTfulUtils; - private int[] udpPortRangeArray = new int[2]; + private int[] portRangeArray = new int[2]; - private int currentPort = 0; + public int createRTPServer(MediaServerItem mediaServerItem, String streamId) { + Map<String, Integer> currentStreams = new HashMap<>(); + 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); + currentStreams.put(dataItem.getString("stream_id"), 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); + } - public int createRTPServer(String streamId) { Map<String, Object> param = new HashMap<>(); int result = -1; - int newPort = getPortFromUdpPortRange(); - param.put("port", newPort); + /** + * 涓嶈缃帹娴佺鍙g鍒欎娇鐢ㄩ殢鏈虹鍙� + */ + if (StringUtils.isEmpty(mediaServerItem.getSendRtpPortRange())){ + param.put("port", 0); + }else { + int newPort = getPortFromportRange(mediaServerItem); + param.put("port", newPort); + } param.put("enable_tcp", 1); param.put("stream_id", streamId); - JSONObject jsonObject = zlmresTfulUtils.openRtpServer(param); - System.out.println(jsonObject); + JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param); - if (jsonObject != null) { - switch (jsonObject.getInteger("code")){ + if (openRtpServerResultJson != null) { + switch (openRtpServerResultJson.getInteger("code")){ case 0: - result= newPort; + result= openRtpServerResultJson.getInteger("port"); break; - case -300: // id宸茬粡瀛樺湪 - result = newPort; + case -300: // id宸茬粡瀛樺湪, 鍙兘宸茬粡鍦ㄥ叾浠栫鍙f帹娴� + Map<String, Object> closeRtpServerParam = new HashMap<>(); + closeRtpServerParam.put("stream_id", streamId); + zlmresTfulUtils.closeRtpServer(mediaServerItem, closeRtpServerParam); + result = createRTPServer(mediaServerItem, streamId);; break; case -400: // 绔彛鍗犵敤 - result= createRTPServer(streamId); + result= createRTPServer(mediaServerItem, streamId); break; default: - logger.error("鍒涘缓RTP Server 澶辫触: " + jsonObject.getString("msg")); + logger.error("鍒涘缓RTP Server 澶辫触 {}: " + openRtpServerResultJson.getString("msg"), param.get("port")); break; } }else { // 妫�鏌LM鐘舵�� - logger.error("鍒涘缓RTP Server 澶辫触: 璇锋鏌LM鏈嶅姟"); + logger.error("鍒涘缓RTP Server 澶辫触 {}: 璇锋鏌LM鏈嶅姟", param.get("port")); } return result; } - public boolean closeRTPServer(String streamId) { + public boolean closeRTPServer(MediaServerItem serverItem, String streamId) { boolean result = false; - Map<String, Object> param = new HashMap<>(); - param.put("stream_id", streamId); - JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(param); - if (jsonObject != null ) { - if (jsonObject.getInteger("code") == 0) { - result = jsonObject.getInteger("hit") == 1; + if (serverItem !=null){ + Map<String, Object> param = new HashMap<>(); + param.put("stream_id", streamId); + JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(serverItem, param); + if (jsonObject != null ) { + if (jsonObject.getInteger("code") == 0) { + result = jsonObject.getInteger("hit") == 1; + }else { + logger.error("鍏抽棴RTP Server 澶辫触: " + jsonObject.getString("msg")); + } }else { - logger.error("鍏抽棴RTP Server 澶辫触: " + jsonObject.getString("msg")); + // 妫�鏌LM鐘舵�� + logger.error("鍏抽棴RTP Server 澶辫触: 璇锋鏌LM鏈嶅姟"); } - }else { - // 妫�鏌LM鐘舵�� - logger.error("鍏抽棴RTP Server 澶辫触: 璇锋鏌LM鏈嶅姟"); } return result; } - private int getPortFromUdpPortRange() { + private int getPortFromportRange(MediaServerItem mediaServerItem) { + int currentPort = mediaServerItem.getCurrentPort(); if (currentPort == 0) { - String[] udpPortRangeStrArray = udpPortRange.split(","); - udpPortRangeArray[0] = Integer.parseInt(udpPortRangeStrArray[0]); - udpPortRangeArray[1] = Integer.parseInt(udpPortRangeStrArray[1]); + 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++ > udpPortRangeArray[1]) { - currentPort = udpPortRangeArray[0]; - return udpPortRangeArray[0]; + if (currentPort == 0 || currentPort++ > portRangeArray[1]) { + currentPort = portRangeArray[0]; + mediaServerItem.setCurrentPort(currentPort); + return portRangeArray[0]; } else { if (currentPort % 2 == 1) { currentPort++; } - return currentPort++; + currentPort++; + mediaServerItem.setCurrentPort(currentPort); + return currentPort; } } /** - * 鍒涘缓涓�涓帹娴� + * 鍒涘缓涓�涓浗鏍囨帹娴� * @param ip 鎺ㄦ祦ip * @param port 鎺ㄦ祦绔彛 * @param ssrc 鎺ㄦ祦鍞竴鏍囪瘑 @@ -105,11 +140,15 @@ * @param tcp 鏄惁涓簍cp * @return SendRtpItem */ - public SendRtpItem createSendRtpItem(String ip, int port, String ssrc, String platformId, String deviceId, String channelId, boolean tcp){ - String playSsrc = SsrcUtil.getPlaySsrc(); - int localPort = createRTPServer(SsrcUtil.getPlaySsrc()); + public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String deviceId, String channelId, boolean tcp){ + + // 浣跨敤RTPServer 鍔熻兘鎵句竴涓彲鐢ㄧ殑绔彛 + String playSsrc = serverItem.getSsrcConfig().getPlaySsrc(); + int localPort = createRTPServer(serverItem, playSsrc); if (localPort != -1) { - closeRTPServer(playSsrc); + // TODO 楂樺苟鍙戞椂鍙兘鍥犱负鏈斁鍏ョ紦瀛樿�宻src鍐茬獊 + serverItem.getSsrcConfig().releaseSsrc(playSsrc); + closeRTPServer(serverItem, playSsrc); }else { logger.error("娌℃湁鍙敤鐨勭鍙�"); return null; @@ -122,22 +161,58 @@ sendRtpItem.setDeviceId(deviceId); sendRtpItem.setChannelId(channelId); sendRtpItem.setTcp(tcp); + sendRtpItem.setApp("rtp"); sendRtpItem.setLocalPort(localPort); + sendRtpItem.setMediaServerId(serverItem.getId()); + return sendRtpItem; + } + + /** + * 鍒涘缓涓�涓洿鎾帹娴� + * @param ip 鎺ㄦ祦ip + * @param port 鎺ㄦ祦绔彛 + * @param ssrc 鎺ㄦ祦鍞竴鏍囪瘑 + * @param platformId 骞冲彴id + * @param channelId 閫氶亾id + * @param tcp 鏄惁涓簍cp + * @return SendRtpItem + */ + public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String app, String stream, String channelId, boolean tcp){ + String playSsrc = serverItem.getSsrcConfig().getPlaySsrc(); + int localPort = createRTPServer(serverItem, playSsrc); + if (localPort != -1) { + // TODO 楂樺苟鍙戞椂鍙兘鍥犱负鏈斁鍏ョ紦瀛樿�宻src鍐茬獊 + serverItem.getSsrcConfig().releaseSsrc(ssrc); + closeRTPServer(serverItem, playSsrc); + }else { + logger.error("娌℃湁鍙敤鐨勭鍙�"); + return null; + } + SendRtpItem sendRtpItem = new SendRtpItem(); + sendRtpItem.setIp(ip); + sendRtpItem.setPort(port); + sendRtpItem.setSsrc(ssrc); + sendRtpItem.setApp(app); + sendRtpItem.setStreamId(stream); + sendRtpItem.setPlatformId(platformId); + sendRtpItem.setChannelId(channelId); + sendRtpItem.setTcp(tcp); + sendRtpItem.setLocalPort(localPort); + sendRtpItem.setMediaServerId(serverItem.getId()); return sendRtpItem; } /** * 璋冪敤zlm RESTful API 鈥斺�� startSendRtp */ - public Boolean startSendRtpStream(Map<String, Object>param) { + public Boolean startSendRtpStream(MediaServerItem mediaServerItem, Map<String, Object>param) { Boolean result = false; - JSONObject jsonObject = zlmresTfulUtils.startSendRtp(param); - System.out.println(jsonObject); + JSONObject jsonObject = zlmresTfulUtils.startSendRtp(mediaServerItem, param); if (jsonObject == null) { logger.error("RTP鎺ㄦ祦澶辫触: 璇锋鏌LM鏈嶅姟"); } else if (jsonObject.getInteger("code") == 0) { result= true; - logger.error("RTP鎺ㄦ祦璇锋眰鎴愬姛锛屾湰鍦版帹娴佺鍙o細" + jsonObject.getString("local_port")); + logger.info("RTP鎺ㄦ祦[ {}/{} ]璇锋眰鎴愬姛锛屾湰鍦版帹娴佺鍙o細{}" ,param.get("app"), param.get("stream"), jsonObject.getString("local_port")); } else { logger.error("RTP鎺ㄦ祦澶辫触: " + jsonObject.getString("msg")); } @@ -147,26 +222,50 @@ /** * 鏌ヨ寰呰浆鎺ㄧ殑娴佹槸鍚﹀氨缁� */ - public Boolean isRtpReady(String streamId) { - JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId); + public Boolean isRtpReady(MediaServerItem mediaServerItem, String streamId) { + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem,"rtp", "rtmp", streamId); return (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")); + } + + /** + * 鏌ヨ寰呰浆鎺ㄧ殑娴佹槸鍚﹀氨缁� + */ + 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")); + } + + /** + * 鏌ヨ杞帹鐨勬祦鏄惁鏈夊叾瀹冭鐪嬭�� + * @param streamId + * @return + */ + public int totalReaderCount(MediaServerItem mediaServerItem, String app, String streamId) { + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtmp", streamId); + if (mediaInfo == null) { + return 0; + } + return mediaInfo.getInteger("totalReaderCount"); } /** * 璋冪敤zlm RESTful API 鈥斺�� stopSendRtp */ - public Boolean stopSendRtpStream(Map<String, Object>param) { + public Boolean stopSendRtpStream(MediaServerItem mediaServerItem, Map<String, Object>param) { Boolean result = false; - JSONObject jsonObject = zlmresTfulUtils.stopSendRtp(param); - System.out.println(jsonObject); + JSONObject jsonObject = zlmresTfulUtils.stopSendRtp(mediaServerItem, param); if (jsonObject == null) { logger.error("鍋滄RTP鎺ㄦ祦澶辫触: 璇锋鏌LM鏈嶅姟"); } else if (jsonObject.getInteger("code") == 0) { result= true; - logger.error("鍋滄RTP鎺ㄦ祦鎴愬姛"); + logger.info("鍋滄RTP鎺ㄦ祦鎴愬姛"); } else { logger.error("鍋滄RTP鎺ㄦ祦澶辫触: " + jsonObject.getString("msg")); } return result; } + + public void closeAllSendRtpStream() { + + } } -- Gitblit v1.8.0