| 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<String> isUsed; | 
|     /** | 
|      * 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); | 
|     } | 
| } |