648540858
2022-08-09 116d979d87f53f878a8c930cfad2c6a7cc831b19
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -8,6 +8,9 @@
import java.util.Map;
import java.util.Set;
import com.genersoft.iot.vmp.media.zlm.ZLMRunner;
import com.genersoft.iot.vmp.service.IStreamProxyService;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -42,6 +45,8 @@
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.time.LocalDateTime;
import java.util.*;
/**
 * 媒体服务器节点管理
@@ -53,6 +58,9 @@
    @Autowired
    private SipConfig sipConfig;
    @Autowired
    private ZLMRunner zlmRunner;
    @Value("${server.ssl.enabled:false}")
    private boolean sslEnabled;
@@ -83,6 +91,12 @@
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private IVideoManagerStorage storager;
    @Autowired
    private IStreamProxyService streamProxyService;
    @Autowired
    private EventPublisher publisher;
@@ -277,7 +291,13 @@
            return null;
        }
        String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
        return (MediaServerItem)redisUtil.get(key);
        MediaServerItem serverItem=(MediaServerItem)redisUtil.get(key);
        if(null==serverItem){
            //zlm服务不在线,启动重连
            reloadZlm();
            serverItem=(MediaServerItem)redisUtil.get(key);
        }
        return serverItem;
    }
    @Override
@@ -470,8 +490,13 @@
        String key = VideoManagerConstants.MEDIA_SERVERS_ONLINE_PREFIX + userSetting.getServerId();
        if (redisUtil.zSize(key)  == null || redisUtil.zSize(key) == 0) {
            logger.info("获取负载最低的节点时无在线节点");
            return null;
            logger.info("获取负载最低的节点时无在线节点,启动重连机制");
            //启动重连
            reloadZlm();
            if (redisUtil.zSize(key)  == null || redisUtil.zSize(key) == 0) {
                logger.info("获取负载最低的节点时无在线节点");
                return null;
            }
        }
        // 获取分数最低的,及并发最低的
@@ -524,7 +549,7 @@
        param.put("general.continue_push_ms", "3000" );
        // 最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track, 设置此选项优化那些音频错误的不规范流,
        // 等zlm支持给每个rtpServer设置关闭音频的时候可以不设置此选项
        param.put("general.wait_track_ready_ms", "3000" );
//        param.put("general.wait_track_ready_ms", "3000" );
        if (mediaServerItem.isRtpEnable() && !StringUtils.isEmpty(mediaServerItem.getRtpPortRange())) {
            param.put("rtp_proxy.port_range", mediaServerItem.getRtpPortRange().replace(",", "-"));
        }
@@ -633,8 +658,14 @@
        MediaServerItem mediaServerItem = getOne(mediaServerId);
        if (mediaServerItem == null) {
            // zlm连接重试
            logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息");
            return;
            logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息,尝试重连zlm");
            reloadZlm();
            mediaServerItem = getOne(mediaServerId);
            if (mediaServerItem == null) {
                // zlm连接重试
                logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息");
                return;
            }
        }
        String key = VideoManagerConstants.MEDIA_SERVER_KEEPALIVE_PREFIX + userSetting.getServerId() + "_" + mediaServerId;
        int hookAliveInterval = mediaServerItem.getHookAliveInterval() + 2;
@@ -657,4 +688,12 @@
        }
    }
    public void reloadZlm(){
        try {
            zlmRunner.run();
            Thread.sleep(500);//延迟0.5秒缓冲时间
        } catch (Exception e) {
            logger.warn("尝试重连zlm失败!",e);
        }
    }
}