648540858
2022-05-26 2a5404c68f387523a833b8e9f17cda5b0c9ad727
兼容海康信令问题 #493
5个文件已修改
45 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
@@ -112,6 +112,13 @@
    }
    public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){
        if (StringUtils.isEmpty(deviceId)) {
            deviceId ="*";
        }
        if (StringUtils.isEmpty(channelId)) {
            channelId ="*";
        }
        if (StringUtils.isEmpty(callId)) {
            callId ="*";
        }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -708,22 +708,22 @@
            }
            SIPDialog dialog;
            if (callId != null) {
                dialog = streamSession.getDialogByCallId(deviceId, channelId, callId);
                dialog = streamSession.getDialogByCallId(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), callId);
            }else {
                if (stream == null) {
                if (stream == null && ssrcTransaction == null && ssrcTransaction.getStream() == null) {
                    return;
                }
                dialog = streamSession.getDialogByStream(deviceId, channelId, stream);
                dialog = streamSession.getDialogByStream(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
            }
            if (ssrcTransaction != null) {
                MediaServerItem mediaServerItem = mediaServerService.getOne(ssrcTransaction.getMediaServerId());
                mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcTransaction.getSsrc());
                mediaServerService.closeRTPServer(deviceId, channelId, ssrcTransaction.getStream());
                streamSession.remove(deviceId, channelId, ssrcTransaction.getStream());
                mediaServerService.closeRTPServer(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
                streamSession.remove(ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
            }
            if (dialog == null) {
                logger.warn("[ {} -> {}]停止视频流的时候发现对话已丢失", deviceId, channelId);
                logger.warn("[ {} -> {}]停止视频流的时候发现对话已丢失", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
                return;
            }
            SipStack sipStack = udpSipProvider.getSipStack();
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/MessageRequestProcessor.java
@@ -72,7 +72,7 @@
        String deviceId = SipUtils.getUserIdFromFromHeader(evt.getRequest());
        CallIdHeader callIdHeader = (CallIdHeader)evt.getRequest().getHeader(CallIdHeader.NAME);
        // 先从会话内查找
        SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, null, callIdHeader.getCallId());
        SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, callIdHeader.getCallId(), null);
        if (ssrcTransaction != null) { // 兼容海康 媒体通知 消息from字段不是设备ID的问题
            deviceId = ssrcTransaction.getDeviceId();
        }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java
@@ -3,6 +3,8 @@
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.SIPRequestProcessorParent;
import com.genersoft.iot.vmp.gb28181.transmit.event.request.impl.message.IMessageHandler;
@@ -39,6 +41,9 @@
    @Autowired
    private IRedisCatchStorage redisCatchStorage;
    @Autowired
    private VideoStreamSessionManager sessionManager;
    @Override
    public void afterPropertiesSet() throws Exception {
        notifyMessageHandler.addHandler(cmdType, this);
@@ -61,13 +66,19 @@
        String NotifyType =getText(rootElement, "NotifyType");
        if (NotifyType.equals("121")){
            logger.info("[录像流]推送完毕,收到关流通知");
            String channelId =getText(rootElement, "DeviceID");
            // 查询是设备
            StreamInfo streamInfo = redisCatchStorage.queryDownload(device.getDeviceId(), channelId, null, callIdHeader.getCallId());
            // 设置进度100%
            streamInfo.setProgress(1);
            redisCatchStorage.startDownload(streamInfo, callIdHeader.getCallId());
            cmder.streamByeCmd(device.getDeviceId(), channelId, null, callIdHeader.getCallId());
            StreamInfo streamInfo = redisCatchStorage.queryDownload(null, null, null, callIdHeader.getCallId());
            if (streamInfo != null) {
                // 设置进度100%
                streamInfo.setProgress(1);
                redisCatchStorage.startDownload(streamInfo, callIdHeader.getCallId());
            }
            // 先从会话内查找
            SsrcTransaction ssrcTransaction = sessionManager.getSsrcTransaction(null, null, callIdHeader.getCallId(), null);
            if (ssrcTransaction != null) { // 兼容海康 媒体通知 消息from字段不是设备ID的问题
                cmder.streamByeCmd(device.getDeviceId(), ssrcTransaction.getChannelId(), null, callIdHeader.getCallId());
            }
            // TODO 如果级联播放,需要给上级发送此通知
        }
src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java
@@ -1,7 +1,6 @@
package com.genersoft.iot.vmp.utils;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;