From c42d391290adc50348807d623c4b689ab1f109fc Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期五, 14 七月 2023 08:34:15 +0800 Subject: [PATCH] 修复数据存储 --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java | 309 ++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 255 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 f69ff0f..82a0faf 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,10 +1,14 @@ package com.genersoft.iot.vmp.media.zlm; -import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.genersoft.iot.vmp.common.CommonCallback; +import com.genersoft.iot.vmp.conf.UserSetting; +import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; +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 java.util.HashMap; @@ -15,81 +19,278 @@ private Logger logger = LoggerFactory.getLogger("ZLMRTPServerFactory"); - @Value("${media.rtp.udpPortRange}") - private String udpPortRange; - @Autowired private ZLMRESTfulUtils zlmresTfulUtils; - private int[] udpPortRangeArray = new int[2]; + @Autowired + private UserSetting userSetting; - private int currentPort = 0; + @Autowired + private ZlmHttpHookSubscribe hookSubscribe; - public int createRTPServer(String streamId) { - Map<String, Object> param = new HashMap<>(); + @Autowired + private SendRtpPortManager sendRtpPortManager; + + /** + * 寮�鍚痳tpServer + * @param mediaServerItem zlm鏈嶅姟瀹炰緥 + * @param streamId 娴両d + * @param ssrc ssrc + * @param port 绔彛锛� 0/null涓轰娇鐢ㄩ殢鏈� + * @param reUsePort 鏄惁閲嶇敤绔彛 + * @param tcpMode 0/null udp 妯″紡锛�1 tcp 琚姩妯″紡, 2 tcp 涓诲姩妯″紡銆� + * @return + */ + public int createRTPServer(MediaServerItem mediaServerItem, String streamId, int ssrc, Integer port, Boolean reUsePort, Integer tcpMode) { int result = -1; - int newPort = getPortFromUdpPortRange(); - param.put("port", newPort); - param.put("enable_tcp", 1); - param.put("stream_id", streamId); - JSONObject jsonObject = zlmresTfulUtils.openRtpServer(param); - System.out.println(jsonObject); + // 鏌ヨ姝tp server 鏄惁宸茬粡瀛樺湪 + JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, streamId); + logger.info(JSONObject.toJSONString(rtpInfo)); + if(rtpInfo.getInteger("code") == 0){ + if (rtpInfo.getBoolean("exist")) { + result = rtpInfo.getInteger("local_port"); + if (result == 0) { + // 姝ゆ椂璇存槑rtpServer宸茬粡鍒涘缓浣嗘槸娴佽繕娌℃湁鎺ㄤ笂鏉� + // 姝ゆ椂閲嶆柊鎵撳紑rtpServer + Map<String, Object> param = new HashMap<>(); + param.put("stream_id", streamId); + JSONObject jsonObject = zlmresTfulUtils.closeRtpServer(mediaServerItem, param); + if (jsonObject != null ) { + if (jsonObject.getInteger("code") == 0) { + return createRTPServer(mediaServerItem, streamId, ssrc, port, reUsePort, tcpMode); + }else { + logger.warn("[寮�鍚痳tpServer], 閲嶅惎RtpServer閿欒"); + } + } + } + return result; + } + }else if(rtpInfo.getInteger("code") == -2){ + return result; + } - if (jsonObject != null) { - switch (jsonObject.getInteger("code")){ - case 0: - result= newPort; - break; - case -300: // id宸茬粡瀛樺湪 - result = newPort; - break; - case -400: // 绔彛鍗犵敤 - result= createRTPServer(streamId); - break; - default: - logger.error("鍒涘缓RTP Server 澶辫触: " + jsonObject.getString("msg")); - break; + Map<String, Object> param = new HashMap<>(); + + if (tcpMode == null) { + tcpMode = 0; + } + param.put("tcp_mode", tcpMode); + param.put("stream_id", streamId); + if (reUsePort != null) { + param.put("re_use_port", reUsePort?"1":"0"); + } + // 鎺ㄦ祦绔彛璁剧疆0鍒欎娇鐢ㄩ殢鏈虹鍙� + if (port == null) { + param.put("port", 0); + }else { + param.put("port", port); + } + if (ssrc != 0) { + param.put("ssrc", ssrc); + } + + JSONObject openRtpServerResultJson = zlmresTfulUtils.openRtpServer(mediaServerItem, param); + logger.info(JSONObject.toJSONString(openRtpServerResultJson)); + 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鏈嶅姟"); + 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; + 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 { + // 妫�鏌LM鐘舵�� + logger.error("鍏抽棴RTP Server 澶辫触: 璇锋鏌LM鏈嶅姟"); + } + } + return result; + } + + public void closeRtpServer(MediaServerItem serverItem, String streamId, CommonCallback<Boolean> callback) { + if (serverItem == null) { + callback.run(false); + return; + } 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; + zlmresTfulUtils.closeRtpServer(serverItem, param, jsonObject -> { + if (jsonObject != null ) { + if (jsonObject.getInteger("code") == 0) { + callback.run(jsonObject.getInteger("hit") == 1); + return; + }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鏈嶅姟"); + callback.run(false); + }); + + + } + + + /** + * 鍒涘缓涓�涓浗鏍囨帹娴� + * @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 deviceId, String channelId, boolean tcp, boolean rtcp){ + + // 榛樿涓洪殢鏈虹鍙� + int localPort = 0; + if (userSetting.getGbSendStreamStrict()) { + if (userSetting.getGbSendStreamStrict()) { + localPort = sendRtpPortManager.getNextPort(serverItem.getId()); + if (localPort == 0) { + return null; + } + } + } + SendRtpItem sendRtpItem = new SendRtpItem(); + sendRtpItem.setIp(ip); + sendRtpItem.setPort(port); + sendRtpItem.setSsrc(ssrc); + sendRtpItem.setPlatformId(platformId); + sendRtpItem.setDeviceId(deviceId); + sendRtpItem.setChannelId(channelId); + sendRtpItem.setTcp(tcp); + sendRtpItem.setRtcp(rtcp); + sendRtpItem.setApp("rtp"); + sendRtpItem.setLocalPort(localPort); + sendRtpItem.setServerId(userSetting.getServerId()); + 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, boolean rtcp){ + // 榛樿涓洪殢鏈虹鍙� + int localPort = 0; + if (userSetting.getGbSendStreamStrict()) { + localPort = sendRtpPortManager.getNextPort(serverItem.getId()); + if (localPort == 0) { + 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.setServerId(userSetting.getServerId()); + sendRtpItem.setMediaServerId(serverItem.getId()); + sendRtpItem.setRtcp(rtcp); + return sendRtpItem; + } + + /** + * 璋冪敤zlm RESTFUL API 鈥斺�� startSendRtp + */ + public JSONObject startSendRtpStream(MediaServerItem mediaServerItem, Map<String, Object>param) { + return zlmresTfulUtils.startSendRtp(mediaServerItem, param); + } + + /** + * 鏌ヨ寰呰浆鎺ㄧ殑娴佹槸鍚﹀氨缁� + */ + public Boolean isRtpReady(MediaServerItem mediaServerItem, String streamId) { + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem,"rtp", "rtsp", streamId); + return (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")); + } + + /** + * 鏌ヨ寰呰浆鎺ㄧ殑娴佹槸鍚﹀氨缁� + */ + public Boolean isStreamReady(MediaServerItem mediaServerItem, String app, String streamId) { + JSONObject mediaInfo = zlmresTfulUtils.getMediaList(mediaServerItem, app, streamId); + return mediaInfo != null && (mediaInfo.getInteger("code") == 0 + + && mediaInfo.getJSONArray("data") != null + && mediaInfo.getJSONArray("data").size() > 0); + } + + /** + * 鏌ヨ杞帹鐨勬祦鏄惁鏈夊叾瀹冭鐪嬭�� + * @param streamId + * @return + */ + public int totalReaderCount(MediaServerItem mediaServerItem, String app, String streamId) { + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtsp", streamId); + if (mediaInfo == null) { + return 0; + } + Integer code = mediaInfo.getInteger("code"); + if ( code < 0) { + logger.warn("鏌ヨ娴�({}/{})鏄惁鏈夊叾瀹冭鐪嬭�呮椂寰楀埌锛� {}", app, streamId, mediaInfo.getString("msg")); + return -1; + } + if ( code == 0 && mediaInfo.getBoolean("online") != null && !mediaInfo.getBoolean("online")) { + logger.warn("鏌ヨ娴�({}/{})鏄惁鏈夊叾瀹冭鐪嬭�呮椂寰楀埌锛� {}", app, streamId, mediaInfo.getString("msg")); + return -1; + } + return mediaInfo.getInteger("totalReaderCount"); + } + + /** + * 璋冪敤zlm RESTful API 鈥斺�� stopSendRtp + */ + public Boolean stopSendRtpStream(MediaServerItem mediaServerItem, Map<String, Object>param) { + Boolean result = false; + JSONObject jsonObject = zlmresTfulUtils.stopSendRtp(mediaServerItem, param); + if (jsonObject == null) { + logger.error("[鍋滄RTP鎺ㄦ祦] 澶辫触: 璇锋鏌LM鏈嶅姟"); + } else if (jsonObject.getInteger("code") == 0) { + result= true; + logger.info("[鍋滄RTP鎺ㄦ祦] 鎴愬姛"); + } else { + logger.error("[鍋滄RTP鎺ㄦ祦] 澶辫触: {}, 鍙傛暟锛歿}->\r\n{}",jsonObject.getString("msg"), JSON.toJSON(param), jsonObject); } return result; } - private int getPortFromUdpPortRange() { - if (currentPort == 0) { - String[] udpPortRangeStrArray = udpPortRange.split(","); - udpPortRangeArray[0] = Integer.parseInt(udpPortRangeStrArray[0]); - udpPortRangeArray[1] = Integer.parseInt(udpPortRangeStrArray[1]); - } + public void closeAllSendRtpStream() { - if (currentPort == 0 || currentPort++ > udpPortRangeArray[1]) { - currentPort = udpPortRangeArray[0]; - return udpPortRangeArray[0]; - } else { - if (currentPort % 2 == 1) { - currentPort++; - } - return currentPort++; - } } } -- Gitblit v1.8.0