| | |
| | | package com.genersoft.iot.vmp.media.zlm; |
| | | |
| | | 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 org.slf4j.Logger; |
| | |
| | | |
| | | private Logger logger = LoggerFactory.getLogger("ZLMRTPServerFactory"); |
| | | |
| | | @Value("${media.rtp.udpPortRange}") |
| | | private String udpPortRange; |
| | | @Autowired |
| | | private MediaConfig mediaConfig; |
| | | |
| | | @Autowired |
| | | private ZLMRESTfulUtils zlmresTfulUtils; |
| | | |
| | | private int[] udpPortRangeArray = new int[2]; |
| | | private int[] portRangeArray = new int[2]; |
| | | |
| | | private int currentPort = 0; |
| | | |
| | | private Map<String, Integer> currentStreams = null; |
| | | |
| | | public int createRTPServer(String streamId) { |
| | | if (currentStreams == null) { |
| | | currentStreams = new HashMap<>(); |
| | | JSONObject jsonObject = zlmresTfulUtils.listRtpServer(); |
| | | 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")); |
| | | } |
| | | } |
| | | } |
| | | // 已经在推流 |
| | | if (currentStreams.get(streamId) != null) { |
| | | Map<String, Object> closeRtpServerParam = new HashMap<>(); |
| | | closeRtpServerParam.put("stream_id", streamId); |
| | | zlmresTfulUtils.closeRtpServer(closeRtpServerParam); |
| | | currentStreams.remove(streamId); |
| | | } |
| | | |
| | | Map<String, Object> param = new HashMap<>(); |
| | | int result = -1; |
| | | int newPort = getPortFromUdpPortRange(); |
| | | int newPort = getPortFromportRange(); |
| | | param.put("port", newPort); |
| | | param.put("enable_tcp", 1); |
| | | param.put("stream_id", streamId); |
| | | JSONObject jsonObject = zlmresTfulUtils.openRtpServer(param); |
| | | System.out.println(jsonObject); |
| | | |
| | | if (jsonObject != null) { |
| | | switch (jsonObject.getInteger("code")){ |
| | | case 0: |
| | | result= newPort; |
| | | break; |
| | | case -300: // id已经存在 |
| | | case -300: // id已经存在, 可能已经在其他端口推流 |
| | | Map<String, Object> closeRtpServerParam = new HashMap<>(); |
| | | closeRtpServerParam.put("stream_id", streamId); |
| | | zlmresTfulUtils.closeRtpServer(closeRtpServerParam); |
| | | result = newPort; |
| | | break; |
| | | case -400: // 端口占用 |
| | |
| | | return result; |
| | | } |
| | | |
| | | private int getPortFromUdpPortRange() { |
| | | private int getPortFromportRange() { |
| | | if (currentPort == 0) { |
| | | String[] udpPortRangeStrArray = udpPortRange.split(","); |
| | | udpPortRangeArray[0] = Integer.parseInt(udpPortRangeStrArray[0]); |
| | | udpPortRangeArray[1] = Integer.parseInt(udpPortRangeStrArray[1]); |
| | | String[] portRangeStrArray = mediaConfig.getRtpPortRange().split(","); |
| | | 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]; |
| | | return portRangeArray[0]; |
| | | } else { |
| | | if (currentPort % 2 == 1) { |
| | | currentPort++; |
| | |
| | | public Boolean startSendRtpStream(Map<String, Object>param) { |
| | | Boolean result = false; |
| | | JSONObject jsonObject = zlmresTfulUtils.startSendRtp(param); |
| | | System.out.println(jsonObject); |
| | | logger.info(jsonObject.toJSONString()); |
| | | if (jsonObject == null) { |
| | | logger.error("RTP推流失败: 请检查ZLM服务"); |
| | | } else if (jsonObject.getInteger("code") == 0) { |
| | | result= true; |
| | | logger.error("RTP推流请求成功,本地推流端口:" + jsonObject.getString("local_port")); |
| | | logger.info("RTP推流请求成功,本地推流端口:" + jsonObject.getString("local_port")); |
| | | } else { |
| | | logger.error("RTP推流失败: " + jsonObject.getString("msg")); |
| | | } |
| | |
| | | public Boolean stopSendRtpStream(Map<String, Object>param) { |
| | | Boolean result = false; |
| | | JSONObject jsonObject = zlmresTfulUtils.stopSendRtp(param); |
| | | System.out.println(jsonObject); |
| | | logger.info(jsonObject.toJSONString()); |
| | | if (jsonObject == null) { |
| | | logger.error("停止RTP推流失败: 请检查ZLM服务"); |
| | | } 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() { |
| | | |
| | | } |
| | | } |