Commit 2bc284222483d0fb76b861ead4f462421274706d
1 parent
3fe47021
优化国标点播下级平台,ssrc更新的时因为旧的端口释放慢导致点播失败的问题,使用新的接口直接更新ssrc
Showing
5 changed files
with
76 additions
and
26 deletions
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)); | ... | ... |