648540858
2024-06-11 f8ef14bfea43abd8716aab15f5e302e7c1f23f79
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -9,6 +9,7 @@
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException;
import com.genersoft.iot.vmp.conf.security.JwtUtils;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
@@ -31,10 +32,12 @@
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.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.DeferredResult;
@@ -92,7 +95,7 @@
   @Autowired
   private UserSetting userSetting;
   @Operation(summary = "开始点播")
   @Operation(summary = "开始点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "channelId", description = "通道国标编号", required = true)
   @GetMapping("/start/{deviceId}/{channelId}")
@@ -145,19 +148,26 @@
                  }
                  streamInfo.channgeStreamIp(host);
               }
               if (!ObjectUtils.isEmpty(newMediaServerItem.getTranscodeSuffix()) && !"null".equalsIgnoreCase(newMediaServerItem.getTranscodeSuffix())) {
                  streamInfo.setStream(streamInfo.getStream() + "_" + newMediaServerItem.getTranscodeSuffix());
               }
               wvpResult.setData(new StreamContent(streamInfo));
            }else {
               wvpResult.setCode(code);
               wvpResult.setMsg(msg);
            }
         }else {
            wvpResult.setCode(code);
            wvpResult.setMsg(msg);
         }
         requestMessage.setData(wvpResult);
         resultHolder.invokeResult(requestMessage);
         // 此处必须释放所有请求
         resultHolder.invokeAllResult(requestMessage);
      });
      return result;
   }
   @Operation(summary = "停止点播")
   @Operation(summary = "停止点播", security = @SecurityRequirement(name = JwtUtils.HEADER))
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "channelId", description = "通道国标编号", required = true)
   @Parameter(name = "isSubStream", description = "是否子码流(true-子码流,false-主码流),默认为false", required = true)
@@ -199,52 +209,9 @@
   }
   /**
    * 将不是h264的视频通过ffmpeg 转码为h264 + aac
    * @param streamId 流ID
    */
   @Operation(summary = "将不是h264的视频通过ffmpeg 转码为h264 + aac")
   @Parameter(name = "streamId", description = "视频流ID", required = true)
   @PostMapping("/convert/{streamId}")
   public JSONObject playConvert(@PathVariable String streamId) {
//      StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId);
      InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, streamId);
      if (inviteInfo == null || inviteInfo.getStreamInfo() == null) {
         logger.warn("视频转码API调用失败!, 视频流已经停止!");
         throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到视频流信息, 视频流可能已经停止");
      }
      MediaServerItem mediaInfo = mediaServerService.getOne(inviteInfo.getStreamInfo().getMediaServerId());
      JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaInfo, streamId);
      if (!rtpInfo.getBoolean("exist")) {
         logger.warn("视频转码API调用失败!, 视频流已停止推流!");
         throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到视频流信息, 视频流可能已停止推流");
      } else {
         String dstUrl = String.format("rtmp://%s:%s/convert/%s", "127.0.0.1", mediaInfo.getRtmpPort(),
               streamId );
         String srcUrl = String.format("rtsp://%s:%s/rtp/%s", "127.0.0.1", mediaInfo.getRtspPort(), streamId);
         JSONObject jsonObject = zlmresTfulUtils.addFFmpegSource(mediaInfo, srcUrl, dstUrl, "1000000", true, false, null);
         logger.info(jsonObject.toJSONString());
         if (jsonObject != null && jsonObject.getInteger("code") == 0) {
            JSONObject data = jsonObject.getJSONObject("data");
            if (data != null) {
               JSONObject result = new JSONObject();
               result.put("key", data.getString("key"));
               StreamInfo streamInfoResult = mediaService.getStreamInfoByAppAndStreamWithCheck("convert", streamId, mediaInfo.getId(), false);
               result.put("StreamInfo", streamInfoResult);
               return result;
            }else {
               throw new ControllerException(ErrorCode.ERROR100.getCode(), "转码失败");
            }
         }else {
            throw new ControllerException(ErrorCode.ERROR100.getCode(), "转码失败");
         }
      }
   }
   /**
    * 结束转码
    */
   @Operation(summary = "结束转码")
   @Operation(summary = "结束转码", security = @SecurityRequirement(name = JwtUtils.HEADER))
   @Parameter(name = "key", description = "视频流key", required = true)
   @Parameter(name = "mediaServerId", description = "流媒体服务ID", required = true)
   @PostMapping("/convertStop/{key}")
@@ -269,7 +236,7 @@
      }
   }
   @Operation(summary = "语音广播命令")
   @Operation(summary = "语音广播命令", security = @SecurityRequirement(name = JwtUtils.HEADER))
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "deviceId", description = "通道国标编号", required = true)
   @Parameter(name = "timeout", description = "推流超时时间(秒)", required = true)
@@ -309,7 +276,7 @@
      playService.stopAudioBroadcast(deviceId, channelId);
   }
   @Operation(summary = "获取所有的ssrc")
   @Operation(summary = "获取所有的ssrc", security = @SecurityRequirement(name = JwtUtils.HEADER))
   @GetMapping("/ssrc")
   public JSONObject getSSRC() {
      if (logger.isDebugEnabled()) {
@@ -332,7 +299,7 @@
      return jsonObject;
   }
   @Operation(summary = "获取截图")
   @Operation(summary = "获取截图", security = @SecurityRequirement(name = JwtUtils.HEADER))
   @Parameter(name = "deviceId", description = "设备国标编号", required = true)
   @Parameter(name = "channelId", description = "通道国标编号", required = true)
   @Parameter(name = "isSubStream", description = "是否子码流(true-子码流,false-主码流),默认为false", required = true)