Commit 2bc284222483d0fb76b861ead4f462421274706d

Authored by 648540858
1 parent 3fe47021

优化国标点播下级平台,ssrc更新的时因为旧的端口释放慢导致点播失败的问题,使用新的接口直接更新ssrc

src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
... ... @@ -25,6 +25,8 @@ public class ZLMRESTfulUtils {
25 25  
26 26 private OkHttpClient client;
27 27  
  28 +
  29 +
28 30 public interface RequestCallback{
29 31 void run(JSONObject response);
30 32 }
... ... @@ -354,4 +356,11 @@ public class ZLMRESTfulUtils {
354 356 param.put("stream_id", stream_id);
355 357 return sendPost(mediaServerItem, "connectRtpServer",param, null);
356 358 }
  359 +
  360 + public JSONObject updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc) {
  361 + Map<String, Object> param = new HashMap<>(1);
  362 + param.put("ssrc", ssrc);
  363 + param.put("stream_id", streamId);
  364 + return sendPost(mediaServerItem, "updateRtpServerSSRC",param, null);
  365 + }
357 366 }
... ...
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
... ... @@ -386,4 +386,19 @@ public class ZLMRTPServerFactory {
386 386 public void closeAllSendRtpStream() {
387 387  
388 388 }
  389 +
  390 + public Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc) {
  391 + boolean result = false;
  392 + JSONObject jsonObject = zlmresTfulUtils.updateRtpServerSSRC(mediaServerItem, streamId, ssrc);
  393 + if (jsonObject == null) {
  394 + logger.error("[更新RTPServer] 失败: 请检查ZLM服务");
  395 + } else if (jsonObject.getInteger("code") == 0) {
  396 + result= true;
  397 + logger.info("[更新RTPServer] 成功");
  398 + } else {
  399 + logger.error("[更新RTPServer] 失败: {}, streamId:{},ssrc:{}->\r\n{}",jsonObject.getString("msg"),
  400 + streamId, ssrc, jsonObject);
  401 + }
  402 + return result;
  403 + }
389 404 }
... ...
src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
... ... @@ -50,6 +50,7 @@ public interface IMediaServerService {
50 50 void closeRTPServer(MediaServerItem mediaServerItem, String streamId);
51 51  
52 52 void closeRTPServer(MediaServerItem mediaServerItem, String streamId, CommonCallback<Boolean> callback);
  53 + Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc);
53 54  
54 55 void closeRTPServer(String mediaServerId, String streamId);
55 56  
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
... ... @@ -181,6 +181,11 @@ public class MediaServerServiceImpl implements IMediaServerService {
181 181 }
182 182  
183 183 @Override
  184 + public Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc) {
  185 + return zlmrtpServerFactory.updateRtpServerSSRC(mediaServerItem, streamId, ssrc);
  186 + }
  187 +
  188 + @Override
184 189 public void releaseSsrc(String mediaServerItemId, String ssrc) {
185 190 MediaServerItem mediaServerItem = getOne(mediaServerItemId);
186 191 if (mediaServerItem == null || ssrc == null) {
... ...
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
... ... @@ -143,7 +143,7 @@ public class PlayServiceImpl implements IPlayService {
143 143 if (rtpInfo.getBoolean("exist")) {
144 144 int localPort = rtpInfo.getInteger("local_port");
145 145 if (localPort == 0) {
146   - logger.warn("[点播],点播时发现rtpServerC存在,但是尚未开始推流");
  146 + logger.warn("[点播],点播时发现rtpServer存在,但是尚未开始推流");
147 147 // 此时说明rtpServer已经创建但是流还没有推上来
148 148 WVPResult wvpResult = new WVPResult();
149 149 wvpResult.setCode(ErrorCode.ERROR100.getCode());
... ... @@ -228,7 +228,7 @@ public class PlayServiceImpl implements IPlayService {
228 228 ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
229 229 InviteTimeOutCallback timeoutCallback) {
230 230  
231   - logger.info("[点播开始] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
  231 + logger.info("[点播开始] deviceId: {}, channelId: {},收流端口:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
232 232 // 超时处理
233 233 String timeOutTaskKey = UUID.randomUUID().toString();
234 234 dynamicTask.startDelay(timeOutTaskKey, () -> {
... ... @@ -352,30 +352,50 @@ public class PlayServiceImpl implements IPlayService {
352 352 hookEvent.response(mediaServerItemInUse, response);
353 353 });
354 354 }
355   - // 关闭rtp server
356   - mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
357   - if (result) {
358   - // 重新开启ssrc server
359   - mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, ssrcInfo.getPort(), true, device.getStreamModeForParam());
360   - }else {
361   - try {
362   - logger.warn("[停止点播] {}/{}", device.getDeviceId(), channelId);
363   - cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null, null);
364   - } catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
365   - logger.error("[命令发送失败] 停止点播, 发送BYE: {}", e.getMessage());
366   - throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
367   - }
368   -
369   - dynamicTask.stop(timeOutTaskKey);
370   - // 释放ssrc
371   - mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
372 355  
373   - streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
374   - event.msg = "下级自定义了ssrc,重新设置收流信息失败";
375   - event.statusCode = 500;
376   - errorEvent.response(event);
  356 + Boolean result = mediaServerService.updateRtpServerSSRC(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse);
  357 + if (!result) {
  358 + try {
  359 + logger.warn("[停止点播] {}/{}", device.getDeviceId(), channelId);
  360 + cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null, null);
  361 + } catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
  362 + logger.error("[命令发送失败] 停止点播, 发送BYE: {}", e.getMessage());
  363 + throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
377 364 }
378   - });
  365 +
  366 + dynamicTask.stop(timeOutTaskKey);
  367 + // 释放ssrc
  368 + mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
  369 +
  370 + streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
  371 + event.msg = "下级自定义了ssrc,重新设置收流信息失败";
  372 + event.statusCode = 500;
  373 + errorEvent.response(event);
  374 + }
  375 +// // 关闭rtp server
  376 +// mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream(), result->{
  377 +// if (result) {
  378 +// // 重新开启ssrc server
  379 +// mediaServerService.openRTPServer(mediaServerItem, ssrcInfo.getStream(), ssrcInResponse, device.isSsrcCheck(), false, ssrcInfo.getPort(), true, device.getStreamModeForParam());
  380 +// }else {
  381 +// try {
  382 +// logger.warn("[停止点播] {}/{}", device.getDeviceId(), channelId);
  383 +// cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null, null);
  384 +// } catch (InvalidArgumentException | SipException | ParseException | SsrcTransactionNotFoundException e) {
  385 +// logger.error("[命令发送失败] 停止点播, 发送BYE: {}", e.getMessage());
  386 +// throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage());
  387 +// }
  388 +//
  389 +// dynamicTask.stop(timeOutTaskKey);
  390 +// // 释放ssrc
  391 +// mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
  392 +//
  393 +// streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream());
  394 +// event.msg = "下级自定义了ssrc,重新设置收流信息失败";
  395 +// event.statusCode = 500;
  396 +// errorEvent.response(event);
  397 +// }
  398 +// });
379 399  
380 400  
381 401 }
... ... @@ -519,7 +539,7 @@ public class PlayServiceImpl implements IPlayService {
519 539 if (device == null) {
520 540 throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备: " + deviceId + "不存在");
521 541 }
522   - logger.info("[回放消息] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
  542 + logger.info("[回放消息] deviceId: {}, channelId: {},收流端口:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
523 543 PlayBackResult<StreamInfo> playBackResult = new PlayBackResult<>();
524 544 String playBackTimeOutTaskKey = UUID.randomUUID().toString();
525 545 dynamicTask.startDelay(playBackTimeOutTaskKey, () -> {
... ... @@ -689,7 +709,7 @@ public class PlayServiceImpl implements IPlayService {
689 709 throw new ControllerException(ErrorCode.ERROR400.getCode(), "设备:" + deviceId + "不存在");
690 710 }
691 711 PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>();
692   - logger.info("[录像下载] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
  712 + logger.info("[录像下载] deviceId: {}, channelId: {},收流端口:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck());
693 713 String downLoadTimeOutTaskKey = UUID.randomUUID().toString();
694 714 dynamicTask.startDelay(downLoadTimeOutTaskKey, () -> {
695 715 logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId));
... ...