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,6 +25,8 @@ public class ZLMRESTfulUtils {
25 25
26 private OkHttpClient client; 26 private OkHttpClient client;
27 27
  28 +
  29 +
28 public interface RequestCallback{ 30 public interface RequestCallback{
29 void run(JSONObject response); 31 void run(JSONObject response);
30 } 32 }
@@ -354,4 +356,11 @@ public class ZLMRESTfulUtils { @@ -354,4 +356,11 @@ public class ZLMRESTfulUtils {
354 param.put("stream_id", stream_id); 356 param.put("stream_id", stream_id);
355 return sendPost(mediaServerItem, "connectRtpServer",param, null); 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,4 +386,19 @@ public class ZLMRTPServerFactory {
386 public void closeAllSendRtpStream() { 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,6 +50,7 @@ public interface IMediaServerService {
50 void closeRTPServer(MediaServerItem mediaServerItem, String streamId); 50 void closeRTPServer(MediaServerItem mediaServerItem, String streamId);
51 51
52 void closeRTPServer(MediaServerItem mediaServerItem, String streamId, CommonCallback<Boolean> callback); 52 void closeRTPServer(MediaServerItem mediaServerItem, String streamId, CommonCallback<Boolean> callback);
  53 + Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc);
53 54
54 void closeRTPServer(String mediaServerId, String streamId); 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,6 +181,11 @@ public class MediaServerServiceImpl implements IMediaServerService {
181 } 181 }
182 182
183 @Override 183 @Override
  184 + public Boolean updateRtpServerSSRC(MediaServerItem mediaServerItem, String streamId, String ssrc) {
  185 + return zlmrtpServerFactory.updateRtpServerSSRC(mediaServerItem, streamId, ssrc);
  186 + }
  187 +
  188 + @Override
184 public void releaseSsrc(String mediaServerItemId, String ssrc) { 189 public void releaseSsrc(String mediaServerItemId, String ssrc) {
185 MediaServerItem mediaServerItem = getOne(mediaServerItemId); 190 MediaServerItem mediaServerItem = getOne(mediaServerItemId);
186 if (mediaServerItem == null || ssrc == null) { 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,7 +143,7 @@ public class PlayServiceImpl implements IPlayService {
143 if (rtpInfo.getBoolean("exist")) { 143 if (rtpInfo.getBoolean("exist")) {
144 int localPort = rtpInfo.getInteger("local_port"); 144 int localPort = rtpInfo.getInteger("local_port");
145 if (localPort == 0) { 145 if (localPort == 0) {
146 - logger.warn("[点播],点播时发现rtpServerC存在,但是尚未开始推流"); 146 + logger.warn("[点播],点播时发现rtpServer存在,但是尚未开始推流");
147 // 此时说明rtpServer已经创建但是流还没有推上来 147 // 此时说明rtpServer已经创建但是流还没有推上来
148 WVPResult wvpResult = new WVPResult(); 148 WVPResult wvpResult = new WVPResult();
149 wvpResult.setCode(ErrorCode.ERROR100.getCode()); 149 wvpResult.setCode(ErrorCode.ERROR100.getCode());
@@ -228,7 +228,7 @@ public class PlayServiceImpl implements IPlayService { @@ -228,7 +228,7 @@ public class PlayServiceImpl implements IPlayService {
228 ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent, 228 ZlmHttpHookSubscribe.Event hookEvent, SipSubscribe.Event errorEvent,
229 InviteTimeOutCallback timeoutCallback) { 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 String timeOutTaskKey = UUID.randomUUID().toString(); 233 String timeOutTaskKey = UUID.randomUUID().toString();
234 dynamicTask.startDelay(timeOutTaskKey, () -> { 234 dynamicTask.startDelay(timeOutTaskKey, () -> {
@@ -352,30 +352,50 @@ public class PlayServiceImpl implements IPlayService { @@ -352,30 +352,50 @@ public class PlayServiceImpl implements IPlayService {
352 hookEvent.response(mediaServerItemInUse, response); 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,7 +539,7 @@ public class PlayServiceImpl implements IPlayService {
519 if (device == null) { 539 if (device == null) {
520 throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备: " + deviceId + "不存在"); 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 PlayBackResult<StreamInfo> playBackResult = new PlayBackResult<>(); 543 PlayBackResult<StreamInfo> playBackResult = new PlayBackResult<>();
524 String playBackTimeOutTaskKey = UUID.randomUUID().toString(); 544 String playBackTimeOutTaskKey = UUID.randomUUID().toString();
525 dynamicTask.startDelay(playBackTimeOutTaskKey, () -> { 545 dynamicTask.startDelay(playBackTimeOutTaskKey, () -> {
@@ -689,7 +709,7 @@ public class PlayServiceImpl implements IPlayService { @@ -689,7 +709,7 @@ public class PlayServiceImpl implements IPlayService {
689 throw new ControllerException(ErrorCode.ERROR400.getCode(), "设备:" + deviceId + "不存在"); 709 throw new ControllerException(ErrorCode.ERROR400.getCode(), "设备:" + deviceId + "不存在");
690 } 710 }
691 PlayBackResult<StreamInfo> downloadResult = new PlayBackResult<>(); 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 String downLoadTimeOutTaskKey = UUID.randomUUID().toString(); 713 String downLoadTimeOutTaskKey = UUID.randomUUID().toString();
694 dynamicTask.startDelay(downLoadTimeOutTaskKey, () -> { 714 dynamicTask.startDelay(downLoadTimeOutTaskKey, () -> {
695 logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId)); 715 logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId));