648540858
2023-07-17 32c73ff595c9939b342017ffbd8c86bc16877ba6
Merge branch '2.6.8' into wvp-28181-2.0

# Conflicts:
# src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
3个文件已修改
82 ■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/media/zlm/SendRtpPortManager.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/media/zlm/SendRtpPortManager.java
@@ -1,12 +1,19 @@
package com.genersoft.iot.vmp.media.zlm;
import com.genersoft.iot.vmp.common.VideoManagerConstants;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
import com.genersoft.iot.vmp.media.zlm.dto.MediaSendRtpPortInfo;
import com.genersoft.iot.vmp.utils.redis.RedisUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class SendRtpPortManager {
@@ -29,27 +36,55 @@
    }
    public int getNextPort(String mediaServerId) {
        String key = KEY + userSetting.getServerId() + "_" +  mediaServerId;
        MediaSendRtpPortInfo mediaSendRtpPortInfo = (MediaSendRtpPortInfo)redisTemplate.opsForValue().get(key);
        String sendIndexKey = KEY + userSetting.getServerId() + "_" +  mediaServerId;
        MediaSendRtpPortInfo mediaSendRtpPortInfo = (MediaSendRtpPortInfo)redisTemplate.opsForValue().get(sendIndexKey);
        if (mediaSendRtpPortInfo == null) {
            logger.warn("[发送端口管理] 获取{}的发送端口时未找到端口信息", mediaServerId);
            return 0;
        }
        int port;
        if (mediaSendRtpPortInfo.getCurrent() %2 != 0) {
            port = mediaSendRtpPortInfo.getCurrent() + 1;
        }else {
            port = mediaSendRtpPortInfo.getCurrent() + 2;
        }
        if (port > mediaSendRtpPortInfo.getEnd()) {
            if (mediaSendRtpPortInfo.getStart() %2 != 0) {
                port = mediaSendRtpPortInfo.getStart() + 1;
            }else {
                port = mediaSendRtpPortInfo.getStart();
        String key = VideoManagerConstants.PLATFORM_SEND_RTP_INFO_PREFIX
                + userSetting.getServerId() + "_*";
        List<Object> queryResult = RedisUtil.scan(redisTemplate, key);
        Map<Integer, SendRtpItem> sendRtpItemMap = new HashMap<>();
        for (Object o : queryResult) {
            SendRtpItem sendRtpItem = (SendRtpItem) redisTemplate.opsForValue().get(o);
            if (sendRtpItem != null) {
                sendRtpItemMap.put(sendRtpItem.getLocalPort(), sendRtpItem);
            }
        }
        int port = getPort(mediaSendRtpPortInfo.getCurrent(),
                mediaSendRtpPortInfo.getStart(),
                mediaSendRtpPortInfo.getEnd(), checkPort -> sendRtpItemMap.get(checkPort) == null);
        mediaSendRtpPortInfo.setCurrent(port);
        redisTemplate.opsForValue().set(key, mediaSendRtpPortInfo);
        redisTemplate.opsForValue().set(sendIndexKey, mediaSendRtpPortInfo);
        return port;
    }
    interface CheckPortCallback{
        boolean check(int port);
    }
    private int getPort(int current, int start, int end, CheckPortCallback checkPortCallback) {
        int port;
        if (current %2 != 0) {
            port = current + 1;
        }else {
            port = current + 2;
        }
        if (port > end) {
            if (start %2 != 0) {
                port = start + 1;
            }else {
                port = start;
            }
        }
        if (!checkPortCallback.check(port)) {
            return getPort(port, start, end, checkPortCallback);
        }
        return port;
    }
}
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -225,10 +225,7 @@
        HookResultForOnPublish result = HookResultForOnPublish.SUCCESS();
        if (!"rtp".equals(param.getApp())) {
            result.setEnable_audio(true);
        }
        result.setEnable_audio(true);
        taskExecutor.execute(() -> {
            ZlmHttpHookSubscribe.Event subscribe = this.subscribe.sendNotify(HookType.on_publish, json);
            if (subscribe != null) {
@@ -256,7 +253,6 @@
            // 如果是录像下载就设置视频间隔十秒
            if (ssrcTransactionForAll.get(0).getType() == InviteSessionType.DOWNLOAD) {
                result.setMp4_max_second(10);
                result.setEnable_audio(true);
                result.setEnable_mp4(true);
            }
        }
@@ -278,6 +274,14 @@
                }
            }
        }
        if (param.getApp().equalsIgnoreCase("rtp")) {
            String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_RTP_INFO + userSetting.getServerId() + "_" + param.getStream();
            OtherRtpSendInfo otherRtpSendInfo = (OtherRtpSendInfo)redisTemplate.opsForValue().get(receiveKey);
            if (otherRtpSendInfo != null) {
                result.setEnable_mp4(true);
            }
        }
        logger.info("[ZLM HOOK]推流鉴权 响应:{}->{}->>>>{}", param.getMediaServerId(), param, result);
        return result;
    }
src/main/java/com/genersoft/iot/vmp/vmanager/rtp/RtpController.java
@@ -141,11 +141,12 @@
            // 预创建发流信息
            int portForVideo = sendRtpPortManager.getNextPort(mediaServerItem.getId());
            int portForAudio = sendRtpPortManager.getNextPort(mediaServerItem.getId());
            // 将信息写入redis中,以备后用
            redisTemplate.opsForValue().set(key, otherRtpSendInfo, 300, TimeUnit.SECONDS);
            otherRtpSendInfo.setSendLocalIp(mediaServerItem.getSdpIp());
            otherRtpSendInfo.setSendLocalPortForVideo(portForVideo);
            otherRtpSendInfo.setSendLocalPortForAudio(portForAudio);
            // 将信息写入redis中,以备后用
            redisTemplate.opsForValue().set(key, otherRtpSendInfo, 300, TimeUnit.SECONDS);
            logger.info("[第三方服务对接->开启收流和获取发流信息] 结果,callId->{}, {}", callId, otherRtpSendInfo);
        }
        // 将信息写入redis中,以备后用