package com.genersoft.iot.vmp.gb28181.session; import com.genersoft.iot.vmp.utils.ConfigConst; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Set; public class SsrcConfig { /** * zlm流媒体服务器Id */ private String mediaServerId; private String ssrcPrefix; /** * zlm流媒体服务器已用会话句柄 */ private List isUsed; /** * zlm流媒体服务器可用会话句柄 */ private List notUsed; public SsrcConfig() { } public SsrcConfig(String mediaServerId, Set 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); } } } /** * 获取视频预览的SSRC值,第一位固定为0 * @return ssrc */ public String getPlaySsrc() { return "0" + getSsrcPrefix() + getSN(); } /** * 获取录像回放的SSRC值,第一位固定为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 getIsUsed() { return isUsed; } public void setIsUsed(List isUsed) { this.isUsed = isUsed; } public List getNotUsed() { return notUsed; } public void setNotUsed(List notUsed) { this.notUsed = notUsed; } public boolean checkSsrc(String ssrcInResponse) { return !isUsed.contains(ssrcInResponse); } }