From 0858f7995b8236d79c6e39a5974cb7a13bcb4e3e Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期六, 08 四月 2023 15:22:18 +0800
Subject: [PATCH] 优化ssrc存储结构,避免因为大量ssrc存在MediaServer中导致redis读取超时

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java |   13 +-
 /dev/null                                                                                           |    8 -
 src/main/java/com/genersoft/iot/vmp/conf/redis/RedisTemplateConfig.java                             |   28 ++++
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java                               |   12 +
 src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java                      |    2 
 src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java                                |  132 ++++++++++++++++++++++
 src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java                        |   88 +++++---------
 src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java                                     |   18 ---
 src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java                              |   20 +--
 9 files changed, 213 insertions(+), 108 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java
index a2dca63..87b4d53 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisConfig.java
@@ -9,12 +9,8 @@
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.annotation.Order;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.listener.PatternTopic;
 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
-
-import com.genersoft.iot.vmp.utils.redis.FastJsonRedisSerializer;
 
 
 /**
@@ -48,21 +44,7 @@
 	@Autowired
 	private RedisPushStreamResponseListener redisPushStreamResponseListener;
 
-	@Bean
-	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
-		RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
-		// 浣跨敤fastJson搴忓垪鍖�
-		FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
-		// value鍊肩殑搴忓垪鍖栭噰鐢╢astJsonRedisSerializer
-		redisTemplate.setValueSerializer(fastJsonRedisSerializer);
-		redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
 
-		// key鐨勫簭鍒楀寲閲囩敤StringRedisSerializer
-		redisTemplate.setKeySerializer(new StringRedisSerializer());
-		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
-		redisTemplate.setConnectionFactory(redisConnectionFactory);
-		return redisTemplate;
-	}
 
 
 	/**
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisTemplateConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisTemplateConfig.java
new file mode 100644
index 0000000..1868a5d
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/redis/RedisTemplateConfig.java
@@ -0,0 +1,28 @@
+package com.genersoft.iot.vmp.conf.redis;
+
+import com.genersoft.iot.vmp.utils.redis.FastJsonRedisSerializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisTemplateConfig {
+
+    @Bean
+    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
+        // 浣跨敤fastJson搴忓垪鍖�
+        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
+        // value鍊肩殑搴忓垪鍖栭噰鐢╢astJsonRedisSerializer
+        redisTemplate.setValueSerializer(fastJsonRedisSerializer);
+        redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
+
+        // key鐨勫簭鍒楀寲閲囩敤StringRedisSerializer
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.setConnectionFactory(redisConnectionFactory);
+        return redisTemplate;
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java
new file mode 100644
index 0000000..ec8e0ba
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java
@@ -0,0 +1,132 @@
+package com.genersoft.iot.vmp.gb28181.session;
+
+import com.genersoft.iot.vmp.conf.SipConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * ssrc浣跨敤
+ */
+@Component
+public class SSRCFactory {
+
+    /**
+     * 鎾祦鏈�澶у苟鍙戜釜鏁�
+     */
+    private static final Integer MAX_STREAM_COUNT = 10000;
+
+    /**
+     * 鎾祦鏈�澶у苟鍙戜釜鏁�
+     */
+    private static final String SSRC_INFO_KEY = "VMP_SSRC_INFO_";
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Autowired
+    private SipConfig sipConfig;
+
+
+    public void initMediaServerSSRC(String mediaServerId, Set<String> usedSet) {
+        String ssrcPrefix = sipConfig.getDomain().substring(3, 8);
+        String redisKey = SSRC_INFO_KEY + mediaServerId;
+        List<String> ssrcList = new ArrayList<>();
+        for (int i = 1; i < MAX_STREAM_COUNT; i++) {
+            String ssrc = String.format("%s%04d", ssrcPrefix, i);
+
+            if (null == usedSet || !usedSet.contains(ssrc)) {
+                ssrcList.add(ssrc);
+
+            }
+        }
+        if (redisTemplate.opsForSet().size(redisKey) != null) {
+            redisTemplate.delete(redisKey);
+        }
+        redisTemplate.opsForSet().add(redisKey, ssrcList.toArray(new String[0]));
+    }
+
+
+    /**
+     * 鑾峰彇瑙嗛棰勮鐨凷SRC鍊�,绗竴浣嶅浐瀹氫负0
+     *
+     * @return ssrc
+     */
+    public String getPlaySsrc(String mediaServerId) {
+        return "0" + getSN(mediaServerId);
+    }
+
+    /**
+     * 鑾峰彇褰曞儚鍥炴斁鐨凷SRC鍊�,绗竴浣嶅浐瀹氫负1
+     */
+    public String getPlayBackSsrc(String mediaServerId) {
+        return "1" + getSN(mediaServerId);
+    }
+
+    /**
+     * 閲婃斁ssrc锛屼富瑕佺敤瀹岀殑ssrc涓�瀹氳閲婃斁锛屽惁鍒欎細鑰楀敖
+     *
+     * @param ssrc 闇�瑕侀噸缃殑ssrc
+     */
+    public void releaseSsrc(String mediaServerId, String ssrc) {
+        if (ssrc == null) {
+            return;
+        }
+        String sn = ssrc.substring(1);
+        String redisKey = SSRC_INFO_KEY + mediaServerId;
+        redisTemplate.opsForSet().add(redisKey, sn);
+    }
+
+    /**
+     * 鑾峰彇鍚庡洓浣嶆暟SN,闅忔満鏁�
+     */
+    private String getSN(String mediaServerId) {
+        String sn = null;
+        String redisKey = SSRC_INFO_KEY + mediaServerId;
+        Long size = redisTemplate.opsForSet().size(redisKey);
+        if (size == null || size == 0) {
+            throw new RuntimeException("ssrc宸茬粡鐢ㄥ畬");
+        } else {
+            // 鍦ㄩ泦鍚堜腑绉婚櫎骞惰繑鍥炰竴涓殢鏈烘垚鍛樸��
+            sn = (String) redisTemplate.opsForSet().pop(redisKey);
+            redisTemplate.opsForSet().remove(redisKey, sn);
+        }
+        return sn;
+    }
+
+    /**
+     * 閲嶇疆涓�涓祦濯掍綋鏈嶅姟鐨勬墍鏈塻src
+     *
+     * @param mediaServerId 娴佸獟浣撴湇鍔D
+     */
+    public void reset(String mediaServerId) {
+        this.initMediaServerSSRC(mediaServerId, null);
+    }
+
+    /**
+     * 鏄惁宸茬粡瀛樺湪浜嗘煇涓狹ediaServer鐨凷SRC淇℃伅
+     *
+     * @param mediaServerId 娴佸獟浣撴湇鍔D
+     */
+    public boolean hasMediaServerSSRC(String mediaServerId) {
+        String redisKey = SSRC_INFO_KEY + mediaServerId;
+        return redisTemplate.opsForSet().members(redisKey) != null;
+    }
+
+    /**
+     * 鏌ヨssrc鏄惁鍙敤
+     *
+     * @param mediaServerId
+     * @param ssrc
+     * @return
+     */
+    public boolean checkSsrc(String mediaServerId, String ssrc) {
+        String sn = ssrc.substring(1);
+        String redisKey = SSRC_INFO_KEY + mediaServerId;
+        return redisTemplate.opsForSet().isMember(redisKey, sn) != null;
+    }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcConfig.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcConfig.java
deleted file mode 100644
index cc303c8..0000000
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcConfig.java
+++ /dev/null
@@ -1,150 +0,0 @@
-package com.genersoft.iot.vmp.gb28181.session;
-
-import com.genersoft.iot.vmp.utils.ConfigConst;
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-@Schema(description = "ssrc淇℃伅")
-public class SsrcConfig {
-
-    /**
-     * zlm娴佸獟浣撴湇鍔″櫒Id
-     */
-    @Schema(description = "娴佸獟浣撴湇鍔″櫒Id")
-    private String mediaServerId;
-
-    @Schema(description = "SSRC鍓嶇紑")
-    private String ssrcPrefix;
-
-    /**
-     * zlm娴佸獟浣撴湇鍔″櫒宸茬敤浼氳瘽鍙ユ焺
-     */
-    @Schema(description = "zlm娴佸獟浣撴湇鍔″櫒宸茬敤浼氳瘽鍙ユ焺")
-    private List<String> isUsed;
-
-    /**
-     * zlm娴佸獟浣撴湇鍔″櫒鍙敤浼氳瘽鍙ユ焺
-     */
-    @Schema(description = "zlm娴佸獟浣撴湇鍔″櫒鍙敤浼氳瘽鍙ユ焺")
-    private List<String> notUsed;
-
-    public SsrcConfig() {
-    }
-
-    public SsrcConfig(String mediaServerId, Set<String> usedSet, String sipDomain) {
-        this.mediaServerId = mediaServerId;
-        this.isUsed = new ArrayList<>();
-        this.ssrcPrefix = sipDomain.substring(3, 8);
-        this.notUsed = new ArrayList<>();
-        for (int i = 1; i < ConfigConst.MAX_STRTEAM_COUNT; i++) {
-            String ssrc;
-            if (i < 10) {
-                ssrc = "000" + i;
-            } else if (i < 100) {
-                ssrc = "00" + i;
-            } else if (i < 1000) {
-                ssrc = "0" + i;
-            } else {
-                ssrc = String.valueOf(i);
-            }
-            if (null == usedSet || !usedSet.contains(ssrc)) {
-                this.notUsed.add(ssrc);
-            } else {
-                this.isUsed.add(ssrc);
-            }
-        }
-    }
-
-
-    /**
-     * 鑾峰彇瑙嗛棰勮鐨凷SRC鍊�,绗竴浣嶅浐瀹氫负0
-     * @return ssrc
-     */
-    public String getPlaySsrc() {
-        return "0" + getSsrcPrefix() + getSN();
-    }
-
-    /**
-     * 鑾峰彇褰曞儚鍥炴斁鐨凷SRC鍊�,绗竴浣嶅浐瀹氫负1
-     *
-     */
-    public String getPlayBackSsrc() {
-        return "1" + getSsrcPrefix() + getSN();
-    }
-
-    /**
-     * 閲婃斁ssrc锛屼富瑕佺敤瀹岀殑ssrc涓�瀹氳閲婃斁锛屽惁鍒欎細鑰楀敖
-     * @param ssrc 闇�瑕侀噸缃殑ssrc
-     */
-    public void releaseSsrc(String ssrc) {
-        if (ssrc == null) {
-            return;
-        }
-        String sn = ssrc.substring(6);
-        try {
-            isUsed.remove(sn);
-            notUsed.add(sn);
-        }catch (NullPointerException e){
-        }
-    }
-
-    /**
-     * 鑾峰彇鍚庡洓浣嶆暟SN,闅忔満鏁�
-     *
-     */
-    private String getSN() {
-        String sn = null;
-        int index = 0;
-        if (notUsed.size() == 0) {
-            throw new RuntimeException("ssrc宸茬粡鐢ㄥ畬");
-        } else if (notUsed.size() == 1) {
-            sn = notUsed.get(0);
-        } else {
-            index = new Random().nextInt(notUsed.size() - 1);
-            sn = notUsed.get(index);
-        }
-        notUsed.remove(index);
-        isUsed.add(sn);
-        return sn;
-    }
-
-    public String getSsrcPrefix() {
-        return ssrcPrefix;
-    }
-
-    public String getMediaServerId() {
-        return mediaServerId;
-    }
-
-    public void setMediaServerId(String mediaServerId) {
-        this.mediaServerId = mediaServerId;
-    }
-
-    public void setSsrcPrefix(String ssrcPrefix) {
-        this.ssrcPrefix = ssrcPrefix;
-    }
-
-    public List<String> getIsUsed() {
-        return isUsed;
-    }
-
-    public void setIsUsed(List<String> isUsed) {
-        this.isUsed = isUsed;
-    }
-
-    public List<String> getNotUsed() {
-        return notUsed;
-    }
-
-    public void setNotUsed(List<String> notUsed) {
-        this.notUsed = notUsed;
-    }
-
-    public boolean checkSsrc(String ssrcInResponse) {
-        return !isUsed.contains(ssrcInResponse);
-    }
-}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index 1a6358b..8073417 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -5,7 +5,7 @@
 import com.genersoft.iot.vmp.conf.UserSetting;
 import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
-import com.genersoft.iot.vmp.gb28181.session.SsrcConfig;
+import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.gb28181.transmit.SIPProcessorObserver;
 import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
@@ -73,6 +73,9 @@
 
     @Autowired
     private IRedisCatchStorage redisCatchStorage;
+
+    @Autowired
+    private SSRCFactory ssrcFactory;
 
     @Autowired
     private DynamicTask dynamicTask;
@@ -491,12 +494,8 @@
                 } else if (gbStream != null) {
                     if(ssrc.equals(ssrcDefault))
                     {
-                        SsrcConfig ssrcConfig = mediaServerItem.getSsrcConfig();
-                        if(ssrcConfig != null)
-                        {
-                            ssrc = ssrcConfig.getPlaySsrc();
-                            ssrcConfig.releaseSsrc(ssrc);
-                        }
+                        ssrc = ssrcFactory.getPlaySsrc(mediaServerItem.getId());
+                        ssrcFactory.releaseSsrc(mediaServerItem.getId(), ssrc);
                     }
                     if("push".equals(gbStream.getStreamType())) {
                         if (streamPushItem != null && streamPushItem.isPushIng()) {
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
index f3eb3d6..ea248fd 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/dto/MediaServerItem.java
@@ -1,7 +1,7 @@
 package com.genersoft.iot.vmp.media.zlm.dto;
 
 
-import com.genersoft.iot.vmp.gb28181.session.SsrcConfig;
+import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
 import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
 import io.swagger.v3.oas.annotations.media.Schema;
 import org.springframework.util.ObjectUtils;
@@ -80,8 +80,8 @@
     @Schema(description = "鏄惁鏄粯璁LM")
     private boolean defaultServer;
 
-    @Schema(description = "SSRC淇℃伅")
-    private SsrcConfig ssrcConfig;
+//    @Schema(description = "SSRC淇℃伅")
+//    private SsrcConfig ssrcConfig;
 
     @Schema(description = "褰撳墠浣跨敤鍒扮殑绔彛")
     private int currentPort;
@@ -92,7 +92,7 @@
      * 鍦ˋpplicationCheckRunner閲屽mediaServerSsrcMap杩涜鍒濆鍖�
      */
     @Schema(description = "ID")
-    private HashMap<String, SsrcConfig> mediaServerSsrcMap;
+    private HashMap<String, SSRCFactory> mediaServerSsrcMap;
 
     public MediaServerItem() {
     }
@@ -279,20 +279,12 @@
         this.updateTime = updateTime;
     }
 
-    public HashMap<String, SsrcConfig> getMediaServerSsrcMap() {
+    public HashMap<String, SSRCFactory> getMediaServerSsrcMap() {
         return mediaServerSsrcMap;
     }
 
-    public void setMediaServerSsrcMap(HashMap<String, SsrcConfig> mediaServerSsrcMap) {
+    public void setMediaServerSsrcMap(HashMap<String, SSRCFactory> mediaServerSsrcMap) {
         this.mediaServerSsrcMap = mediaServerSsrcMap;
-    }
-
-    public SsrcConfig getSsrcConfig() {
-        return ssrcConfig;
-    }
-
-    public void setSsrcConfig(SsrcConfig ssrcConfig) {
-        this.ssrcConfig = ssrcConfig;
     }
 
     public int getCurrentPort() {
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
index 336082f..9223ced 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
@@ -45,6 +45,8 @@
                 device = deviceMapper.getDeviceByDeviceId(deviceChannel.getDeviceId());
             }
 
+
+
             if ("WGS84".equals(device.getGeoCoordSys())) {
                 deviceChannel.setLongitudeWgs84(deviceChannel.getLongitude());
                 deviceChannel.setLatitudeWgs84(deviceChannel.getLatitude());
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
index eab8edb..9bd64f1 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -9,7 +9,7 @@
 import com.genersoft.iot.vmp.conf.UserSetting;
 import com.genersoft.iot.vmp.conf.exception.ControllerException;
 import com.genersoft.iot.vmp.gb28181.event.EventPublisher;
-import com.genersoft.iot.vmp.gb28181.session.SsrcConfig;
+import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
 import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
@@ -54,6 +54,9 @@
     @Autowired
     private SipConfig sipConfig;
 
+    @Autowired
+    private SSRCFactory ssrcFactory;
+
     @Value("${server.ssl.enabled:false}")
     private boolean sslEnabled;
 
@@ -90,6 +93,7 @@
     @Autowired
     private IRedisCatchStorage redisCatchStorage;
 
+
     /**
      * 鍒濆鍖�
      */
@@ -101,9 +105,8 @@
                 continue;
             }
             // 鏇存柊
-            if (mediaServerItem.getSsrcConfig() == null) {
-                SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain());
-                mediaServerItem.setSsrcConfig(ssrcConfig);
+            if (ssrcFactory.hasMediaServerSSRC(mediaServerItem.getId())) {
+                ssrcFactory.initMediaServerSSRC(mediaServerItem.getId(), null);
                 RedisUtil.set(VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId(), mediaServerItem);
             }
             // 鏌ヨredis鏄惁瀛樺湪姝ediaServer
@@ -127,36 +130,27 @@
             return null;
         }
         // 鑾峰彇mediaServer鍙敤鐨剆src
-        String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
-
-        SsrcConfig ssrcConfig = mediaServerItem.getSsrcConfig();
-        if (ssrcConfig == null) {
-            logger.info("media server [ {} ] ssrcConfig is null", mediaServerItem.getId());
-            return null;
+        String ssrc;
+        if (presetSsrc != null) {
+            ssrc = presetSsrc;
         }else {
-            String ssrc;
-            if (presetSsrc != null) {
-                ssrc = presetSsrc;
+            if (isPlayback) {
+                ssrc = ssrcFactory.getPlayBackSsrc(mediaServerItem.getId());
             }else {
-                if (isPlayback) {
-                    ssrc = ssrcConfig.getPlayBackSsrc();
-                }else {
-                    ssrc = ssrcConfig.getPlaySsrc();
-                }
+                ssrc = ssrcFactory.getPlaySsrc(mediaServerItem.getId());
             }
-
-            if (streamId == null) {
-                streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
-            }
-            int rtpServerPort;
-            if (mediaServerItem.isRtpEnable()) {
-                rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0, port);
-            } else {
-                rtpServerPort = mediaServerItem.getRtpProxyPort();
-            }
-            RedisUtil.set(key, mediaServerItem);
-            return new SSRCInfo(rtpServerPort, ssrc, streamId);
         }
+
+        if (streamId == null) {
+            streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
+        }
+        int rtpServerPort;
+        if (mediaServerItem.isRtpEnable()) {
+            rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0, port);
+        } else {
+            rtpServerPort = mediaServerItem.getRtpProxyPort();
+        }
+        return new SSRCInfo(rtpServerPort, ssrc, streamId);
     }
 
     @Override
@@ -184,11 +178,7 @@
         if (mediaServerItem == null || ssrc == null) {
             return;
         }
-        SsrcConfig ssrcConfig = mediaServerItem.getSsrcConfig();
-        ssrcConfig.releaseSsrc(ssrc);
-        mediaServerItem.setSsrcConfig(ssrcConfig);
-        String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
-        RedisUtil.set(key, mediaServerItem);
+        ssrcFactory.releaseSsrc(mediaServerItemId, ssrc);
     }
 
     /**
@@ -196,8 +186,7 @@
      */
     @Override
     public void clearRTPServer(MediaServerItem mediaServerItem) {
-        mediaServerItem.setSsrcConfig(new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain()));
-        RedisUtil.zAdd(VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId(), mediaServerItem.getId(), 0);
+        ssrcFactory.reset(mediaServerItem.getId());
 
     }
 
@@ -207,16 +196,8 @@
         mediaServerMapper.update(mediaSerItem);
         MediaServerItem mediaServerItemInRedis = getOne(mediaSerItem.getId());
         MediaServerItem mediaServerItemInDataBase = mediaServerMapper.queryOne(mediaSerItem.getId());
-        if (mediaServerItemInRedis != null && mediaServerItemInRedis.getSsrcConfig() != null) {
-            mediaServerItemInDataBase.setSsrcConfig(mediaServerItemInRedis.getSsrcConfig());
-        }else {
-            mediaServerItemInDataBase.setSsrcConfig(
-                    new SsrcConfig(
-                            mediaServerItemInDataBase.getId(),
-                            null,
-                            sipConfig.getDomain()
-                    )
-            );
+        if (mediaServerItemInRedis == null || ssrcFactory.hasMediaServerSSRC(mediaSerItem.getId())) {
+            ssrcFactory.initMediaServerSSRC(mediaServerItemInDataBase.getId(),null);
         }
         String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItemInDataBase.getId();
         RedisUtil.set(key, mediaServerItemInDataBase);
@@ -396,14 +377,8 @@
         }
         mediaServerMapper.update(serverItem);
         String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + zlmServerConfig.getGeneralMediaServerId();
-        if (RedisUtil.get(key) == null) {
-            SsrcConfig ssrcConfig = new SsrcConfig(zlmServerConfig.getGeneralMediaServerId(), null, sipConfig.getDomain());
-            serverItem.setSsrcConfig(ssrcConfig);
-        }else {
-            MediaServerItem mediaServerItemInRedis = JsonUtil.redisJsonToObject(key, MediaServerItem.class);
-            if (Objects.nonNull(mediaServerItemInRedis)) {
-                serverItem.setSsrcConfig(mediaServerItemInRedis.getSsrcConfig());
-            }
+        if (ssrcFactory.hasMediaServerSSRC(serverItem.getId())) {
+            ssrcFactory.initMediaServerSSRC(zlmServerConfig.getGeneralMediaServerId(), null);
         }
         RedisUtil.set(key, serverItem);
         resetOnlineServerItem(serverItem);
@@ -682,8 +657,7 @@
             }
             // zlm杩炴帴閲嶈瘯
             logger.warn("[鏇存柊ZLM 淇濇椿淇℃伅]灏濊瘯閾炬帴zml id {}", mediaServerId);
-            SsrcConfig ssrcConfig = new SsrcConfig(mediaServerItem.getId(), null, sipConfig.getDomain());
-            mediaServerItem.setSsrcConfig(ssrcConfig);
+            ssrcFactory.initMediaServerSSRC(mediaServerItem.getId(), null);
             String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerItem.getId();
             RedisUtil.set(key, mediaServerItem);
             clearRTPServer(mediaServerItem);
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 0c9243e..a072e8a 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -11,6 +11,7 @@
 import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
 import com.genersoft.iot.vmp.gb28181.bean.*;
 import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
+import com.genersoft.iot.vmp.gb28181.session.SSRCFactory;
 import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
@@ -99,6 +100,9 @@
 
     @Autowired
     private ZlmHttpHookSubscribe subscribe;
+
+    @Autowired
+    private SSRCFactory ssrcFactory;
 
 
     @Override
@@ -295,10 +299,10 @@
                     if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
                         logger.info("[鐐规挱娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
 
-                        if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
+                        if (!ssrcFactory.checkSsrc(mediaServerItem.getId(),ssrcInResponse)) {
                             // ssrc 涓嶅彲鐢�
                             // 閲婃斁ssrc
-                            mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
+                            ssrcFactory.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
                             streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
                             event.msg = "涓嬬骇鑷畾涔変簡ssrc,浣嗘槸姝src涓嶅彲鐢�";
                             event.statusCode = 400;
@@ -536,7 +540,7 @@
                                 if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
                                     logger.info("[鍥炴斁娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
 
-                                    if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
+                                    if (!ssrcFactory.checkSsrc(mediaServerItem.getId(),ssrcInResponse)) {
                                         // ssrc 涓嶅彲鐢�
                                         // 閲婃斁ssrc
                                         mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
@@ -675,7 +679,7 @@
                                 if (!mediaServerItem.isRtpEnable() || device.isSsrcCheck()) {
                                     logger.info("[鍥炴斁娑堟伅] SSRC淇 {}->{}", ssrcInfo.getSsrc(), ssrcInResponse);
 
-                                    if (!mediaServerItem.getSsrcConfig().checkSsrc(ssrcInResponse)) {
+                                    if (!ssrcFactory.checkSsrc(mediaServerItem.getId(),ssrcInResponse)) {
                                         // ssrc 涓嶅彲鐢�
                                         // 閲婃斁ssrc
                                         mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/ConfigConst.java b/src/main/java/com/genersoft/iot/vmp/utils/ConfigConst.java
deleted file mode 100644
index 125d818..0000000
--- a/src/main/java/com/genersoft/iot/vmp/utils/ConfigConst.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.genersoft.iot.vmp.utils;
-
-public class ConfigConst {
-    /**
-     * 鎾祦鏈�澶у苟鍙戜釜鏁�
-     */
-    public static final Integer MAX_STRTEAM_COUNT = 10000;
-}

--
Gitblit v1.8.0