| New file |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取视频预览的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<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); |
| | | } |
| | | } |