From b92027f31ef24583e8b9d4c2dc44c7e9262a2023 Mon Sep 17 00:00:00 2001 From: panlinlin <648540858@qq.com> Date: 星期一, 26 四月 2021 10:48:51 +0800 Subject: [PATCH] 修复注册是数据传输模式被回复默认 --- src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java | 81 +++++++++++++++++++++++++++++++++++++++- 1 files changed, 78 insertions(+), 3 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..e76a2d8 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,5 +1,6 @@ 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; @@ -27,7 +28,28 @@ 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(); @@ -35,14 +57,16 @@ 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宸茬粡瀛樺湪, 鍙兘宸茬粡鍦ㄥ叾浠栫鍙f帹娴� + Map<String, Object> closeRtpServerParam = new HashMap<>(); + closeRtpServerParam.put("stream_id", streamId); + zlmresTfulUtils.closeRtpServer(closeRtpServerParam); result = newPort; break; case -400: // 绔彛鍗犵敤 @@ -96,7 +120,7 @@ } /** - * 鍒涘缓涓�涓帹娴� + * 鍒涘缓涓�涓浗鏍囨帹娴� * @param ip 鎺ㄦ祦ip * @param port 鎺ㄦ祦绔彛 * @param ssrc 鎺ㄦ祦鍞竴鏍囪瘑 @@ -120,6 +144,39 @@ sendRtpItem.setSsrc(ssrc); sendRtpItem.setPlatformId(platformId); sendRtpItem.setDeviceId(deviceId); + sendRtpItem.setChannelId(channelId); + sendRtpItem.setTcp(tcp); + sendRtpItem.setApp("rtp"); + sendRtpItem.setLocalPort(localPort); + return sendRtpItem; + } + + /** + * 鍒涘缓涓�涓洿鎾帹娴� + * @param ip 鎺ㄦ祦ip + * @param port 鎺ㄦ祦绔彛 + * @param ssrc 鎺ㄦ祦鍞竴鏍囪瘑 + * @param platformId 骞冲彴id + * @param channelId 閫氶亾id + * @param tcp 鏄惁涓簍cp + * @return SendRtpItem + */ + public SendRtpItem createSendRtpItem(String ip, int port, String ssrc, String platformId, String app, String stream, String channelId, boolean tcp){ + String playSsrc = SsrcUtil.getPlaySsrc(); + int localPort = createRTPServer(SsrcUtil.getPlaySsrc()); + if (localPort != -1) { + closeRTPServer(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); @@ -153,6 +210,24 @@ } /** + * 鏌ヨ寰呰浆鎺ㄧ殑娴佹槸鍚﹀氨缁� + */ + public Boolean isStreamReady(String app, String streamId) { + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(app, "rtmp", streamId); + return (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")); + } + + /** + * 鏌ヨ杞帹鐨勬祦鏄惁鏈夊叾瀹冭鐪嬭�� + * @param streamId + * @return + */ + public int totalReaderCount(String app, String streamId) { + JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(app, "rtmp", streamId); + return mediaInfo.getInteger("totalReaderCount"); + } + + /** * 璋冪敤zlm RESTful API 鈥斺�� stopSendRtp */ public Boolean stopSendRtpStream(Map<String, Object>param) { -- Gitblit v1.8.0