支持abl录像下载中
parent
bae9b2571a
commit
98c62b93f7
|
@ -177,12 +177,12 @@ public class ABLHttpHookListener {
|
||||||
try {
|
try {
|
||||||
MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
||||||
if (mediaServerItem != null) {
|
if (mediaServerItem != null) {
|
||||||
MediaRecordMp4Event event = MediaRecordMp4Event.getInstance(this, param, mediaServerItem);
|
MediaRecordProcessEvent event = MediaRecordProcessEvent.getInstance(this, param, mediaServerItem);
|
||||||
event.setMediaServer(mediaServerItem);
|
event.setMediaServer(mediaServerItem);
|
||||||
applicationEventPublisher.publishEvent(event);
|
applicationEventPublisher.publishEvent(event);
|
||||||
}
|
}
|
||||||
}catch (Exception e) {
|
}catch (Exception e) {
|
||||||
logger.info("[ZLM-HOOK-rtpServer收流超时] 发送通知失败 ", e);
|
logger.info("[ZLM-HOOK-录像进度通知] 发送通知失败 ", e);
|
||||||
}
|
}
|
||||||
return HookResult.SUCCESS();
|
return HookResult.SUCCESS();
|
||||||
}
|
}
|
||||||
|
@ -336,16 +336,17 @@ public class ABLHttpHookListener {
|
||||||
@PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8")
|
@PostMapping(value = "/on_record_mp4", produces = "application/json;charset=UTF-8")
|
||||||
public HookResult onRecordMp4(HttpServletRequest request, @RequestBody OnRecordMp4ABLHookParam param) {
|
public HookResult onRecordMp4(HttpServletRequest request, @RequestBody OnRecordMp4ABLHookParam param) {
|
||||||
logger.info("[ABL HOOK] 录像完成事件:{}->{}", param.getMediaServerId(), param.getFileName());
|
logger.info("[ABL HOOK] 录像完成事件:{}->{}", param.getMediaServerId(), param.getFileName());
|
||||||
// try {
|
|
||||||
// MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
try {
|
||||||
// if (mediaServerItem != null) {
|
MediaServer mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
|
||||||
// MediaRecordMp4Event event = MediaRecordMp4Event.getInstance(this, param, mediaServerItem);
|
if (mediaServerItem != null) {
|
||||||
// event.setMediaServer(mediaServerItem);
|
MediaRecordMp4Event event = MediaRecordMp4Event.getInstance(this, param, mediaServerItem);
|
||||||
// applicationEventPublisher.publishEvent(event);
|
event.setMediaServer(mediaServerItem);
|
||||||
// }
|
applicationEventPublisher.publishEvent(event);
|
||||||
// }catch (Exception e) {
|
}
|
||||||
// logger.info("[ZLM-HOOK-rtpServer收流超时] 发送通知失败 ", e);
|
}catch (Exception e) {
|
||||||
// }
|
logger.info("[ZLM-HOOK-rtpServer收流超时] 发送通知失败 ", e);
|
||||||
|
}
|
||||||
|
|
||||||
return HookResult.SUCCESS();
|
return HookResult.SUCCESS();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.abl.bean.hook.OnStreamArriveABLHookParam;
|
||||||
import com.genersoft.iot.vmp.media.bean.MediaInfo;
|
import com.genersoft.iot.vmp.media.bean.MediaInfo;
|
||||||
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
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.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 com.genersoft.iot.vmp.vmanager.bean.WVPResult;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.event.EventListener;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
|
|
||||||
|
@ -38,6 +42,9 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserSetting userSetting;
|
private UserSetting userSetting;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CloudRecordServiceMapper cloudRecordServiceMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean initStopSendRtp(MediaServer mediaInfo, String app, String stream, String ssrc) {
|
public boolean initStopSendRtp(MediaServer mediaInfo, String app, String stream, String ssrc) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -274,4 +281,29 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService {
|
||||||
public void startSendRtpStream(MediaServer mediaServer, SendRtpItem sendRtpItem) {
|
public void startSendRtpStream(MediaServer mediaServer, SendRtpItem sendRtpItem) {
|
||||||
logger.warn("[abl-startSendRtpStream] 未实现");
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
package com.genersoft.iot.vmp.service.bean;
|
package com.genersoft.iot.vmp.service.bean;
|
||||||
|
|
||||||
import com.genersoft.iot.vmp.media.event.media.MediaRecordMp4Event;
|
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 com.genersoft.iot.vmp.utils.MediaServerUtils;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -98,6 +99,16 @@ public class CloudRecordItem {
|
||||||
return 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() {
|
public int getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
|
@ -121,7 +121,7 @@ public class PlayServiceImpl implements IPlayService {
|
||||||
* 流到来的处理
|
* 流到来的处理
|
||||||
*/
|
*/
|
||||||
@Async("taskExecutor")
|
@Async("taskExecutor")
|
||||||
@org.springframework.context.event.EventListener
|
@EventListener
|
||||||
public void onApplicationEvent(MediaArrivalEvent event) {
|
public void onApplicationEvent(MediaArrivalEvent event) {
|
||||||
if ("broadcast".equals(event.getApp())) {
|
if ("broadcast".equals(event.getApp())) {
|
||||||
if (event.getStream().indexOf("_") > 0) {
|
if (event.getStream().indexOf("_") > 0) {
|
||||||
|
|
|
@ -122,4 +122,16 @@ public interface CloudRecordServiceMapper {
|
||||||
"where id = #{id}" +
|
"where id = #{id}" +
|
||||||
" </script>")
|
" </script>")
|
||||||
CloudRecordItem queryOne(@Param("id") Integer id);
|
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue