old mode 100644
new mode 100755
 |  |  | 
 |  |  | import com.genersoft.iot.vmp.conf.DynamicTask; | 
 |  |  | import com.genersoft.iot.vmp.conf.UserSetting; | 
 |  |  | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 
 |  |  | import com.genersoft.iot.vmp.conf.security.JwtUtils; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.SendRtpPortManager; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.ZLMServerFactory; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeFactory; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForRtpServerTimeout; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.dto.HookSubscribeForStreamChange; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.dto.hook.OnRtpServerTimeoutHookParam; | 
 |  |  | import com.genersoft.iot.vmp.service.IMediaServerService; | 
 |  |  | import com.genersoft.iot.vmp.utils.redis.RedisUtil; | 
 |  |  | import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; | 
 |  |  | import com.genersoft.iot.vmp.vmanager.bean.OtherPsSendInfo; | 
 |  |  | 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 okhttp3.OkHttpClient; | 
 |  |  | import okhttp3.Request; | 
 |  |  | 
 |  |  |     private final static Logger logger = LoggerFactory.getLogger(PsController.class); | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ZLMRTPServerFactory zlmServerFactory; | 
 |  |  |     private ZLMServerFactory zlmServerFactory; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ZlmHttpHookSubscribe hookSubscribe; | 
 |  |  | 
 |  |  |  | 
 |  |  |     @GetMapping(value = "/receive/open") | 
 |  |  |     @ResponseBody | 
 |  |  |     @Operation(summary = "开启收流和获取发流信息") | 
 |  |  |     @Operation(summary = "开启收流和获取发流信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |     @Parameter(name = "isSend", description = "是否发送,false时只开启收流, true同时返回推流信息", required = true) | 
 |  |  |     @Parameter(name = "callId", description = "整个过程的唯一标识,为了与后续接口关联", required = true) | 
 |  |  |     @Parameter(name = "ssrc", description = "来源流的SSRC,不传则不校验来源ssrc", required = false) | 
 |  |  | 
 |  |  |         if (isSend != null && isSend && callId == null) { | 
 |  |  |             throw new ControllerException(ErrorCode.ERROR100.getCode(),"isSend为true时,CallID不能为空"); | 
 |  |  |         } | 
 |  |  |         int ssrcInt = 0; | 
 |  |  |         long ssrcInt = 0; | 
 |  |  |         if (ssrc != null) { | 
 |  |  |             try { | 
 |  |  |                 ssrcInt = Integer.parseInt(ssrc); | 
 |  |  |                 ssrcInt = Long.parseLong(ssrc); | 
 |  |  |             }catch (NumberFormatException e) { | 
 |  |  |                 throw new ControllerException(ErrorCode.ERROR100.getCode(),"ssrc格式错误"); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_PS_INFO + userSetting.getServerId() + "_" + callId + "_"  + stream; | 
 |  |  |         int localPort = zlmServerFactory.createRTPServer(mediaServerItem, stream, ssrcInt, null, false, tcpMode); | 
 |  |  |         int localPort = zlmServerFactory.createRTPServer(mediaServerItem, stream, ssrcInt, null, false, false, tcpMode); | 
 |  |  |         if (localPort == 0) { | 
 |  |  |             throw new ControllerException(ErrorCode.ERROR100.getCode(), "获取端口失败"); | 
 |  |  |         } | 
 |  |  | 
 |  |  |             HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(stream, String.valueOf(ssrcInt), mediaServerItem.getId()); | 
 |  |  |             // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 | 
 |  |  |             hookSubscribe.addSubscribe(hookSubscribeForRtpServerTimeout, | 
 |  |  |                     (mediaServerItemInUse, response)->{ | 
 |  |  |                         if (stream.equals(response.getString("stream_id"))) { | 
 |  |  |                     (mediaServerItemInUse, hookParam)->{ | 
 |  |  |                         OnRtpServerTimeoutHookParam serverTimeoutHookParam = (OnRtpServerTimeoutHookParam) hookParam; | 
 |  |  |                         if (stream.equals(serverTimeoutHookParam.getStream_id())) { | 
 |  |  |                             logger.info("[第三方PS服务对接->开启收流和获取发流信息] 等待收流超时 callId->{}, 发送回调", callId); | 
 |  |  |                             // 将信息写入redis中,以备后用 | 
 |  |  |                             redisTemplate.delete(receiveKey); | 
 |  |  | 
 |  |  |  | 
 |  |  |     @GetMapping(value = "/receive/close") | 
 |  |  |     @ResponseBody | 
 |  |  |     @Operation(summary = "关闭收流") | 
 |  |  |     @Operation(summary = "关闭收流", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |     @Parameter(name = "stream", description = "流的ID", required = true) | 
 |  |  |     public void closeRtpServer(String stream) { | 
 |  |  |         logger.info("[第三方PS服务对接->关闭收流] stream->{}", stream); | 
 |  |  | 
 |  |  |         zlmServerFactory.closeRtpServer(mediaServerItem,stream); | 
 |  |  |         String receiveKey = VideoManagerConstants.WVP_OTHER_RECEIVE_PS_INFO + userSetting.getServerId() + "_*_"  + stream; | 
 |  |  |         List<Object> scan = RedisUtil.scan(redisTemplate, receiveKey); | 
 |  |  |         if (scan.size() > 0) { | 
 |  |  |         if (!scan.isEmpty()) { | 
 |  |  |             for (Object key : scan) { | 
 |  |  |                 // 将信息写入redis中,以备后用 | 
 |  |  |                 redisTemplate.delete(key); | 
 |  |  | 
 |  |  |  | 
 |  |  |     @GetMapping(value = "/send/start") | 
 |  |  |     @ResponseBody | 
 |  |  |     @Operation(summary = "发送流") | 
 |  |  |     @Operation(summary = "发送流", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |     @Parameter(name = "ssrc", description = "发送流的SSRC", required = true) | 
 |  |  |     @Parameter(name = "dstIp", description = "目标收流IP", required = true) | 
 |  |  |     @Parameter(name = "dstPort", description = "目标收流端口", required = true) |