支持abl录像下载中

dev/abl支持
648540858 2024-05-28 17:39:14 +08:00
parent bae9b2571a
commit 98c62b93f7
6 changed files with 123 additions and 13 deletions

View File

@ -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();
}

View File

@ -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<CloudRecordItem> 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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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) {

View File

@ -122,4 +122,16 @@ public interface CloudRecordServiceMapper {
"where id = #{id}" +
" </script>")
CloudRecordItem queryOne(@Param("id") Integer id);
@Select(" <script>" +
"select *" +
" from wvp_cloud_record " +
" where app=#{app} and stream=#{stream} and file_name = #{fileName} " +
" </script>")
CloudRecordItem getListByFileName(@Param("app") String app, @Param("stream") String stream, @Param("fileName") String fileName);
@Update(" <script>" +
"update wvp_cloud_record set time_len = #{currentFileDuration} where id = #{id} " +
" </script>")
void updateTimeLen(int id, Long currentFileDuration);
}