648540858
2023-04-04 b4048fbe80dba8e7756ae557a15ab60b4f80a44b
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -19,10 +19,7 @@
import com.genersoft.iot.vmp.service.IPlayService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
import com.genersoft.iot.vmp.vmanager.bean.AudioBroadcastResult;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import com.genersoft.iot.vmp.vmanager.bean.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -44,7 +41,7 @@
 * @author lin
 */
@Tag(name  = "国标设备点播")
@CrossOrigin
@RestController
@RequestMapping("/api/play")
public class PlayController {
@@ -85,8 +82,8 @@
   @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) {
      // 获取可用的zlm
      Device device = storager.queryVideoDevice(deviceId);
@@ -98,8 +95,8 @@
      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);
      result.onTimeout(()->{
         logger.info("点播接口等待超时");
@@ -110,25 +107,22 @@
         msg.setData(wvpResult);
         resultHolder.invokeResult(msg);
      });
      if (userSetting.getUseSourceIpAsStreamIp()) {
         // TODO 在点播未成功的情况下在此调用接口点播会导致返回的流地址ip错误
         deferredResultEx.setFilter(result1 -> {
            WVPResult<StreamInfo> wvpResult1 = (WVPResult<StreamInfo>)result1;
            WVPResult<StreamInfo> clone = null;
            try {
               clone = (WVPResult<StreamInfo>)wvpResult1.clone();
            } catch (CloneNotSupportedException e) {
               throw new RuntimeException(e);
            }
            if (clone.getCode() == ErrorCode.SUCCESS.getCode()) {
               StreamInfo data = clone.getData().clone();
      // 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());
               clone.setData(data);
            }
            return clone;
         });
      }
            resultStream.setData(new StreamContent(wvpResult1.getData()));
         }
         return resultStream;
      });
      // 录像查询以channelId作为deviceId查询
      resultHolder.put(key, uuid, deferredResultEx);
@@ -255,11 +249,11 @@
   @Parameter(name = "timeout", description = "推流超时时间(秒)", required = true)
   @GetMapping("/broadcast/{deviceId}/{channelId}")
   @PostMapping("/broadcast/{deviceId}/{channelId}")
    public AudioBroadcastResult broadcastApi(@PathVariable String deviceId, @PathVariable String channelId, Integer timeout) {
        if (logger.isDebugEnabled()) {
            logger.debug("语音广播API调用");
        }
        Device device = storager.queryVideoDevice(deviceId);
    public AudioBroadcastResult broadcastApi(@PathVariable String deviceId, @PathVariable String channelId, Integer timeout, Boolean broadcastMode) {
      if (logger.isDebugEnabled()) {
         logger.debug("语音广播API调用");
      }
      Device device = storager.queryVideoDevice(deviceId);
      if (device == null) {
         throw new ControllerException(ErrorCode.ERROR400.getCode(), "未找到设备: " + deviceId);
      }
@@ -267,18 +261,9 @@
         throw new ControllerException(ErrorCode.ERROR400.getCode(), "未找到通道: " + channelId);
      }
      return playService.audioBroadcast(device, channelId);
      return playService.audioBroadcast(device, channelId, broadcastMode);
   }
   @GetMapping("/1111")
   public void broadcastApi1() {
      MediaServerItem defaultMediaServer = mediaServerService.getMediaServerForMinimumLoad();
      Device device = storager.queryVideoDevice("34020000001320090001");
      playService.talk(defaultMediaServer, device, "34020000001370000001", null, null, null);
   }
   @Operation(summary = "停止语音广播")
   @Parameter(name = "deviceId", description = "设备Id", required = true)
@@ -291,7 +276,7 @@
      }
//      try {
//         playService.stopAudioBroadcast(deviceId, channelId);
//      } catch (InvalidArgumentException | ParseException | SsrcTransactionNotFoundException | SipException e) {
//      } catch (InvalidArgumentException | ParseException  | SipException e) {
//         logger.error("[命令发送失败] 停止语音: {}", e.getMessage());
//         throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " +  e.getMessage());
//      }