old mode 100644
new mode 100755
 |  |  | 
 |  |  | import com.genersoft.iot.vmp.conf.UserSetting; | 
 |  |  | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 
 |  |  | 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 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.tags.Tag; | 
 |  |  | 
 |  |  |     private final static Logger logger = LoggerFactory.getLogger(PsController.class); | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ZLMRTPServerFactory zlmServerFactory; | 
 |  |  |     private ZLMServerFactory zlmServerFactory; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private ZlmHttpHookSubscribe hookSubscribe; | 
 |  |  | 
 |  |  |         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格式错误"); | 
 |  |  |             } | 
 |  |  | 
 |  |  |             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); | 
 |  |  | 
 |  |  |         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); | 
 |  |  | 
 |  |  |                         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); | 
 |  |  |     } | 
 |  |  | } |