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.ZLMServerFactory; | 
 |  |  | import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe; | 
 |  |  | 
 |  |  | 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 com.genersoft.iot.vmp.vmanager.bean.OtherRtpSendInfo; | 
 |  |  | 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; | 
 |  |  | 
 |  |  |  | 
 |  |  |     @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(), "获取端口失败"); | 
 |  |  |         } | 
 |  |  | 
 |  |  |  | 
 |  |  |     @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); | 
 |  |  | 
 |  |  |  | 
 |  |  |     @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) | 
 |  |  | 
 |  |  |                         callId); | 
 |  |  |         MediaServerItem mediaServerItem = mediaServerService.getDefaultMediaServer(); | 
 |  |  |         String key = VideoManagerConstants.WVP_OTHER_SEND_PS_INFO + userSetting.getServerId() + "_"  + callId; | 
 |  |  |         OtherRtpSendInfo sendInfo = (OtherRtpSendInfo)redisTemplate.opsForValue().get(key); | 
 |  |  |         OtherPsSendInfo sendInfo = (OtherPsSendInfo)redisTemplate.opsForValue().get(key); | 
 |  |  |         if (sendInfo == null) { | 
 |  |  |             sendInfo = new OtherRtpSendInfo(); | 
 |  |  |             sendInfo = new OtherPsSendInfo(); | 
 |  |  |         } | 
 |  |  |         sendInfo.setPushApp(app); | 
 |  |  |         sendInfo.setPushStream(stream); | 
 |  |  | 
 |  |  |         param.put("dst_port", dstPort); | 
 |  |  |         String is_Udp = isUdp ? "1" : "0"; | 
 |  |  |         param.put("is_udp", is_Udp); | 
 |  |  |         param.put("src_port", sendInfo.getSendLocalPortForAudio()); | 
 |  |  |         param.put("use_ps", "0"); | 
 |  |  |         param.put("only_audio", "1"); | 
 |  |  |         param.put("src_port", sendInfo.getSendLocalPort()); | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         Boolean streamReady = zlmServerFactory.isStreamReady(mediaServerItem, app, stream); | 
 |  |  | 
 |  |  |             }, 10000); | 
 |  |  |  | 
 |  |  |             // 订阅 zlm启动事件, 新的zlm也会从这里进入系统 | 
 |  |  |             OtherRtpSendInfo finalSendInfo = sendInfo; | 
 |  |  |             OtherPsSendInfo finalSendInfo = sendInfo; | 
 |  |  |             hookSubscribe.removeSubscribe(hookSubscribeForStreamChange); | 
 |  |  |             hookSubscribe.addSubscribe(hookSubscribeForStreamChange, | 
 |  |  |                     (mediaServerItemInUse, response)->{ | 
 |  |  | 
 |  |  |     public void closeSendRTP(String callId) { | 
 |  |  |         logger.info("[第三方PS服务对接->关闭发送流] callId->{}", callId); | 
 |  |  |         String key = VideoManagerConstants.WVP_OTHER_SEND_PS_INFO + userSetting.getServerId() + "_"  + callId; | 
 |  |  |         OtherRtpSendInfo sendInfo = (OtherRtpSendInfo)redisTemplate.opsForValue().get(key); | 
 |  |  |         OtherPsSendInfo sendInfo = (OtherPsSendInfo)redisTemplate.opsForValue().get(key); | 
 |  |  |         if (sendInfo == null){ | 
 |  |  |             throw new ControllerException(ErrorCode.ERROR100.getCode(), "未开启发流"); | 
 |  |  |         } | 
 |  |  | 
 |  |  |         redisTemplate.delete(key); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @GetMapping(value = "/getTestPort") | 
 |  |  |     @ResponseBody | 
 |  |  |     public int getTestPort() { | 
 |  |  |         MediaServerItem defaultMediaServer = mediaServerService.getDefaultMediaServer(); | 
 |  |  |  | 
 |  |  | //        for (int i = 0; i <300; i++) { | 
 |  |  | //            new Thread(() -> { | 
 |  |  | //                int nextPort = sendRtpPortManager.getNextPort(defaultMediaServer); | 
 |  |  | //                try { | 
 |  |  | //                    Thread.sleep((int)Math.random()*10); | 
 |  |  | //                } catch (InterruptedException e) { | 
 |  |  | //                    throw new RuntimeException(e); | 
 |  |  | //                } | 
 |  |  | //                System.out.println(nextPort); | 
 |  |  | //            }).start(); | 
 |  |  | //        } | 
 |  |  |  | 
 |  |  |         return sendRtpPortManager.getNextPort(defaultMediaServer); | 
 |  |  |     } | 
 |  |  | } |