From 62ae1ee978798565fa0c8a4e5a00c80957d5c5b4 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: Fri, 31 May 2024 22:54:08 +0800
Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BD=95=E5=83=8F=E4=B8=8B?=
 =?UTF-8?q?=E8=BD=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../cmd/MediaStatusNotifyMessageHandler.java  |  2 +-
 .../media/abl/ABLMediaNodeServerService.java  | 12 +++---
 .../iot/vmp/media/abl/ABLRESTfulUtils.java    |  2 +
 .../hook/OnRecordProgressABLHookParam.java    | 18 +++++++++
 .../event/media/MediaRecordProcessEvent.java  | 23 ++++++++++++
 .../iot/vmp/service/impl/PlayServiceImpl.java | 37 ++++++++++---------
 .../com/genersoft/iot/vmp/utils/DateUtil.java | 12 ++++++
 7 files changed, 82 insertions(+), 24 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java
index f8ff69cf1..8f90cbafc 100755
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/MediaStatusNotifyMessageHandler.java
@@ -95,7 +95,7 @@ public class MediaStatusNotifyMessageHandler extends SIPRequestProcessorParent i
             if (ssrcTransaction != null) {
                 logger.info("[录像流]推送完毕,关流通知, device: {}, channelId: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
                 InviteInfo inviteInfo = inviteStreamService.getInviteInfo(InviteSessionType.DOWNLOAD, ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream());
-                if (inviteInfo.getStreamInfo() != null) {
+                if (inviteInfo != null && inviteInfo.getStreamInfo() != null) {
                     inviteInfo.getStreamInfo().setProgress(1);
                     inviteStreamService.updateInviteInfo(inviteInfo);
                 }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java
index 254bee1b0..7f75df4f6 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLMediaNodeServerService.java
@@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.media.abl.bean.hook.OnStreamArriveABLHookParam;
 import com.genersoft.iot.vmp.media.bean.MediaInfo;
 import com.genersoft.iot.vmp.media.bean.MediaServer;
 import com.genersoft.iot.vmp.media.event.media.MediaDepartureEvent;
+import com.genersoft.iot.vmp.media.event.media.MediaRecordMp4Event;
 import com.genersoft.iot.vmp.media.event.media.MediaRecordProcessEvent;
 import com.genersoft.iot.vmp.media.service.IMediaNodeServerService;
 import com.genersoft.iot.vmp.service.IInviteStreamService;
@@ -297,16 +298,15 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService {
         CloudRecordItem cloudRecordItem = cloudRecordServiceMapper.getListByFileName(event.getApp(), event.getStream(), event.getFileName());
         if (cloudRecordItem == null) {
             cloudRecordItem = CloudRecordItem.getInstance(event);
-            cloudRecordItem.setStartTime(System.currentTimeMillis() - event.getCurrentFileDuration() * 1000);
-            cloudRecordItem.setEndTime(System.currentTimeMillis());
+            cloudRecordItem.setStartTime(event.getStartTime());
+            cloudRecordItem.setEndTime(event.getEndTime());
             cloudRecordServiceMapper.add(cloudRecordItem);
         }else {
             cloudRecordServiceMapper.updateTimeLen(cloudRecordItem.getId(), (long)event.getCurrentFileDuration() * 1000, System.currentTimeMillis());
         }
     }
-    // 收流结束
     @EventListener
-    public void onApplicationEvent(MediaDepartureEvent event) {
+    public void onApplicationEvent(MediaRecordMp4Event event) {
         InviteInfo inviteInfo = inviteStreamService.getInviteInfo(InviteSessionType.DOWNLOAD, null, null, event.getStream());
         if (inviteInfo == null || inviteInfo.getStreamInfo() == null) {
             return;
@@ -319,6 +319,7 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService {
         long endTime = cloudRecordItemList.get(0).getEndTime();
         JSONObject jsonObject = ablresTfulUtils.queryRecordList(event.getMediaServer(), event.getApp(), event.getStream(), DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss(startTime),
                 DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss(endTime));
+        System.err.println(jsonObject);
         if (jsonObject == null || jsonObject.getInteger("code") != 0) {
             return;
         }
@@ -326,11 +327,12 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService {
         if (urlJson == null) {
             return;
         }
-        String download = urlJson.getString("download");
+        String download = urlJson.getString("http-mp4") + "?download_speed=6";
         DownloadFileInfo downloadFileInfo = new DownloadFileInfo();
         downloadFileInfo.setHttpPath(download);
         downloadFileInfo.setHttpsPath(download);
         inviteInfo.getStreamInfo().setDownLoadFilePath(downloadFileInfo);
+        inviteStreamService.updateInviteInfo(inviteInfo);
     }
 
     @Override
diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java
index a5dd753b2..c922ceb50 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLRESTfulUtils.java
@@ -379,6 +379,8 @@ public class ABLRESTfulUtils {
         param.put("stream", stream);
         param.put("starttime", startTime);
         param.put("endtime", endTime);
+        System.out.println("starttime: "+  startTime);
+        System.out.println("endtime: "+  endTime);
         return sendPost(mediaServer,"queryRecordList", param, null);
     }
 
diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/OnRecordProgressABLHookParam.java b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/OnRecordProgressABLHookParam.java
index 8f70781b7..93e6c0974 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/OnRecordProgressABLHookParam.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/abl/bean/hook/OnRecordProgressABLHookParam.java
@@ -3,6 +3,8 @@ package com.genersoft.iot.vmp.media.abl.bean.hook;
 public class OnRecordProgressABLHookParam extends OnRecordMp4ABLHookParam{
     private Integer currentFileDuration;
     private Integer TotalVideoDuration;
+    private String startTime;
+    private String endTime;
 
     public Integer getCurrentFileDuration() {
         return currentFileDuration;
@@ -19,4 +21,20 @@ public class OnRecordProgressABLHookParam extends OnRecordMp4ABLHookParam{
     public void setTotalVideoDuration(Integer totalVideoDuration) {
         TotalVideoDuration = totalVideoDuration;
     }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaRecordProcessEvent.java b/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaRecordProcessEvent.java
index b46ce4809..e4d1a5647 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaRecordProcessEvent.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaRecordProcessEvent.java
@@ -3,6 +3,9 @@ package com.genersoft.iot.vmp.media.event.media;
 import com.genersoft.iot.vmp.media.abl.ABLHttpHookListener;
 import com.genersoft.iot.vmp.media.abl.bean.hook.OnRecordProgressABLHookParam;
 import com.genersoft.iot.vmp.media.bean.MediaServer;
+import com.genersoft.iot.vmp.utils.DateUtil;
+
+import java.util.Date;
 
 /**
  * 录像文件进度通知事件
@@ -12,6 +15,8 @@ public class MediaRecordProcessEvent extends MediaEvent {
     private Integer currentFileDuration;
     private Integer TotalVideoDuration;
     private String fileName;
+    private long startTime;
+    private long endTime;
 
     public MediaRecordProcessEvent(Object source) {
         super(source);
@@ -25,6 +30,8 @@ public class MediaRecordProcessEvent extends MediaEvent {
         mediaRecordMp4Event.setTotalVideoDuration(hookParam.getTotalVideoDuration());
         mediaRecordMp4Event.setMediaServer(mediaServer);
         mediaRecordMp4Event.setFileName(hookParam.getFileName());
+        mediaRecordMp4Event.setStartTime(DateUtil.urlToTimestampMs(hookParam.getStartTime()));
+        mediaRecordMp4Event.setEndTime(DateUtil.urlToTimestampMs(hookParam.getEndTime()));
         return mediaRecordMp4Event;
     }
 
@@ -51,4 +58,20 @@ public class MediaRecordProcessEvent extends MediaEvent {
     public void setFileName(String fileName) {
         this.fileName = fileName;
     }
+
+    public long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(long startTime) {
+        this.startTime = startTime;
+    }
+
+    public long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(long endTime) {
+        this.endTime = endTime;
+    }
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 9b33305ee..b46b5fc4c 100755
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -1025,24 +1025,25 @@ public class PlayServiceImpl implements IPlayService {
                         // 处理收到200ok后的TCP主动连接以及SSRC不一致的问题
                         InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId,
                                 downLoadTimeOutTaskKey, callback, inviteInfo, InviteSessionType.DOWNLOAD);
-
-                        // 注册录像回调事件,录像下载结束后写入下载地址
-                        HookSubscribe.Event hookEventForRecord = (hookData) -> {
-                            logger.info("[录像下载] 收到录像写入磁盘消息: , {}/{}-{}",
-                                    inviteInfo.getDeviceId(), inviteInfo.getChannelId(), ssrcInfo.getStream());
-                            logger.info("[录像下载] 收到录像写入磁盘消息内容: " + hookData);
-                            RecordInfo recordInfo = hookData.getRecordInfo();
-                            String filePath = recordInfo.getFilePath();
-                            DownloadFileInfo downloadFileInfo = CloudRecordUtils.getDownloadFilePath(mediaServerItem, filePath);
-                            InviteInfo inviteInfoForNew = inviteStreamService.getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId()
-                                    , inviteInfo.getChannelId(), inviteInfo.getStream());
-                            inviteInfoForNew.getStreamInfo().setDownLoadFilePath(downloadFileInfo);
-                            inviteStreamService.updateInviteInfo(inviteInfoForNew);
-                        };
-                        Hook hook = Hook.getInstance(HookType.on_record_mp4, "rtp", ssrcInfo.getStream(), mediaServerItem.getId());
-                        // 设置过期时间,下载失败时自动处理订阅数据
-                        hook.setExpireTime(System.currentTimeMillis() + 24 * 60 * 60 * 1000);
-                        subscribe.addSubscribe(hook, hookEventForRecord);
+                        if (mediaServerItem.getType().equals("zlm")) {
+                            // 注册录像回调事件,录像下载结束后写入下载地址
+                            HookSubscribe.Event hookEventForRecord = (hookData) -> {
+                                logger.info("[录像下载] 收到录像写入磁盘消息: , {}/{}-{}",
+                                        inviteInfo.getDeviceId(), inviteInfo.getChannelId(), ssrcInfo.getStream());
+                                logger.info("[录像下载] 收到录像写入磁盘消息内容: " + hookData);
+                                RecordInfo recordInfo = hookData.getRecordInfo();
+                                String filePath = recordInfo.getFilePath();
+                                DownloadFileInfo downloadFileInfo = CloudRecordUtils.getDownloadFilePath(mediaServerItem, filePath);
+                                InviteInfo inviteInfoForNew = inviteStreamService.getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId()
+                                        , inviteInfo.getChannelId(), inviteInfo.getStream());
+                                inviteInfoForNew.getStreamInfo().setDownLoadFilePath(downloadFileInfo);
+                                inviteStreamService.updateInviteInfo(inviteInfoForNew);
+                            };
+                            Hook hook = Hook.getInstance(HookType.on_record_mp4, "rtp", ssrcInfo.getStream(), mediaServerItem.getId());
+                            // 设置过期时间,下载失败时自动处理订阅数据
+                            hook.setExpireTime(System.currentTimeMillis() + 24 * 60 * 60 * 1000);
+                            subscribe.addSubscribe(hook, hookEventForRecord);
+                        }
                     });
         } catch (InvalidArgumentException | SipException | ParseException e) {
             logger.error("[命令发送失败] 录像下载: {}", e.getMessage());
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java
index f6f60d7fe..66c22af78 100755
--- a/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/utils/DateUtil.java
@@ -134,6 +134,18 @@ public class DateUtil {
         return formatter.format(LocalDateTime.ofInstant(instant, ZoneId.of(zoneStr)));
     }
 
+    /**
+     * yyyy_MM_dd_HH_mm_ss 转时间戳(毫秒)
+     *
+     * @param formatTime
+     * @return
+     */
+    public static long urlToTimestampMs(String formatTime) {
+        TemporalAccessor temporalAccessor = urlFormatter.parse(formatTime);
+        Instant instant = Instant.from(temporalAccessor);
+        return instant.toEpochMilli();
+    }
+
     /**
      * 时间戳 转 yyyy_MM_dd
      */