648540858
2023-06-27 c7d15150237c946fbb4f5547dab0018a5f573d88
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -21,6 +21,7 @@
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -39,7 +40,7 @@
import java.util.UUID;
@Tag(name  = "国标设备点播")
@CrossOrigin
@RestController
@RequestMapping("/api/play")
public class PlayController {
@@ -80,23 +81,9 @@
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "channelId", description = "通道国标编号", required = true)
   @GetMapping("/start/{deviceId}/{channelId}")
   public DeferredResult<WVPResult<StreamInfo>> play(HttpServletRequest request, @PathVariable String deviceId,
                                         @PathVariable String channelId) {
   public DeferredResult<WVPResult<StreamContent>> play(HttpServletRequest request, @PathVariable String deviceId,
                                           @PathVariable String channelId) {
      String localAddr = request.getLocalAddr();
      String localName = request.getLocalName();
      String remoteHost = request.getRemoteHost();
      String remoteAddr = request.getRemoteAddr();
      String remoteUser = request.getRemoteUser();
      String requestURI = request.getRequestURI();
      System.out.println(3333333);
      System.out.println(localAddr);
      System.out.println(localName);
      System.out.println(remoteHost);
      System.out.println(remoteAddr);
      System.out.println(remoteUser);
      System.out.println(requestURI);
      System.out.println(4444444);
      // 获取可用的zlm
      Device device = storager.queryVideoDevice(deviceId);
      MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device);
@@ -107,20 +94,34 @@
      msg.setKey(key);
      String uuid = UUID.randomUUID().toString();
      msg.setId(uuid);
      DeferredResult<WVPResult<StreamInfo>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
      DeferredResultEx<WVPResult<StreamInfo>> deferredResultEx = new DeferredResultEx<>(result);
      DeferredResult<WVPResult<StreamContent>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
      DeferredResultEx<WVPResult<StreamContent>> deferredResultEx = new DeferredResultEx<>(result);
      deferredResultEx.setFilter(result1 -> {
         System.out.println(1111);
         System.out.println(request.getLocalName());
         WVPResult<StreamInfo> wvpResult = (WVPResult<StreamInfo>)result1;
         if (wvpResult.getCode() == ErrorCode.SUCCESS.getCode()) {
            StreamInfo data = wvpResult.getData();
            data.channgeStreamIp(request.getLocalName());
            ((WVPResult<StreamInfo>)result1).setData(data);
         }
         return result1;
      result.onTimeout(()->{
         logger.info("点播接口等待超时");
         // 释放rtpserver
         WVPResult<StreamInfo> wvpResult = new WVPResult<>();
         wvpResult.setCode(ErrorCode.ERROR100.getCode());
         wvpResult.setMsg("点播超时");
         msg.setData(wvpResult);
         resultHolder.invokeResult(msg);
      });
      // TODO 在点播未成功的情况下在此调用接口点播会导致返回的流地址ip错误
      deferredResultEx.setFilter(result1 -> {
         WVPResult<StreamInfo> wvpResult1 = (WVPResult<StreamInfo>)result1;
         WVPResult<StreamContent> resultStream = new WVPResult<>();
         resultStream.setCode(wvpResult1.getCode());
         resultStream.setMsg(wvpResult1.getMsg());
         if (wvpResult1.getCode() == ErrorCode.SUCCESS.getCode()) {
            StreamInfo data = wvpResult1.getData().clone();
            if (userSetting.getUseSourceIpAsStreamIp()) {
               data.channgeStreamIp(request.getLocalName());
            }
            resultStream.setData(new StreamContent(wvpResult1.getData()));
         }
         return resultStream;
      });
      // 录像查询以channelId作为deviceId查询
      resultHolder.put(key, uuid, deferredResultEx);
@@ -130,7 +131,6 @@
      }
      return result;
   }
   @Operation(summary = "停止点播")
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
@@ -168,7 +168,6 @@
      json.put("deviceId", deviceId);
      json.put("channelId", channelId);
      return json;
   }
   /**