调整录像下载

dev/abl支持
648540858 2024-05-31 22:54:08 +08:00
parent 3e9def7aac
commit 62ae1ee978
7 changed files with 82 additions and 24 deletions

View File

@ -95,7 +95,7 @@ public class MediaStatusNotifyMessageHandler extends SIPRequestProcessorParent i
if (ssrcTransaction != null) { if (ssrcTransaction != null) {
logger.info("[录像流]推送完毕,关流通知, device: {}, channelId: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId()); logger.info("[录像流]推送完毕,关流通知, device: {}, channelId: {}", ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId());
InviteInfo inviteInfo = inviteStreamService.getInviteInfo(InviteSessionType.DOWNLOAD, ssrcTransaction.getDeviceId(), ssrcTransaction.getChannelId(), ssrcTransaction.getStream()); 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); inviteInfo.getStreamInfo().setProgress(1);
inviteStreamService.updateInviteInfo(inviteInfo); inviteStreamService.updateInviteInfo(inviteInfo);
} }

View File

@ -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.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.MediaDepartureEvent; 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.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.IInviteStreamService; 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()); CloudRecordItem cloudRecordItem = cloudRecordServiceMapper.getListByFileName(event.getApp(), event.getStream(), event.getFileName());
if (cloudRecordItem == null) { if (cloudRecordItem == null) {
cloudRecordItem = CloudRecordItem.getInstance(event); cloudRecordItem = CloudRecordItem.getInstance(event);
cloudRecordItem.setStartTime(System.currentTimeMillis() - event.getCurrentFileDuration() * 1000); cloudRecordItem.setStartTime(event.getStartTime());
cloudRecordItem.setEndTime(System.currentTimeMillis()); cloudRecordItem.setEndTime(event.getEndTime());
cloudRecordServiceMapper.add(cloudRecordItem); cloudRecordServiceMapper.add(cloudRecordItem);
}else { }else {
cloudRecordServiceMapper.updateTimeLen(cloudRecordItem.getId(), (long)event.getCurrentFileDuration() * 1000, System.currentTimeMillis()); cloudRecordServiceMapper.updateTimeLen(cloudRecordItem.getId(), (long)event.getCurrentFileDuration() * 1000, System.currentTimeMillis());
} }
} }
// 收流结束
@EventListener @EventListener
public void onApplicationEvent(MediaDepartureEvent event) { public void onApplicationEvent(MediaRecordMp4Event event) {
InviteInfo inviteInfo = inviteStreamService.getInviteInfo(InviteSessionType.DOWNLOAD, null, null, event.getStream()); InviteInfo inviteInfo = inviteStreamService.getInviteInfo(InviteSessionType.DOWNLOAD, null, null, event.getStream());
if (inviteInfo == null || inviteInfo.getStreamInfo() == null) { if (inviteInfo == null || inviteInfo.getStreamInfo() == null) {
return; return;
@ -319,6 +319,7 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService {
long endTime = cloudRecordItemList.get(0).getEndTime(); long endTime = cloudRecordItemList.get(0).getEndTime();
JSONObject jsonObject = ablresTfulUtils.queryRecordList(event.getMediaServer(), event.getApp(), event.getStream(), DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss(startTime), 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)); DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss(endTime));
System.err.println(jsonObject);
if (jsonObject == null || jsonObject.getInteger("code") != 0) { if (jsonObject == null || jsonObject.getInteger("code") != 0) {
return; return;
} }
@ -326,11 +327,12 @@ public class ABLMediaNodeServerService implements IMediaNodeServerService {
if (urlJson == null) { if (urlJson == null) {
return; return;
} }
String download = urlJson.getString("download"); String download = urlJson.getString("http-mp4") + "?download_speed=6";
DownloadFileInfo downloadFileInfo = new DownloadFileInfo(); DownloadFileInfo downloadFileInfo = new DownloadFileInfo();
downloadFileInfo.setHttpPath(download); downloadFileInfo.setHttpPath(download);
downloadFileInfo.setHttpsPath(download); downloadFileInfo.setHttpsPath(download);
inviteInfo.getStreamInfo().setDownLoadFilePath(downloadFileInfo); inviteInfo.getStreamInfo().setDownLoadFilePath(downloadFileInfo);
inviteStreamService.updateInviteInfo(inviteInfo);
} }
@Override @Override

View File

@ -379,6 +379,8 @@ public class ABLRESTfulUtils {
param.put("stream", stream); param.put("stream", stream);
param.put("starttime", startTime); param.put("starttime", startTime);
param.put("endtime", endTime); param.put("endtime", endTime);
System.out.println("starttime: "+ startTime);
System.out.println("endtime: "+ endTime);
return sendPost(mediaServer,"queryRecordList", param, null); return sendPost(mediaServer,"queryRecordList", param, null);
} }

View File

@ -3,6 +3,8 @@ package com.genersoft.iot.vmp.media.abl.bean.hook;
public class OnRecordProgressABLHookParam extends OnRecordMp4ABLHookParam{ public class OnRecordProgressABLHookParam extends OnRecordMp4ABLHookParam{
private Integer currentFileDuration; private Integer currentFileDuration;
private Integer TotalVideoDuration; private Integer TotalVideoDuration;
private String startTime;
private String endTime;
public Integer getCurrentFileDuration() { public Integer getCurrentFileDuration() {
return currentFileDuration; return currentFileDuration;
@ -19,4 +21,20 @@ public class OnRecordProgressABLHookParam extends OnRecordMp4ABLHookParam{
public void setTotalVideoDuration(Integer totalVideoDuration) { public void setTotalVideoDuration(Integer totalVideoDuration) {
TotalVideoDuration = 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;
}
} }

View File

@ -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.ABLHttpHookListener;
import com.genersoft.iot.vmp.media.abl.bean.hook.OnRecordProgressABLHookParam; import com.genersoft.iot.vmp.media.abl.bean.hook.OnRecordProgressABLHookParam;
import com.genersoft.iot.vmp.media.bean.MediaServer; 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 currentFileDuration;
private Integer TotalVideoDuration; private Integer TotalVideoDuration;
private String fileName; private String fileName;
private long startTime;
private long endTime;
public MediaRecordProcessEvent(Object source) { public MediaRecordProcessEvent(Object source) {
super(source); super(source);
@ -25,6 +30,8 @@ public class MediaRecordProcessEvent extends MediaEvent {
mediaRecordMp4Event.setTotalVideoDuration(hookParam.getTotalVideoDuration()); mediaRecordMp4Event.setTotalVideoDuration(hookParam.getTotalVideoDuration());
mediaRecordMp4Event.setMediaServer(mediaServer); mediaRecordMp4Event.setMediaServer(mediaServer);
mediaRecordMp4Event.setFileName(hookParam.getFileName()); mediaRecordMp4Event.setFileName(hookParam.getFileName());
mediaRecordMp4Event.setStartTime(DateUtil.urlToTimestampMs(hookParam.getStartTime()));
mediaRecordMp4Event.setEndTime(DateUtil.urlToTimestampMs(hookParam.getEndTime()));
return mediaRecordMp4Event; return mediaRecordMp4Event;
} }
@ -51,4 +58,20 @@ public class MediaRecordProcessEvent extends MediaEvent {
public void setFileName(String fileName) { public void setFileName(String fileName) {
this.fileName = 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;
}
} }

View File

@ -1025,7 +1025,7 @@ public class PlayServiceImpl implements IPlayService {
// 处理收到200ok后的TCP主动连接以及SSRC不一致的问题 // 处理收到200ok后的TCP主动连接以及SSRC不一致的问题
InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId, InviteOKHandler(eventResult, ssrcInfo, mediaServerItem, device, channelId,
downLoadTimeOutTaskKey, callback, inviteInfo, InviteSessionType.DOWNLOAD); downLoadTimeOutTaskKey, callback, inviteInfo, InviteSessionType.DOWNLOAD);
if (mediaServerItem.getType().equals("zlm")) {
// 注册录像回调事件,录像下载结束后写入下载地址 // 注册录像回调事件,录像下载结束后写入下载地址
HookSubscribe.Event hookEventForRecord = (hookData) -> { HookSubscribe.Event hookEventForRecord = (hookData) -> {
logger.info("[录像下载] 收到录像写入磁盘消息: {}/{}-{}", logger.info("[录像下载] 收到录像写入磁盘消息: {}/{}-{}",
@ -1043,6 +1043,7 @@ public class PlayServiceImpl implements IPlayService {
// 设置过期时间,下载失败时自动处理订阅数据 // 设置过期时间,下载失败时自动处理订阅数据
hook.setExpireTime(System.currentTimeMillis() + 24 * 60 * 60 * 1000); hook.setExpireTime(System.currentTimeMillis() + 24 * 60 * 60 * 1000);
subscribe.addSubscribe(hook, hookEventForRecord); subscribe.addSubscribe(hook, hookEventForRecord);
}
}); });
} catch (InvalidArgumentException | SipException | ParseException e) { } catch (InvalidArgumentException | SipException | ParseException e) {
logger.error("[命令发送失败] 录像下载: {}", e.getMessage()); logger.error("[命令发送失败] 录像下载: {}", e.getMessage());

View File

@ -134,6 +134,18 @@ public class DateUtil {
return formatter.format(LocalDateTime.ofInstant(instant, ZoneId.of(zoneStr))); 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 * yyyy_MM_dd
*/ */