648540858
2022-08-22 ecd14d6757eb12e66d7668eff509c10875abf855
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/record/GBRecordController.java
@@ -2,16 +2,15 @@
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo;
import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.service.IPlayService;
import com.genersoft.iot.vmp.service.bean.SSRCInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -28,11 +27,12 @@
import com.genersoft.iot.vmp.gb28181.bean.RecordInfo;
import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import java.time.LocalDate;
import java.util.UUID;
@Api(tags = "国标录像")
@Tag(name  = "国标录像")
@CrossOrigin
@RestController
@RequestMapping("/api/gb_record")
@@ -44,7 +44,7 @@
   private SIPCommander cmder;
   @Autowired
   private IVideoManagerStorager storager;
   private IVideoManagerStorage storager;
   @Autowired
   private DeferredResultHolder resultHolder;
@@ -52,26 +52,38 @@
   @Autowired
   private IPlayService playService;
   @Autowired
   private IMediaServerService mediaServerService;
   @ApiOperation("录像查询")
   @ApiImplicitParams({
         @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
         @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class),
         @ApiImplicitParam(name = "startTime", value = "开始时间", dataTypeClass = String.class),
         @ApiImplicitParam(name = "endTime", value = "结束时间", dataTypeClass = String.class),
   })
   @Operation(summary = "录像查询")
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "channelId", description = "通道国标编号", required = true)
   @Parameter(name = "startTime", description = "开始时间", required = true)
   @Parameter(name = "endTime", description = "结束时间", required = true)
   @GetMapping("/query/{deviceId}/{channelId}")
   public DeferredResult<ResponseEntity<RecordInfo>> recordinfo(@PathVariable String deviceId,@PathVariable String channelId, String startTime,  String endTime){
   public DeferredResult<ResponseEntity<WVPResult<RecordInfo>>> recordinfo(@PathVariable String deviceId, @PathVariable String channelId, String startTime, String endTime){
      if (logger.isDebugEnabled()) {
         logger.debug(String.format("录像信息查询 API调用,deviceId:%s ,startTime:%s, startTime:%s",deviceId, startTime, endTime));
         logger.debug(String.format("录像信息查询 API调用,deviceId:%s ,startTime:%s, endTime:%s",deviceId, startTime, endTime));
      }
      DeferredResult<ResponseEntity<WVPResult<RecordInfo>>> result = new DeferredResult<>();
      if (!DateUtil.verification(startTime, DateUtil.formatter)){
         WVPResult<RecordInfo> wvpResult = new WVPResult<>();
         wvpResult.setCode(-1);
         wvpResult.setMsg("startTime error, format is " + DateUtil.PATTERN);
         ResponseEntity<WVPResult<RecordInfo>> resultResponseEntity = new ResponseEntity<>(wvpResult, HttpStatus.OK);
         result.setResult(resultResponseEntity);
         return result;
      }
      if (!DateUtil.verification(endTime, DateUtil.formatter)){
         WVPResult<RecordInfo> wvpResult = new WVPResult<>();
         wvpResult.setCode(-1);
         wvpResult.setMsg("endTime error, format is " + DateUtil.PATTERN);
         ResponseEntity<WVPResult<RecordInfo>> resultResponseEntity = new ResponseEntity<>(wvpResult, HttpStatus.OK);
         result.setResult(resultResponseEntity);
         return result;
      }
      Device device = storager.queryVideoDevice(deviceId);
      // 指定超时时间 1分钟30秒
      DeferredResult<ResponseEntity<RecordInfo>> result = new DeferredResult<>(90*1000L);
      String uuid = UUID.randomUUID().toString();
      int sn  =  (int)((Math.random()*9+1)*100000);
      String key = DeferredResultHolder.CALLBACK_CMD_RECORDINFO + deviceId + sn;
@@ -79,7 +91,10 @@
      msg.setId(uuid);
      msg.setKey(key);
      cmder.recordInfoQuery(device, channelId, startTime, endTime, sn, null, null, null, (eventResult -> {
         msg.setData("查询录像失败, status: " +  eventResult.statusCode + ", message: " + eventResult.msg );
         WVPResult<RecordInfo> wvpResult = new WVPResult<>();
         wvpResult.setCode(-1);
         wvpResult.setMsg("查询录像失败, status: " +  eventResult.statusCode + ", message: " + eventResult.msg);
         msg.setData(wvpResult);
         resultHolder.invokeResult(msg);
      }));
@@ -87,19 +102,22 @@
      resultHolder.put(key, uuid, result);
      result.onTimeout(()->{
         msg.setData("timeout");
         WVPResult<RecordInfo> wvpResult = new WVPResult<>();
         wvpResult.setCode(-1);
         wvpResult.setMsg("timeout");
         msg.setData(wvpResult);
         resultHolder.invokeResult(msg);
      });
        return result;
   }
   @ApiOperation("开始历史媒体下载")
   @ApiImplicitParams({
         @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
         @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class),
         @ApiImplicitParam(name = "startTime", value = "开始时间", dataTypeClass = String.class),
         @ApiImplicitParam(name = "endTime", value = "结束时间", dataTypeClass = String.class),
         @ApiImplicitParam(name = "downloadSpeed", value = "下载倍速", dataTypeClass = String.class),
   })
   @Operation(summary = "开始历史媒体下载")
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "channelId", description = "通道国标编号", required = true)
   @Parameter(name = "startTime", description = "开始时间", required = true)
   @Parameter(name = "endTime", description = "结束时间", required = true)
   @Parameter(name = "downloadSpeed", description = "下载倍速", required = true)
   @GetMapping("/download/start/{deviceId}/{channelId}")
   public DeferredResult<ResponseEntity<String>> download(@PathVariable String deviceId, @PathVariable String channelId,
                                          String startTime, String endTime, String downloadSpeed) {
@@ -160,12 +178,10 @@
      return result;
   }
   @ApiOperation("停止历史媒体下载")
   @ApiImplicitParams({
         @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
         @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class),
         @ApiImplicitParam(name = "stream", value = "流ID", dataTypeClass = String.class),
   })
   @Operation(summary = "停止历史媒体下载")
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "channelId", description = "通道国标编号", required = true)
   @Parameter(name = "stream", description = "流ID", required = true)
   @GetMapping("/download/stop/{deviceId}/{channelId}/{stream}")
   public ResponseEntity<String> playStop(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) {
@@ -186,12 +202,10 @@
      }
   }
   @ApiOperation("获取历史媒体下载进度")
   @ApiImplicitParams({
         @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
         @ApiImplicitParam(name = "channelId", value = "通道ID", dataTypeClass = String.class),
         @ApiImplicitParam(name = "stream", value = "流ID", dataTypeClass = String.class),
   })
   @Operation(summary = "获取历史媒体下载进度")
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "channelId", description = "通道国标编号", required = true)
   @Parameter(name = "stream", description = "流ID", required = true)
   @GetMapping("/download/progress/{deviceId}/{channelId}/{stream}")
   public ResponseEntity<StreamInfo> getProgress(@PathVariable String deviceId, @PathVariable String channelId, @PathVariable String stream) {