diff --git a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLHttpHookListener.java b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLHttpHookListener.java index 4d70a538..c281e9d2 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/abl/ABLHttpHookListener.java +++ b/src/main/java/com/genersoft/iot/vmp/media/abl/ABLHttpHookListener.java @@ -177,12 +177,12 @@ public class ABLHttpHookListener { try { MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); if (mediaServerItem != null) { - MediaRecordMp4Event event = MediaRecordMp4Event.getInstance(this, param, mediaServerItem); + MediaRecordProcessEvent event = MediaRecordProcessEvent.getInstance(this, param, mediaServerItem); event.setMediaServer(mediaServerItem); applicationEventPublisher.publishEvent(event); } }catch (Exception e) { - logger.info("[ZLM-HOOK-rtpServer收流超时] 发送通知失败 ", e); + logger.info("[ZLM-HOOK-录像进度通知] 发送通知失败 ", e); } return HookResult.SUCCESS(); } @@ -336,16 +336,17 @@ public class ABLHttpHookListener { @PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8") public HookResult onRecordMp4(HttpServletRequest request, @RequestBody OnRecordMp4ABLHookParam param) { logger.info("[ABL HOOK] 录像完成事件:{}->{}", param.getMediaServerId(), param.getFileName()); -// try { -// MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); -// if (mediaServerItem != null) { -// MediaRecordMp4Event event = MediaRecordMp4Event.getInstance(this, param, mediaServerItem); -// event.setMediaServer(mediaServerItem); -// applicationEventPublisher.publishEvent(event); -// } -// }catch (Exception e) { -// logger.info("[ZLM-HOOK-rtpServer收流超时] 发送通知失败 ", e); -// } + + try { + MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId()); + if (mediaServerItem != null) { + MediaRecordMp4Event event = MediaRecordMp4Event.getInstance(this, param, mediaServerItem); + event.setMediaServer(mediaServerItem); + applicationEventPublisher.publishEvent(event); + } + }catch (Exception e) { + logger.info("[ZLM-HOOK-rtpServer收流超时] 发送通知失败 ", e); + } return HookResult.SUCCESS(); } 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 a37073f9..fded94b2 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 @@ -11,11 +11,15 @@ import com.genersoft.iot.vmp.media.abl.bean.AblServerConfig; 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.MediaRecordProcessEvent; import com.genersoft.iot.vmp.media.service.IMediaNodeServerService; +import com.genersoft.iot.vmp.service.bean.CloudRecordItem; +import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; @@ -38,6 +42,9 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { @Autowired private UserSetting userSetting; + @Autowired + private CloudRecordServiceMapper cloudRecordServiceMapper; + @Override public boolean initStopSendRtp(MediaServer mediaInfo, String app, String stream, String ssrc) { return false; @@ -274,4 +281,29 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService { public void startSendRtpStream(MediaServer mediaServer, SendRtpItem sendRtpItem) { logger.warn("[abl-startSendRtpStream] 未实现"); } + + // 接受进度通知 + @EventListener + public void onApplicationEvent(MediaRecordProcessEvent event) { + CloudRecordItem cloudRecordItem = cloudRecordServiceMapper.getListByFileName(event.getApp(), event.getStream(), event.getFileName()); + if (cloudRecordItem == null) { + cloudRecordItem = CloudRecordItem.getInstance(event); + cloudRecordServiceMapper.add(cloudRecordItem); + }else { + cloudRecordServiceMapper.updateTimeLen(cloudRecordItem.getId(), (long)event.getCurrentFileDuration() * 1000); + } + } + + @Override + public Long updateDownloadProcess(MediaServer mediaServer, String app, String stream) { + List list = cloudRecordServiceMapper.getList(null, app, stream, null, null, null, null, null); + if (list.isEmpty()) { + return null; + } + Long downloadProcess = 0L; + for (CloudRecordItem cloudRecordItem : list) { + downloadProcess += cloudRecordItem.getTimeLen(); + } + return downloadProcess; + } } 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 new file mode 100644 index 00000000..b46ce480 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/media/event/media/MediaRecordProcessEvent.java @@ -0,0 +1,54 @@ +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; + +/** + * 录像文件进度通知事件 + */ +public class MediaRecordProcessEvent extends MediaEvent { + + private Integer currentFileDuration; + private Integer TotalVideoDuration; + private String fileName; + + public MediaRecordProcessEvent(Object source) { + super(source); + } + + public static MediaRecordProcessEvent getInstance(ABLHttpHookListener source, OnRecordProgressABLHookParam hookParam, MediaServer mediaServer) { + MediaRecordProcessEvent mediaRecordMp4Event = new MediaRecordProcessEvent(source); + mediaRecordMp4Event.setApp(hookParam.getApp()); + mediaRecordMp4Event.setStream(hookParam.getStream()); + mediaRecordMp4Event.setCurrentFileDuration(hookParam.getCurrentFileDuration()); + mediaRecordMp4Event.setTotalVideoDuration(hookParam.getTotalVideoDuration()); + mediaRecordMp4Event.setMediaServer(mediaServer); + mediaRecordMp4Event.setFileName(hookParam.getFileName()); + return mediaRecordMp4Event; + } + + public Integer getCurrentFileDuration() { + return currentFileDuration; + } + + public void setCurrentFileDuration(Integer currentFileDuration) { + this.currentFileDuration = currentFileDuration; + } + + public Integer getTotalVideoDuration() { + return TotalVideoDuration; + } + + public void setTotalVideoDuration(Integer totalVideoDuration) { + TotalVideoDuration = totalVideoDuration; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java b/src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java index 3716d73e..808b9d1b 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java +++ b/src/main/java/com/genersoft/iot/vmp/service/bean/CloudRecordItem.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.service.bean; import com.genersoft.iot.vmp.media.event.media.MediaRecordMp4Event; +import com.genersoft.iot.vmp.media.event.media.MediaRecordProcessEvent; import com.genersoft.iot.vmp.utils.MediaServerUtils; import java.util.Map; @@ -98,6 +99,16 @@ public class CloudRecordItem { return cloudRecordItem; } + public static CloudRecordItem getInstance(MediaRecordProcessEvent event) { + CloudRecordItem cloudRecordItem = new CloudRecordItem(); + cloudRecordItem.setApp(event.getApp()); + cloudRecordItem.setStream(event.getStream()); + cloudRecordItem.setFileName(event.getFileName()); + cloudRecordItem.setMediaServerId(event.getMediaServer().getId()); + cloudRecordItem.setTimeLen(event.getCurrentFileDuration() * 1000); + return cloudRecordItem; + } + public int getId() { return id; } 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 3c7b3eab..9b33305e 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 @@ -121,7 +121,7 @@ public class PlayServiceImpl implements IPlayService { * 流到来的处理 */ @Async("taskExecutor") - @org.springframework.context.event.EventListener + @EventListener public void onApplicationEvent(MediaArrivalEvent event) { if ("broadcast".equals(event.getApp())) { if (event.getStream().indexOf("_") > 0) { diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java index a654ea06..310bfd58 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java @@ -122,4 +122,16 @@ public interface CloudRecordServiceMapper { "where id = #{id}" + " ") CloudRecordItem queryOne(@Param("id") Integer id); + + @Select(" ") + CloudRecordItem getListByFileName(@Param("app") String app, @Param("stream") String stream, @Param("fileName") String fileName); + + @Update(" ") + void updateTimeLen(int id, Long currentFileDuration); }