SsrcConfig.java 3.66 KB
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);
    }
}