From e48fa711a3664bece9b3e58840a75fe7c05bc47c Mon Sep 17 00:00:00 2001
From: panlinlin <648540858@qq.com>
Date: 星期六, 08 五月 2021 17:14:05 +0800
Subject: [PATCH] 添加截图(快照)功能

---
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java |  116 +++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 98 insertions(+), 18 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..63102b1 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,6 +1,8 @@
 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;
@@ -17,32 +19,55 @@
 
     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宸茬粡瀛樺湪, 鍙兘宸茬粡鍦ㄥ叾浠栫鍙f帹娴�
+                    Map<String, Object> closeRtpServerParam = new HashMap<>();
+                    closeRtpServerParam.put("stream_id", streamId);
+                    zlmresTfulUtils.closeRtpServer(closeRtpServerParam);
                     result = newPort;
                     break;
                 case -400: // 绔彛鍗犵敤
@@ -77,16 +102,16 @@
         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++;
@@ -96,7 +121,7 @@
     }
 
     /**
-     * 鍒涘缓涓�涓帹娴�
+     * 鍒涘缓涓�涓浗鏍囨帹娴�
      * @param ip 鎺ㄦ祦ip
      * @param port 鎺ㄦ祦绔彛
      * @param ssrc 鎺ㄦ祦鍞竴鏍囪瘑
@@ -122,6 +147,39 @@
         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);
         return sendRtpItem;
     }
@@ -132,12 +190,12 @@
     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鎺ㄦ祦澶辫触: 璇锋鏌LM鏈嶅姟");
         } else if (jsonObject.getInteger("code") == 0) {
             result= true;
-            logger.error("RTP鎺ㄦ祦璇锋眰鎴愬姛锛屾湰鍦版帹娴佺鍙o細" + jsonObject.getString("local_port"));
+            logger.info("RTP鎺ㄦ祦璇锋眰鎴愬姛锛屾湰鍦版帹娴佺鍙o細" + jsonObject.getString("local_port"));
         } else {
             logger.error("RTP鎺ㄦ祦澶辫触: " + jsonObject.getString("msg"));
         }
@@ -153,20 +211,42 @@
     }
 
     /**
+     * 鏌ヨ寰呰浆鎺ㄧ殑娴佹槸鍚﹀氨缁�
+     */
+    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) {
         Boolean result = false;
         JSONObject jsonObject = zlmresTfulUtils.stopSendRtp(param);
-        System.out.println(jsonObject);
+        logger.info(jsonObject.toJSONString());
         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