[RPC 云端录像] 增加云端录像播放
parent
c629685cd1
commit
08a75d38a8
|
@ -2,12 +2,14 @@ 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.utils.MediaServerUtils;
|
import com.genersoft.iot.vmp.utils.MediaServerUtils;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 云端录像数据
|
* 云端录像数据
|
||||||
*/
|
*/
|
||||||
|
@Data
|
||||||
public class CloudRecordItem {
|
public class CloudRecordItem {
|
||||||
/**
|
/**
|
||||||
* 主键
|
* 主键
|
||||||
|
@ -79,6 +81,11 @@ public class CloudRecordItem {
|
||||||
*/
|
*/
|
||||||
private long timeLen;
|
private long timeLen;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所属服务ID
|
||||||
|
*/
|
||||||
|
private String serverId;
|
||||||
|
|
||||||
public static CloudRecordItem getInstance(MediaRecordMp4Event param) {
|
public static CloudRecordItem getInstance(MediaRecordMp4Event param) {
|
||||||
CloudRecordItem cloudRecordItem = new CloudRecordItem();
|
CloudRecordItem cloudRecordItem = new CloudRecordItem();
|
||||||
cloudRecordItem.setApp(param.getApp());
|
cloudRecordItem.setApp(param.getApp());
|
||||||
|
@ -98,115 +105,4 @@ public class CloudRecordItem {
|
||||||
return cloudRecordItem;
|
return cloudRecordItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(int id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getApp() {
|
|
||||||
return app;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setApp(String app) {
|
|
||||||
this.app = app;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getStream() {
|
|
||||||
return stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStream(String stream) {
|
|
||||||
this.stream = stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCallId() {
|
|
||||||
return callId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCallId(String callId) {
|
|
||||||
this.callId = callId;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMediaServerId() {
|
|
||||||
return mediaServerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMediaServerId(String mediaServerId) {
|
|
||||||
this.mediaServerId = mediaServerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFileName() {
|
|
||||||
return fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFileName(String fileName) {
|
|
||||||
this.fileName = fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFilePath() {
|
|
||||||
return filePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFilePath(String filePath) {
|
|
||||||
this.filePath = filePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFolder() {
|
|
||||||
return folder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFolder(String folder) {
|
|
||||||
this.folder = folder;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getFileSize() {
|
|
||||||
return fileSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFileSize(long fileSize) {
|
|
||||||
this.fileSize = fileSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getTimeLen() {
|
|
||||||
return timeLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTimeLen(long timeLen) {
|
|
||||||
this.timeLen = timeLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean getCollect() {
|
|
||||||
return collect;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCollect(Boolean collect) {
|
|
||||||
this.collect = collect;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Boolean getReserve() {
|
|
||||||
return reserve;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setReserve(Boolean reserve) {
|
|
||||||
this.reserve = reserve;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.genersoft.iot.vmp.service.impl;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSONArray;
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.genersoft.iot.vmp.conf.UserSetting;
|
||||||
import com.genersoft.iot.vmp.conf.exception.ControllerException;
|
import com.genersoft.iot.vmp.conf.exception.ControllerException;
|
||||||
import com.genersoft.iot.vmp.gb28181.service.ICloudRecordService;
|
import com.genersoft.iot.vmp.gb28181.service.ICloudRecordService;
|
||||||
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||||
|
@ -11,6 +12,7 @@ import com.genersoft.iot.vmp.media.zlm.AssistRESTfulUtils;
|
||||||
import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
|
import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo;
|
||||||
import com.genersoft.iot.vmp.service.bean.CloudRecordItem;
|
import com.genersoft.iot.vmp.service.bean.CloudRecordItem;
|
||||||
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
|
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
|
||||||
|
import com.genersoft.iot.vmp.service.redisMsg.IRedisRpcPlayService;
|
||||||
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||||
import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper;
|
import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper;
|
||||||
import com.genersoft.iot.vmp.utils.CloudRecordUtils;
|
import com.genersoft.iot.vmp.utils.CloudRecordUtils;
|
||||||
|
@ -49,6 +51,12 @@ public class CloudRecordServiceImpl implements ICloudRecordService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private AssistRESTfulUtils assistRESTfulUtils;
|
private AssistRESTfulUtils assistRESTfulUtils;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserSetting userSetting;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IRedisRpcPlayService redisRpcPlayService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageInfo<CloudRecordItem> getList(int page, int count, String query, String app, String stream, String startTime, String endTime, List<MediaServer> mediaServerItems, String callId) {
|
public PageInfo<CloudRecordItem> getList(int page, int count, String query, String app, String stream, String startTime, String endTime, List<MediaServer> mediaServerItems, String callId) {
|
||||||
// 开始时间和结束时间在数据库中都是以秒为单位的
|
// 开始时间和结束时间在数据库中都是以秒为单位的
|
||||||
|
@ -235,6 +243,9 @@ public class CloudRecordServiceImpl implements ICloudRecordService {
|
||||||
if (recordItem == null) {
|
if (recordItem == null) {
|
||||||
throw new ControllerException(ErrorCode.ERROR400.getCode(), "资源不存在");
|
throw new ControllerException(ErrorCode.ERROR400.getCode(), "资源不存在");
|
||||||
}
|
}
|
||||||
|
if (!userSetting.getServerId().equals(recordItem.getServerId())) {
|
||||||
|
return redisRpcPlayService.getRecordPlayUrl(recordItem.getServerId(), recordId);
|
||||||
|
}
|
||||||
String filePath = recordItem.getFilePath();
|
String filePath = recordItem.getFilePath();
|
||||||
MediaServer mediaServerItem = mediaServerService.getOne(recordItem.getMediaServerId());
|
MediaServer mediaServerItem = mediaServerService.getOne(recordItem.getMediaServerId());
|
||||||
return CloudRecordUtils.getDownloadFilePath(mediaServerItem, filePath);
|
return CloudRecordUtils.getDownloadFilePath(mediaServerItem, filePath);
|
||||||
|
|
|
@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.service.redisMsg;
|
||||||
import com.genersoft.iot.vmp.common.InviteSessionType;
|
import com.genersoft.iot.vmp.common.InviteSessionType;
|
||||||
import com.genersoft.iot.vmp.common.StreamInfo;
|
import com.genersoft.iot.vmp.common.StreamInfo;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
|
import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
|
||||||
|
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
|
||||||
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
||||||
|
|
||||||
public interface IRedisRpcPlayService {
|
public interface IRedisRpcPlayService {
|
||||||
|
@ -29,4 +30,6 @@ public interface IRedisRpcPlayService {
|
||||||
StreamInfo playProxy(String serverId, int id);
|
StreamInfo playProxy(String serverId, int id);
|
||||||
|
|
||||||
void stopProxy(String serverId, int id);
|
void stopProxy(String serverId, int id);
|
||||||
|
|
||||||
|
DownloadFileInfo getRecordPlayUrl(String serverId, Integer recordId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
package com.genersoft.iot.vmp.service.redisMsg.control;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.genersoft.iot.vmp.conf.UserSetting;
|
||||||
|
import com.genersoft.iot.vmp.conf.redis.RedisRpcConfig;
|
||||||
|
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcMessage;
|
||||||
|
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcRequest;
|
||||||
|
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcResponse;
|
||||||
|
import com.genersoft.iot.vmp.gb28181.service.ICloudRecordService;
|
||||||
|
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
|
||||||
|
import com.genersoft.iot.vmp.service.redisMsg.dto.RedisRpcController;
|
||||||
|
import com.genersoft.iot.vmp.service.redisMsg.dto.RedisRpcMapping;
|
||||||
|
import com.genersoft.iot.vmp.service.redisMsg.dto.RpcController;
|
||||||
|
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
@RedisRpcController("cloudRecord")
|
||||||
|
public class RedisRpcCloudRecordController extends RpcController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserSetting userSetting;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisTemplate<Object, Object> redisTemplate;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ICloudRecordService cloudRecordService;
|
||||||
|
|
||||||
|
|
||||||
|
private void sendResponse(RedisRpcResponse response){
|
||||||
|
log.info("[redis-rpc] >> {}", response);
|
||||||
|
response.setToId(userSetting.getServerId());
|
||||||
|
RedisRpcMessage message = new RedisRpcMessage();
|
||||||
|
message.setResponse(response);
|
||||||
|
redisTemplate.convertAndSend(RedisRpcConfig.REDIS_REQUEST_CHANNEL_KEY, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 播放
|
||||||
|
*/
|
||||||
|
@RedisRpcMapping("play")
|
||||||
|
public RedisRpcResponse play(RedisRpcRequest request) {
|
||||||
|
int id = Integer.parseInt(request.getParam().toString());
|
||||||
|
RedisRpcResponse response = request.getResponse();
|
||||||
|
if (id <= 0) {
|
||||||
|
response.setStatusCode(ErrorCode.ERROR400.getCode());
|
||||||
|
response.setBody("param error");
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
DownloadFileInfo downloadFileInfo = cloudRecordService.getPlayUrlPath(id);
|
||||||
|
if (downloadFileInfo == null) {
|
||||||
|
response.setStatusCode(ErrorCode.ERROR100.getCode());
|
||||||
|
response.setBody("get play url error");
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
response.setStatusCode(ErrorCode.SUCCESS.getCode());
|
||||||
|
response.setBody(JSONObject.toJSONString(downloadFileInfo));
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ import com.genersoft.iot.vmp.conf.redis.RedisRpcConfig;
|
||||||
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcRequest;
|
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcRequest;
|
||||||
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcResponse;
|
import com.genersoft.iot.vmp.conf.redis.bean.RedisRpcResponse;
|
||||||
import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
|
import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
|
||||||
|
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
|
||||||
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
||||||
import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
|
import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
|
||||||
import com.genersoft.iot.vmp.service.redisMsg.IRedisRpcPlayService;
|
import com.genersoft.iot.vmp.service.redisMsg.IRedisRpcPlayService;
|
||||||
|
@ -226,5 +227,15 @@ public class RedisRpcPlayServiceImpl implements IRedisRpcPlayService {
|
||||||
log.info("[rpc 拉流代理] 停止失败 id: {}", id);
|
log.info("[rpc 拉流代理] 停止失败 id: {}", id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DownloadFileInfo getRecordPlayUrl(String serverId, Integer recordId) {
|
||||||
|
RedisRpcRequest request = buildRequest("cloudRecord/play", recordId);
|
||||||
|
RedisRpcResponse response = redisRpcConfig.request(request, userSetting.getPlayTimeout());
|
||||||
|
if (response != null && response.getStatusCode() == ErrorCode.SUCCESS.getCode()) {
|
||||||
|
return JSON.parseObject(response.getBody().toString(), DownloadFileInfo.class);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,8 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="时长">
|
<el-table-column label="时长">
|
||||||
<template v-slot:default="scope">
|
<template v-slot:default="scope">
|
||||||
<el-tag>{{formatTime(scope.row.timeLen)}}</el-tag>
|
<el-tag v-if="scope.row.pushing && serverId !== scope.row.serverId" style="border-color: #ecf1af">{{formatTime(scope.row.timeLen)}}</el-tag>
|
||||||
|
<el-tag v-if="scope.row.pushing && serverId === scope.row.serverId">{{formatTime(scope.row.timeLen)}}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="fileName" label="文件名称">
|
<el-table-column prop="fileName" label="文件名称">
|
||||||
|
@ -134,7 +135,7 @@ export default {
|
||||||
mediaServerPath: null, // 媒体服务地址
|
mediaServerPath: null, // 媒体服务地址
|
||||||
recordList: [], // 设备列表
|
recordList: [], // 设备列表
|
||||||
chooseRecord: null, // 媒体服务
|
chooseRecord: null, // 媒体服务
|
||||||
|
serverId: this.$myServerId,
|
||||||
updateLooper: 0, //数据刷新轮训标志
|
updateLooper: 0, //数据刷新轮训标志
|
||||||
winHeight: window.innerHeight - 250,
|
winHeight: window.innerHeight - 250,
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
|
|
Loading…
Reference in New Issue