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