Commit 155838ce2eca9dbdde3ca0b2a5d4e72ab603e54d
1 parent
f4e5e039
优化子码流切换逻辑,去除主子多开逻辑。优化单端口模式ssrc变化导致的无法移出点播缓存 #895
Showing
20 changed files
with
165 additions
and
624 deletions
src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java
| ... | ... | @@ -29,7 +29,7 @@ public class InviteInfo { |
| 29 | 29 | private StreamInfo streamInfo; |
| 30 | 30 | |
| 31 | 31 | |
| 32 | - public static InviteInfo getinviteInfo(String deviceId, String channelId, String stream, SSRCInfo ssrcInfo, | |
| 32 | + public static InviteInfo getInviteInfo(String deviceId, String channelId, String stream, SSRCInfo ssrcInfo, | |
| 33 | 33 | String receiveIp, Integer receivePort, String streamMode, |
| 34 | 34 | InviteSessionType type, InviteSessionStatus status) { |
| 35 | 35 | InviteInfo inviteInfo = new InviteInfo(); |
| ... | ... | @@ -138,25 +138,6 @@ public class InviteInfo { |
| 138 | 138 | this.subStream = subStream; |
| 139 | 139 | } |
| 140 | 140 | |
| 141 | - public static InviteInfo getInviteInfo(String deviceId, String channelId,Boolean isSubStream, String stream, SSRCInfo ssrcInfo, | |
| 142 | - String receiveIp, Integer receivePort, String streamMode, | |
| 143 | - InviteSessionType type, InviteSessionStatus status) { | |
| 144 | - InviteInfo inviteInfo = new InviteInfo(); | |
| 145 | - inviteInfo.setDeviceId(deviceId); | |
| 146 | - inviteInfo.setChannelId(channelId); | |
| 147 | - inviteInfo.setStream(stream); | |
| 148 | - inviteInfo.setSsrcInfo(ssrcInfo); | |
| 149 | - inviteInfo.setReceiveIp(receiveIp); | |
| 150 | - inviteInfo.setReceivePort(receivePort); | |
| 151 | - inviteInfo.setStreamMode(streamMode); | |
| 152 | - inviteInfo.setType(type); | |
| 153 | - inviteInfo.setStatus(status); | |
| 154 | - if(isSubStream != null){ | |
| 155 | - inviteInfo.setSubStream(isSubStream); | |
| 156 | - } | |
| 157 | - return inviteInfo; | |
| 158 | - } | |
| 159 | - /*=========================设备主子码流逻辑END====================*/ | |
| 160 | 141 | |
| 161 | 142 | |
| 162 | 143 | ... | ... |
src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
| ... | ... | @@ -542,17 +542,5 @@ public class StreamInfo implements Serializable, Cloneable{ |
| 542 | 542 | this.subStream = subStream; |
| 543 | 543 | } |
| 544 | 544 | |
| 545 | - public static String getPlayStream(String deviceId,String channelId,boolean isSubStream){ | |
| 546 | - String streamId; | |
| 547 | - if(isSubStream){ | |
| 548 | - streamId = String.format("%s_%s_%s","sub",deviceId, channelId); | |
| 549 | - }else { | |
| 550 | - streamId = String.format("%s_%s_%s","main", deviceId, channelId); | |
| 551 | - } | |
| 552 | - return streamId; | |
| 553 | - } | |
| 554 | - | |
| 555 | - /*=========================设备主子码流逻辑END====================*/ | |
| 556 | - | |
| 557 | 545 | |
| 558 | 546 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
| ... | ... | @@ -45,7 +45,6 @@ public class DynamicTask { |
| 45 | 45 | * @return |
| 46 | 46 | */ |
| 47 | 47 | public void startCron(String key, Runnable task, int cycleForCatalog) { |
| 48 | - System.out.println(cycleForCatalog); | |
| 49 | 48 | ScheduledFuture<?> future = futureMap.get(key); |
| 50 | 49 | if (future != null) { |
| 51 | 50 | if (future.isCancelled()) { | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
| ... | ... | @@ -156,29 +156,5 @@ public class DeferredResultHolder { |
| 156 | 156 | } |
| 157 | 157 | } |
| 158 | 158 | |
| 159 | - /*============================设备主子码流逻辑START========================*/ | |
| 160 | - public static String getPlayKey(String deviceId,String channelId,boolean deviceSwitchSubStream,boolean isSubStream){ | |
| 161 | - String key = null; | |
| 162 | - if(deviceSwitchSubStream){ | |
| 163 | - key = CALLBACK_CMD_PLAY + isSubStream + deviceId + channelId; | |
| 164 | - }else { | |
| 165 | - key = CALLBACK_CMD_PLAY +deviceId + channelId; | |
| 166 | - } | |
| 167 | - return key; | |
| 168 | - } | |
| 169 | - | |
| 170 | - public static String getSnapKey(String deviceId,String channelId,boolean deviceSwitchSubStream,boolean isSubStream){ | |
| 171 | - String key = null; | |
| 172 | - if(deviceSwitchSubStream){ | |
| 173 | - key = CALLBACK_CMD_SNAP + isSubStream + deviceId + channelId; | |
| 174 | - }else { | |
| 175 | - key = CALLBACK_CMD_SNAP +deviceId + channelId; | |
| 176 | - } | |
| 177 | - return key; | |
| 178 | - } | |
| 179 | - | |
| 180 | - | |
| 181 | - /*============================设备主子码流逻辑END========================*/ | |
| 182 | - | |
| 183 | 159 | |
| 184 | 160 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
| ... | ... | @@ -98,7 +98,7 @@ public interface ISIPCommander { |
| 98 | 98 | * @param device 视频设备 |
| 99 | 99 | * @param channelId 预览通道 |
| 100 | 100 | */ |
| 101 | - void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | |
| 101 | + void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException; | |
| 102 | 102 | |
| 103 | 103 | /** |
| 104 | 104 | * 请求回放视频流 | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| ... | ... | @@ -268,7 +268,7 @@ public class SIPCommander implements ISIPCommander { |
| 268 | 268 | * @param errorEvent sip错误订阅 |
| 269 | 269 | */ |
| 270 | 270 | @Override |
| 271 | - public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream, | |
| 271 | + public void playStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | |
| 272 | 272 | ZlmHttpHookSubscribe.Event event, SipSubscribe.Event okEvent, SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException { |
| 273 | 273 | String stream = ssrcInfo.getStream(); |
| 274 | 274 | |
| ... | ... | @@ -345,13 +345,13 @@ public class SIPCommander implements ISIPCommander { |
| 345 | 345 | |
| 346 | 346 | if( device.isSwitchPrimarySubStream() ){ |
| 347 | 347 | if("TP-LINK".equals(device.getManufacturer())){ |
| 348 | - if (isSubStream){ | |
| 348 | + if (device.isSwitchPrimarySubStream()){ | |
| 349 | 349 | content.append("a=streamMode:sub\r\n"); |
| 350 | 350 | }else { |
| 351 | 351 | content.append("a=streamMode:main\r\n"); |
| 352 | 352 | } |
| 353 | 353 | }else { |
| 354 | - if (isSubStream){ | |
| 354 | + if (device.isSwitchPrimarySubStream()){ | |
| 355 | 355 | content.append("a=streamprofile:1\r\n"); |
| 356 | 356 | }else { |
| 357 | 357 | content.append("a=streamprofile:0\r\n"); |
| ... | ... | @@ -374,11 +374,8 @@ public class SIPCommander implements ISIPCommander { |
| 374 | 374 | // 这里为例避免一个通道的点播只有一个callID这个参数使用一个固定值 |
| 375 | 375 | ResponseEvent responseEvent = (ResponseEvent) e.event; |
| 376 | 376 | SIPResponse response = (SIPResponse) responseEvent.getResponse(); |
| 377 | - if(device.isSwitchPrimarySubStream()){ | |
| 378 | - streamSession.put(device.getDeviceId(), channelId, "switch-play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, InviteSessionType.PLAY); | |
| 379 | - }else { | |
| 380 | - streamSession.put(device.getDeviceId(), channelId, "play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, InviteSessionType.PLAY); | |
| 381 | - } | |
| 377 | + streamSession.put(device.getDeviceId(), channelId, "play", stream, ssrcInfo.getSsrc(), mediaServerItem.getId(), response, | |
| 378 | + InviteSessionType.PLAY); | |
| 382 | 379 | okEvent.response(e); |
| 383 | 380 | }); |
| 384 | 381 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/ByeRequestProcessor.java
| ... | ... | @@ -142,13 +142,8 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In |
| 142 | 142 | // 可能是设备主动停止 |
| 143 | 143 | Device device = storager.queryVideoDeviceByChannelId(platformGbId); |
| 144 | 144 | if (device != null) { |
| 145 | - SsrcTransaction ssrcTransactionForPlay = null; | |
| 146 | - if (device.isSwitchPrimarySubStream() ) { | |
| 147 | - ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "switch-play", null); | |
| 148 | - } else { | |
| 149 | - storager.stopPlay(device.getDeviceId(), channelId); | |
| 150 | - ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null); | |
| 151 | - } | |
| 145 | + storager.stopPlay(device.getDeviceId(), channelId); | |
| 146 | + SsrcTransaction ssrcTransactionForPlay = streamSession.getSsrcTransaction(device.getDeviceId(), channelId, "play", null); | |
| 152 | 147 | if (ssrcTransactionForPlay != null){ |
| 153 | 148 | if (ssrcTransactionForPlay.getCallId().equals(callIdHeader.getCallId())){ |
| 154 | 149 | // 释放ssrc |
| ... | ... | @@ -158,16 +153,8 @@ public class ByeRequestProcessor extends SIPRequestProcessorParent implements In |
| 158 | 153 | } |
| 159 | 154 | streamSession.remove(device.getDeviceId(), channelId, ssrcTransactionForPlay.getStream()); |
| 160 | 155 | } |
| 161 | - InviteInfo inviteInfo = null; | |
| 162 | - if (device.isSwitchPrimarySubStream() ) { | |
| 163 | - String streamType = ssrcTransactionForPlay.getStream().split("_")[0]; | |
| 164 | - boolean isSubStream = "sub".equals(streamType); | |
| 165 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream); | |
| 166 | - inviteStreamService.removeInviteInfo(inviteInfo.getType(),inviteInfo.getDeviceId(),inviteInfo.getChannelId(),isSubStream,inviteInfo.getStream()); | |
| 167 | - }else { | |
| 168 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 169 | - inviteStreamService.removeInviteInfo(inviteInfo); | |
| 170 | - } | |
| 156 | + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 157 | + inviteStreamService.removeInviteInfo(inviteInfo); | |
| 171 | 158 | if (inviteInfo != null) { |
| 172 | 159 | if (inviteInfo.getStreamInfo() != null) { |
| 173 | 160 | mediaServerService.closeRTPServer(inviteInfo.getStreamInfo().getMediaServerId(), inviteInfo.getStream()); | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| ... | ... | @@ -490,7 +490,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 490 | 490 | } |
| 491 | 491 | sendRtpItem.setStreamId(streamId); |
| 492 | 492 | redisCatchStorage.updateSendRTPSever(sendRtpItem); |
| 493 | - playService.play(mediaServerItem, device.getDeviceId(), channelId,false, ((code, msg, data) -> { | |
| 493 | + playService.play(mediaServerItem, device.getDeviceId(), channelId, ((code, msg, data) -> { | |
| 494 | 494 | if (code == InviteErrorCode.SUCCESS.getCode()){ |
| 495 | 495 | hookEvent.run(code, msg, data); |
| 496 | 496 | }else if (code == InviteErrorCode.ERROR_FOR_SIGNALLING_TIMEOUT.getCode() || code == InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode()){ | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestForCatalogProcessor.java
| ... | ... | @@ -252,7 +252,6 @@ public class NotifyRequestForCatalogProcessor extends SIPRequestProcessorParent |
| 252 | 252 | } |
| 253 | 253 | |
| 254 | 254 | private void executeSave(){ |
| 255 | - System.out.println("定时存储数据"); | |
| 256 | 255 | executeSaveForUpdate(); |
| 257 | 256 | executeSaveForDelete(); |
| 258 | 257 | executeSaveForOnline(); | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/utils/SipUtils.java
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
| ... | ... | @@ -343,19 +343,10 @@ public class ZLMHttpHookListener { |
| 343 | 343 | } |
| 344 | 344 | |
| 345 | 345 | if ("rtp".equals(param.getApp()) && !param.isRegist()) { |
| 346 | - if(param.getStream().split("_").length == 3){ | |
| 347 | - boolean isSubStream = "sub".equals(param.getStream().split("_")[0]); | |
| 348 | - InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, param.getStream(), isSubStream); | |
| 349 | - if(inviteInfo != null && (inviteInfo.getType() == InviteSessionType.PLAY )){ | |
| 350 | - inviteStreamService.removeInviteInfo(inviteInfo.getType(),inviteInfo.getDeviceId(), | |
| 351 | - inviteInfo.getChannelId(),inviteInfo.isSubStream(),inviteInfo.getStream()); | |
| 352 | - } | |
| 353 | - }else { | |
| 354 | - InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, param.getStream()); | |
| 355 | - if (inviteInfo != null && (inviteInfo.getType() == InviteSessionType.PLAY || inviteInfo.getType() == InviteSessionType.PLAYBACK)) { | |
| 356 | - inviteStreamService.removeInviteInfo(inviteInfo); | |
| 357 | - storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId()); | |
| 358 | - } | |
| 346 | + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByStream(null, param.getStream()); | |
| 347 | + if (inviteInfo != null && (inviteInfo.getType() == InviteSessionType.PLAY || inviteInfo.getType() == InviteSessionType.PLAYBACK)) { | |
| 348 | + inviteStreamService.removeInviteInfo(inviteInfo); | |
| 349 | + storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId()); | |
| 359 | 350 | } |
| 360 | 351 | } else { |
| 361 | 352 | if (!"rtp".equals(param.getApp())) { |
| ... | ... | @@ -483,15 +474,8 @@ public class ZLMHttpHookListener { |
| 483 | 474 | Device device = deviceService.getDevice(inviteInfo.getDeviceId()); |
| 484 | 475 | if (device != null) { |
| 485 | 476 | try { |
| 486 | - InviteInfo info = null; | |
| 487 | - if(device.isSwitchPrimarySubStream()){ | |
| 488 | - boolean isSubStream = "sub".equals(param.getStream().split("_")[0]); | |
| 489 | - info = inviteStreamService.getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), inviteInfo.getChannelId(),isSubStream, inviteInfo.getStream()); | |
| 490 | - }else { | |
| 491 | - info = inviteStreamService.getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream()); | |
| 492 | - | |
| 493 | - } | |
| 494 | - | |
| 477 | + InviteInfo info = inviteStreamService.getInviteInfo(inviteInfo.getType(), | |
| 478 | + inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream()); | |
| 495 | 479 | if (info != null) { |
| 496 | 480 | cmder.streamByeCmd(device, inviteInfo.getChannelId(), |
| 497 | 481 | inviteInfo.getStream(), null); |
| ... | ... | @@ -502,15 +486,9 @@ public class ZLMHttpHookListener { |
| 502 | 486 | } |
| 503 | 487 | } |
| 504 | 488 | |
| 505 | - if(device.isSwitchPrimarySubStream()){ | |
| 506 | - boolean isSubStream = "sub".equals(param.getStream().split("_")[0]); | |
| 507 | - inviteStreamService.removeInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), | |
| 508 | - inviteInfo.getChannelId(),isSubStream, inviteInfo.getStream()); | |
| 509 | - }else { | |
| 510 | - inviteStreamService.removeInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), | |
| 511 | - inviteInfo.getChannelId(), inviteInfo.getStream()); | |
| 512 | - storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId()); | |
| 513 | - } | |
| 489 | + inviteStreamService.removeInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), | |
| 490 | + inviteInfo.getChannelId(), inviteInfo.getStream()); | |
| 491 | + storager.stopPlay(inviteInfo.getDeviceId(), inviteInfo.getChannelId()); | |
| 514 | 492 | return ret; |
| 515 | 493 | } |
| 516 | 494 | } else { |
| ... | ... | @@ -563,26 +541,12 @@ public class ZLMHttpHookListener { |
| 563 | 541 | |
| 564 | 542 | if ("rtp".equals(param.getApp())) { |
| 565 | 543 | String[] s = param.getStream().split("_"); |
| 566 | - if (!mediaInfo.isRtpEnable() ) { | |
| 544 | + if (!mediaInfo.isRtpEnable() || s.length != 2) { | |
| 567 | 545 | defaultResult.setResult(HookResult.SUCCESS()); |
| 568 | 546 | return defaultResult; |
| 569 | - }else if(s.length != 2 && s.length != 3 ){ | |
| 570 | - defaultResult.setResult(HookResult.SUCCESS()); | |
| 571 | - return defaultResult; | |
| 572 | - } | |
| 573 | - String deviceId = null; | |
| 574 | - String channelId = null; | |
| 575 | - boolean isSubStream = false; | |
| 576 | - if (s[0].length() < 20) { | |
| 577 | - if ("sub".equals(s[0])) { | |
| 578 | - isSubStream = true; | |
| 579 | - } | |
| 580 | - deviceId = s[1]; | |
| 581 | - channelId = s[2]; | |
| 582 | - } else { | |
| 583 | - deviceId = s[0]; | |
| 584 | - channelId = s[1]; | |
| 585 | 547 | } |
| 548 | + String deviceId = s[0]; | |
| 549 | + String channelId = s[1]; | |
| 586 | 550 | Device device = redisCatchStorage.getDevice(deviceId); |
| 587 | 551 | if (device == null) { |
| 588 | 552 | defaultResult.setResult(new HookResult(ErrorCode.ERROR404.getCode(), ErrorCode.ERROR404.getMsg())); |
| ... | ... | @@ -596,7 +560,7 @@ public class ZLMHttpHookListener { |
| 596 | 560 | logger.info("[ZLM HOOK] 流未找到, 发起自动点播:{}->{}->{}/{}", param.getMediaServerId(), param.getSchema(), param.getApp(), param.getStream()); |
| 597 | 561 | |
| 598 | 562 | RequestMessage msg = new RequestMessage(); |
| 599 | - String key = DeferredResultHolder.getPlayKey(deviceId, channelId, device.isSwitchPrimarySubStream(), isSubStream); | |
| 563 | + String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId; | |
| 600 | 564 | boolean exist = resultHolder.exist(key, null); |
| 601 | 565 | msg.setKey(key); |
| 602 | 566 | String uuid = UUID.randomUUID().toString(); |
| ... | ... | @@ -614,7 +578,7 @@ public class ZLMHttpHookListener { |
| 614 | 578 | resultHolder.put(key, uuid, result); |
| 615 | 579 | |
| 616 | 580 | if (!exist) { |
| 617 | - playService.play(mediaInfo, deviceId, channelId,isSubStream, (code, message, data) -> { | |
| 581 | + playService.play(mediaInfo, deviceId, channelId, (code, message, data) -> { | |
| 618 | 582 | msg.setData(new HookResult(code, message)); |
| 619 | 583 | resultHolder.invokeResult(msg); |
| 620 | 584 | }); | ... | ... |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRESTfulUtils.java
| ... | ... | @@ -270,11 +270,6 @@ public class ZLMRESTfulUtils { |
| 270 | 270 | } |
| 271 | 271 | |
| 272 | 272 | public JSONObject openRtpServer(MediaServerItem mediaServerItem, Map<String, Object> param){ |
| 273 | - System.out.println("==============openRtpServer================="); | |
| 274 | - for (String s : param.keySet()) { | |
| 275 | - System.out.println(s + "-->" + param.get(s)); | |
| 276 | - } | |
| 277 | - System.out.println("==============================="); | |
| 278 | 273 | return sendPost(mediaServerItem, "openRtpServer",param, null); |
| 279 | 274 | } |
| 280 | 275 | ... | ... |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
| ... | ... | @@ -227,7 +227,6 @@ public class ZLMRTPServerFactory { |
| 227 | 227 | int localPort = 0; |
| 228 | 228 | if (userSetting.getGbSendStreamStrict()) { |
| 229 | 229 | if (userSetting.getGbSendStreamStrict()) { |
| 230 | - System.out.println("createSendRtpItem1"); | |
| 231 | 230 | localPort = keepPort(serverItem, ssrc, localPort); |
| 232 | 231 | if (localPort == 0) { |
| 233 | 232 | return null; |
| ... | ... | @@ -264,7 +263,6 @@ public class ZLMRTPServerFactory { |
| 264 | 263 | // 默认为随机端口 |
| 265 | 264 | int localPort = 0; |
| 266 | 265 | if (userSetting.getGbSendStreamStrict()) { |
| 267 | - System.out.println("createSendRtpItem2"); | |
| 268 | 266 | localPort = keepPort(serverItem, ssrc, localPort); |
| 269 | 267 | if (localPort == 0) { |
| 270 | 268 | return null; |
| ... | ... | @@ -294,9 +292,7 @@ public class ZLMRTPServerFactory { |
| 294 | 292 | param.put("port", localPort); |
| 295 | 293 | param.put("enable_tcp", 1); |
| 296 | 294 | param.put("stream_id", ssrc); |
| 297 | - System.out.println("用于收流"); | |
| 298 | 295 | JSONObject jsonObject = zlmresTfulUtils.openRtpServer(serverItem, param); |
| 299 | - System.out.println(jsonObject); | |
| 300 | 296 | if (jsonObject.getInteger("code") == 0) { |
| 301 | 297 | localPort = jsonObject.getInteger("port"); |
| 302 | 298 | HookSubscribeForRtpServerTimeout hookSubscribeForRtpServerTimeout = HookSubscribeFactory.on_rtp_server_timeout(ssrc, null, serverItem.getId()); | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/IInviteStreamService.java
| ... | ... | @@ -4,8 +4,6 @@ import com.genersoft.iot.vmp.common.InviteInfo; |
| 4 | 4 | import com.genersoft.iot.vmp.common.InviteSessionType; |
| 5 | 5 | import com.genersoft.iot.vmp.service.bean.ErrorCallback; |
| 6 | 6 | |
| 7 | -import java.util.List; | |
| 8 | - | |
| 9 | 7 | /** |
| 10 | 8 | * 记录国标点播的状态,包括实时预览,下载,录像回放 |
| 11 | 9 | */ |
| ... | ... | @@ -16,6 +14,8 @@ public interface IInviteStreamService { |
| 16 | 14 | */ |
| 17 | 15 | void updateInviteInfo(InviteInfo inviteInfo); |
| 18 | 16 | |
| 17 | + InviteInfo updateInviteInfoForStream(InviteInfo inviteInfo, String stream); | |
| 18 | + | |
| 19 | 19 | /** |
| 20 | 20 | * 获取点播的状态信息 |
| 21 | 21 | */ |
| ... | ... | @@ -74,48 +74,5 @@ public interface IInviteStreamService { |
| 74 | 74 | int getStreamInfoCount(String mediaServerId); |
| 75 | 75 | |
| 76 | 76 | |
| 77 | - /*======================设备主子码流逻辑START=========================*/ | |
| 78 | - /** | |
| 79 | - * 获取点播的状态信息 | |
| 80 | - */ | |
| 81 | - InviteInfo getInviteInfoByDeviceAndChannel(InviteSessionType type, | |
| 82 | - String deviceId, | |
| 83 | - String channelId,boolean isSubStream); | |
| 84 | - | |
| 85 | - void removeInviteInfoByDeviceAndChannel(InviteSessionType inviteSessionType, String deviceId, String channelId,boolean isSubStream); | |
| 86 | - | |
| 87 | - InviteInfo getInviteInfo(InviteSessionType type, | |
| 88 | - String deviceId, | |
| 89 | - String channelId, | |
| 90 | - boolean isSubStream, | |
| 91 | - String stream); | |
| 92 | - | |
| 93 | - void removeInviteInfo(InviteSessionType type, | |
| 94 | - String deviceId, | |
| 95 | - String channelId, | |
| 96 | - boolean isSubStream, | |
| 97 | - String stream); | |
| 98 | - | |
| 99 | - void once(InviteSessionType type, String deviceId, String channelId,boolean isSubStream, String stream, ErrorCallback<Object> callback); | |
| 100 | - | |
| 101 | - void call(InviteSessionType type, String deviceId, String channelId,boolean isSubStream, String stream, int code, String msg, Object data); | |
| 102 | - | |
| 103 | - void updateInviteInfoSub(InviteInfo inviteInfo); | |
| 104 | - | |
| 105 | - /** | |
| 106 | - * 获取点播的状态信息 | |
| 107 | - */ | |
| 108 | - InviteInfo getInviteInfoByStream(InviteSessionType type, String stream,boolean isSubStream); | |
| 109 | - | |
| 110 | - /** | |
| 111 | - * 获取点播的状态信息 | |
| 112 | - */ | |
| 113 | - List<Object> getInviteInfos(InviteSessionType type, | |
| 114 | - String deviceId, | |
| 115 | - String channelId, | |
| 116 | - String stream); | |
| 117 | - /*======================设备主子码流逻辑END=========================*/ | |
| 118 | - | |
| 119 | - | |
| 120 | 77 | |
| 121 | 78 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/IPlayService.java
| ... | ... | @@ -16,9 +16,9 @@ import java.text.ParseException; |
| 16 | 16 | */ |
| 17 | 17 | public interface IPlayService { |
| 18 | 18 | |
| 19 | - void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream, | |
| 19 | + void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | |
| 20 | 20 | ErrorCallback<Object> callback); |
| 21 | - SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId,boolean isSubStream, ErrorCallback<Object> callback); | |
| 21 | + SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, ErrorCallback<Object> callback); | |
| 22 | 22 | |
| 23 | 23 | MediaServerItem getNewMediaServerItem(Device device); |
| 24 | 24 | |
| ... | ... | @@ -43,5 +43,5 @@ public interface IPlayService { |
| 43 | 43 | |
| 44 | 44 | void resumeRtp(String streamId) throws ServiceException, InvalidArgumentException, ParseException, SipException; |
| 45 | 45 | |
| 46 | - void getSnap(String deviceId, String channelId, String fileName,boolean isSubStream, ErrorCallback errorCallback); | |
| 46 | + void getSnap(String deviceId, String channelId, String fileName, ErrorCallback errorCallback); | |
| 47 | 47 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/InviteStreamServiceImpl.java
| ... | ... | @@ -85,6 +85,24 @@ public class InviteStreamServiceImpl implements IInviteStreamService { |
| 85 | 85 | } |
| 86 | 86 | |
| 87 | 87 | @Override |
| 88 | + public InviteInfo updateInviteInfoForStream(InviteInfo inviteInfo, String stream) { | |
| 89 | + | |
| 90 | + InviteInfo inviteInfoInDb = getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream()); | |
| 91 | + if (inviteInfoInDb == null) { | |
| 92 | + return null; | |
| 93 | + } | |
| 94 | + removeInviteInfo(inviteInfoInDb); | |
| 95 | + String key = VideoManagerConstants.INVITE_PREFIX + | |
| 96 | + "_" + inviteInfo.getType() + | |
| 97 | + "_" + inviteInfo.getDeviceId() + | |
| 98 | + "_" + inviteInfo.getChannelId() + | |
| 99 | + "_" + stream; | |
| 100 | + inviteInfoInDb.setStream(stream); | |
| 101 | + redisTemplate.opsForValue().set(key, inviteInfoInDb); | |
| 102 | + return inviteInfoInDb; | |
| 103 | + } | |
| 104 | + | |
| 105 | + @Override | |
| 88 | 106 | public InviteInfo getInviteInfo(InviteSessionType type, String deviceId, String channelId, String stream) { |
| 89 | 107 | String key = VideoManagerConstants.INVITE_PREFIX + |
| 90 | 108 | "_" + (type != null ? type : "*") + |
| ... | ... | @@ -152,19 +170,6 @@ public class InviteStreamServiceImpl implements IInviteStreamService { |
| 152 | 170 | |
| 153 | 171 | } |
| 154 | 172 | |
| 155 | - @Override | |
| 156 | - public void call(InviteSessionType type, String deviceId, String channelId, String stream, int code, String msg, Object data) { | |
| 157 | - String key = buildKey(type, deviceId, channelId, stream); | |
| 158 | - List<ErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key); | |
| 159 | - if (callbacks == null) { | |
| 160 | - return; | |
| 161 | - } | |
| 162 | - for (ErrorCallback<Object> callback : callbacks) { | |
| 163 | - callback.run(code, msg, data); | |
| 164 | - } | |
| 165 | - inviteErrorCallbackMap.remove(key); | |
| 166 | - } | |
| 167 | - | |
| 168 | 173 | private String buildKey(InviteSessionType type, String deviceId, String channelId, String stream) { |
| 169 | 174 | String key = type + "_" + deviceId + "_" + channelId; |
| 170 | 175 | // 如果ssrc未null那么可以实现一个通道只能一次操作,ssrc不为null则可以支持一个通道多次invite |
| ... | ... | @@ -199,69 +204,9 @@ public class InviteStreamServiceImpl implements IInviteStreamService { |
| 199 | 204 | return count; |
| 200 | 205 | } |
| 201 | 206 | |
| 202 | - /*======================设备主子码流逻辑START=========================*/ | |
| 203 | - | |
| 204 | - @Override | |
| 205 | - public InviteInfo getInviteInfoByDeviceAndChannel(InviteSessionType type, String deviceId, String channelId, boolean isSubStream) { | |
| 206 | - return getInviteInfo(type, deviceId, channelId,isSubStream, null); | |
| 207 | - } | |
| 208 | - | |
| 209 | - @Override | |
| 210 | - public void removeInviteInfoByDeviceAndChannel(InviteSessionType inviteSessionType, String deviceId, String channelId, boolean isSubStream) { | |
| 211 | - removeInviteInfo(inviteSessionType, deviceId, channelId,isSubStream, null); | |
| 212 | - } | |
| 213 | - | |
| 214 | - @Override | |
| 215 | - public InviteInfo getInviteInfo(InviteSessionType type, String deviceId, String channelId,boolean isSubStream, String stream) { | |
| 216 | - String key = VideoManagerConstants.INVITE_PREFIX + | |
| 217 | - "_" + (type != null ? type : "*") + | |
| 218 | - "_" + (isSubStream ? "sub" : "main") + | |
| 219 | - "_" + (deviceId != null ? deviceId : "*") + | |
| 220 | - "_" + (channelId != null ? channelId : "*") + | |
| 221 | - "_" + (stream != null ? stream : "*"); | |
| 222 | - List<Object> scanResult = RedisUtil.scan(redisTemplate, key); | |
| 223 | - if (scanResult.size() != 1) { | |
| 224 | - return null; | |
| 225 | - } | |
| 226 | - return (InviteInfo) redisTemplate.opsForValue().get(scanResult.get(0)); | |
| 227 | - } | |
| 228 | - | |
| 229 | 207 | @Override |
| 230 | - public void removeInviteInfo(InviteSessionType type, String deviceId, String channelId, boolean isSubStream, String stream) { | |
| 231 | - String scanKey = VideoManagerConstants.INVITE_PREFIX + | |
| 232 | - "_" + (type != null ? type : "*") + | |
| 233 | - "_" + (isSubStream ? "sub" : "main") + | |
| 234 | - "_" + (deviceId != null ? deviceId : "*") + | |
| 235 | - "_" + (channelId != null ? channelId : "*") + | |
| 236 | - "_" + (stream != null ? stream : "*"); | |
| 237 | - List<Object> scanResult = RedisUtil.scan(redisTemplate, scanKey); | |
| 238 | - if (scanResult.size() > 0) { | |
| 239 | - for (Object keyObj : scanResult) { | |
| 240 | - String key = (String) keyObj; | |
| 241 | - InviteInfo inviteInfo = (InviteInfo) redisTemplate.opsForValue().get(key); | |
| 242 | - if (inviteInfo == null) { | |
| 243 | - continue; | |
| 244 | - } | |
| 245 | - redisTemplate.delete(key); | |
| 246 | - inviteErrorCallbackMap.remove(buildKey(type, deviceId, channelId, inviteInfo.getStream())); | |
| 247 | - } | |
| 248 | - } | |
| 249 | - } | |
| 250 | - | |
| 251 | - @Override | |
| 252 | - public void once(InviteSessionType type, String deviceId, String channelId, boolean isSubStream, String stream, ErrorCallback<Object> callback) { | |
| 253 | - String key = buildSubStreamKey(type, deviceId, channelId,isSubStream, stream); | |
| 254 | - List<ErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key); | |
| 255 | - if (callbacks == null) { | |
| 256 | - callbacks = new CopyOnWriteArrayList<>(); | |
| 257 | - inviteErrorCallbackMap.put(key, callbacks); | |
| 258 | - } | |
| 259 | - callbacks.add(callback); | |
| 260 | - } | |
| 261 | - | |
| 262 | - @Override | |
| 263 | - public void call(InviteSessionType type, String deviceId, String channelId, boolean isSubStream, String stream, int code, String msg, Object data) { | |
| 264 | - String key = buildSubStreamKey(type, deviceId, channelId,isSubStream, stream); | |
| 208 | + public void call(InviteSessionType type, String deviceId, String channelId, String stream, int code, String msg, Object data) { | |
| 209 | + String key = buildSubStreamKey(type, deviceId, channelId, stream); | |
| 265 | 210 | List<ErrorCallback<Object>> callbacks = inviteErrorCallbackMap.get(key); |
| 266 | 211 | if (callbacks == null) { |
| 267 | 212 | return; |
| ... | ... | @@ -273,89 +218,12 @@ public class InviteStreamServiceImpl implements IInviteStreamService { |
| 273 | 218 | } |
| 274 | 219 | |
| 275 | 220 | |
| 276 | - private String buildSubStreamKey(InviteSessionType type, String deviceId, String channelId, boolean isSubStream, String stream) { | |
| 277 | - String key = type + "_" + (isSubStream ? "sub":"main") + "_" + deviceId + "_" + channelId; | |
| 221 | + private String buildSubStreamKey(InviteSessionType type, String deviceId, String channelId, String stream) { | |
| 222 | + String key = type + "_" + "_" + deviceId + "_" + channelId; | |
| 278 | 223 | // 如果ssrc为null那么可以实现一个通道只能一次操作,ssrc不为null则可以支持一个通道多次invite |
| 279 | 224 | if (stream != null) { |
| 280 | 225 | key += ("_" + stream); |
| 281 | 226 | } |
| 282 | 227 | return key; |
| 283 | 228 | } |
| 284 | - @Override | |
| 285 | - public void updateInviteInfoSub(InviteInfo inviteInfo) { | |
| 286 | - if (inviteInfo == null || (inviteInfo.getDeviceId() == null || inviteInfo.getChannelId() == null)) { | |
| 287 | - logger.warn("[更新Invite信息],参数不全: {}", JSON.toJSON(inviteInfo)); | |
| 288 | - return; | |
| 289 | - } | |
| 290 | - InviteInfo inviteInfoForUpdate = null; | |
| 291 | - | |
| 292 | - if (InviteSessionStatus.ready == inviteInfo.getStatus()) { | |
| 293 | - if (inviteInfo.getDeviceId() == null | |
| 294 | - || inviteInfo.getChannelId() == null | |
| 295 | - || inviteInfo.getType() == null | |
| 296 | - || inviteInfo.getStream() == null | |
| 297 | - ) { | |
| 298 | - return; | |
| 299 | - } | |
| 300 | - inviteInfoForUpdate = inviteInfo; | |
| 301 | - } else { | |
| 302 | - InviteInfo inviteInfoInRedis = getInviteInfo(inviteInfo.getType(), inviteInfo.getDeviceId(), | |
| 303 | - inviteInfo.getChannelId(),inviteInfo.isSubStream(), inviteInfo.getStream()); | |
| 304 | - if (inviteInfoInRedis == null) { | |
| 305 | - logger.warn("[更新Invite信息],未从缓存中读取到Invite信息: deviceId: {}, channel: {}, stream: {}", | |
| 306 | - inviteInfo.getDeviceId(), inviteInfo.getChannelId(), inviteInfo.getStream()); | |
| 307 | - return; | |
| 308 | - } | |
| 309 | - if (inviteInfo.getStreamInfo() != null) { | |
| 310 | - inviteInfoInRedis.setStreamInfo(inviteInfo.getStreamInfo()); | |
| 311 | - } | |
| 312 | - if (inviteInfo.getSsrcInfo() != null) { | |
| 313 | - inviteInfoInRedis.setSsrcInfo(inviteInfo.getSsrcInfo()); | |
| 314 | - } | |
| 315 | - if (inviteInfo.getStreamMode() != null) { | |
| 316 | - inviteInfoInRedis.setStreamMode(inviteInfo.getStreamMode()); | |
| 317 | - } | |
| 318 | - if (inviteInfo.getReceiveIp() != null) { | |
| 319 | - inviteInfoInRedis.setReceiveIp(inviteInfo.getReceiveIp()); | |
| 320 | - } | |
| 321 | - if (inviteInfo.getReceivePort() != null) { | |
| 322 | - inviteInfoInRedis.setReceivePort(inviteInfo.getReceivePort()); | |
| 323 | - } | |
| 324 | - if (inviteInfo.getStatus() != null) { | |
| 325 | - inviteInfoInRedis.setStatus(inviteInfo.getStatus()); | |
| 326 | - } | |
| 327 | - | |
| 328 | - inviteInfoForUpdate = inviteInfoInRedis; | |
| 329 | - | |
| 330 | - } | |
| 331 | - String key = VideoManagerConstants.INVITE_PREFIX + | |
| 332 | - "_" + inviteInfoForUpdate.getType() + | |
| 333 | - "_" + (inviteInfoForUpdate.isSubStream() ? "sub":"main") + | |
| 334 | - "_" + inviteInfoForUpdate.getDeviceId() + | |
| 335 | - "_" + inviteInfoForUpdate.getChannelId() + | |
| 336 | - "_" + inviteInfoForUpdate.getStream(); | |
| 337 | - redisTemplate.opsForValue().set(key, inviteInfoForUpdate); | |
| 338 | - } | |
| 339 | - | |
| 340 | - @Override | |
| 341 | - public InviteInfo getInviteInfoByStream(InviteSessionType type, String stream, boolean isSubStream) { | |
| 342 | - return getInviteInfo(type, null, null,isSubStream, stream); | |
| 343 | - } | |
| 344 | - | |
| 345 | - @Override | |
| 346 | - public List<Object> getInviteInfos(InviteSessionType type, String deviceId, String channelId, String stream) { | |
| 347 | - String key = VideoManagerConstants.INVITE_PREFIX + | |
| 348 | - "_" + (type != null ? type : "*") + | |
| 349 | - "_" + (deviceId != null ? deviceId : "*") + | |
| 350 | - "_" + (channelId != null ? channelId : "*") + | |
| 351 | - "_" + (stream != null ? stream : "*"); | |
| 352 | - List<Object> scanResult = RedisUtil.scan(redisTemplate, key); | |
| 353 | - return scanResult; | |
| 354 | - } | |
| 355 | - | |
| 356 | - /*======================设备主子码流逻辑END=========================*/ | |
| 357 | - | |
| 358 | - | |
| 359 | - | |
| 360 | - | |
| 361 | 229 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| ... | ... | @@ -116,43 +116,27 @@ public class PlayServiceImpl implements IPlayService { |
| 116 | 116 | |
| 117 | 117 | |
| 118 | 118 | @Override |
| 119 | - public SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId,boolean isSubStream, ErrorCallback<Object> callback) { | |
| 119 | + public SSRCInfo play(MediaServerItem mediaServerItem, String deviceId, String channelId, ErrorCallback<Object> callback) { | |
| 120 | 120 | if (mediaServerItem == null) { |
| 121 | 121 | throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到可用的zlm"); |
| 122 | 122 | } |
| 123 | 123 | |
| 124 | 124 | Device device = redisCatchStorage.getDevice(deviceId); |
| 125 | - InviteInfo inviteInfo; | |
| 126 | - if(device.isSwitchPrimarySubStream()){ | |
| 127 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream); | |
| 128 | - }else { | |
| 129 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 130 | - } | |
| 125 | + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 131 | 126 | if (inviteInfo != null ) { |
| 132 | 127 | if (inviteInfo.getStreamInfo() == null) { |
| 133 | 128 | // 点播发起了但是尚未成功, 仅注册回调等待结果即可 |
| 134 | - if(device.isSwitchPrimarySubStream()){ | |
| 135 | - inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId,isSubStream, null, callback); | |
| 136 | - }else { | |
| 137 | - inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId, null, callback); | |
| 138 | - } | |
| 129 | + inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId, null, callback); | |
| 139 | 130 | return inviteInfo.getSsrcInfo(); |
| 140 | 131 | }else { |
| 141 | 132 | StreamInfo streamInfo = inviteInfo.getStreamInfo(); |
| 142 | 133 | String streamId = streamInfo.getStream(); |
| 143 | 134 | if (streamId == null) { |
| 144 | 135 | callback.run(InviteErrorCode.ERROR_FOR_CATCH_DATA.getCode(), "点播失败, redis缓存streamId等于null", null); |
| 145 | - if(device.isSwitchPrimarySubStream()){ | |
| 146 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 147 | - InviteErrorCode.ERROR_FOR_CATCH_DATA.getCode(), | |
| 148 | - "点播失败, redis缓存streamId等于null", | |
| 149 | - null); | |
| 150 | - }else { | |
| 151 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 152 | - InviteErrorCode.ERROR_FOR_CATCH_DATA.getCode(), | |
| 153 | - "点播失败, redis缓存streamId等于null", | |
| 154 | - null); | |
| 155 | - } | |
| 136 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 137 | + InviteErrorCode.ERROR_FOR_CATCH_DATA.getCode(), | |
| 138 | + "点播失败, redis缓存streamId等于null", | |
| 139 | + null); | |
| 156 | 140 | return inviteInfo.getSsrcInfo(); |
| 157 | 141 | } |
| 158 | 142 | String mediaServerId = streamInfo.getMediaServerId(); |
| ... | ... | @@ -161,64 +145,38 @@ public class PlayServiceImpl implements IPlayService { |
| 161 | 145 | Boolean ready = zlmrtpServerFactory.isStreamReady(mediaInfo, "rtp", streamId); |
| 162 | 146 | if (ready != null && ready) { |
| 163 | 147 | callback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo); |
| 164 | - if(device.isSwitchPrimarySubStream()){ | |
| 165 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 166 | - InviteErrorCode.SUCCESS.getCode(), | |
| 167 | - InviteErrorCode.SUCCESS.getMsg(), | |
| 168 | - streamInfo); | |
| 169 | - }else { | |
| 170 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 171 | - InviteErrorCode.SUCCESS.getCode(), | |
| 172 | - InviteErrorCode.SUCCESS.getMsg(), | |
| 173 | - streamInfo); | |
| 174 | - } | |
| 148 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 149 | + InviteErrorCode.SUCCESS.getCode(), | |
| 150 | + InviteErrorCode.SUCCESS.getMsg(), | |
| 151 | + streamInfo); | |
| 175 | 152 | return inviteInfo.getSsrcInfo(); |
| 176 | 153 | }else { |
| 177 | 154 | // 点播发起了但是尚未成功, 仅注册回调等待结果即可 |
| 178 | - if(device.isSwitchPrimarySubStream()) { | |
| 179 | - inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId, null, callback); | |
| 180 | - storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); | |
| 181 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 182 | - }else { | |
| 183 | - inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId,isSubStream, null, callback); | |
| 184 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream); | |
| 185 | - } | |
| 155 | + inviteStreamService.once(InviteSessionType.PLAY, deviceId, channelId, null, callback); | |
| 156 | + storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId()); | |
| 157 | + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 186 | 158 | } |
| 187 | 159 | } |
| 188 | 160 | } |
| 189 | 161 | |
| 190 | - String streamId = null; | |
| 191 | - if (mediaServerItem.isRtpEnable()) { | |
| 192 | - if(device.isSwitchPrimarySubStream()){ | |
| 193 | - streamId = StreamInfo.getPlayStream(deviceId, channelId, isSubStream); | |
| 194 | - }else { | |
| 195 | - streamId = String.format("%s_%s", device.getDeviceId(), channelId); | |
| 196 | - } | |
| 197 | - } | |
| 162 | + String streamId = String.format("%s_%s", device.getDeviceId(), channelId); | |
| 198 | 163 | SSRCInfo ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId, null, device.isSsrcCheck(), false, 0, false, device.getStreamModeForParam()); |
| 199 | 164 | if (ssrcInfo == null) { |
| 200 | 165 | callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(), null); |
| 201 | - if(device.isSwitchPrimarySubStream()){ | |
| 202 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 203 | - InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), | |
| 204 | - InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(), | |
| 205 | - null); | |
| 206 | - }else { | |
| 207 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 208 | - InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), | |
| 209 | - InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(), | |
| 210 | - null); | |
| 211 | - } | |
| 166 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 167 | + InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), | |
| 168 | + InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getMsg(), | |
| 169 | + null); | |
| 212 | 170 | return null; |
| 213 | 171 | } |
| 214 | 172 | // TODO 记录点播的状态 |
| 215 | - play(mediaServerItem, ssrcInfo, device, channelId,isSubStream, callback); | |
| 173 | + play(mediaServerItem, ssrcInfo, device, channelId, callback); | |
| 216 | 174 | return ssrcInfo; |
| 217 | 175 | } |
| 218 | 176 | |
| 219 | 177 | |
| 220 | 178 | @Override |
| 221 | - public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,boolean isSubStream, | |
| 179 | + public void play(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId, | |
| 222 | 180 | ErrorCallback<Object> callback) { |
| 223 | 181 | |
| 224 | 182 | if (mediaServerItem == null || ssrcInfo == null) { |
| ... | ... | @@ -227,11 +185,9 @@ public class PlayServiceImpl implements IPlayService { |
| 227 | 185 | null); |
| 228 | 186 | return; |
| 229 | 187 | } |
| 230 | - if( device.isSwitchPrimarySubStream() ){ | |
| 231 | - logger.info("[点播开始] deviceId: {}, channelId: {},码流类型:{},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId,isSubStream ? "辅码流" : "主码流", ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck()); | |
| 232 | - }else { | |
| 233 | - logger.info("[点播开始] deviceId: {}, channelId: {},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck()); | |
| 234 | - } | |
| 188 | + logger.info("[点播开始] deviceId: {}, channelId: {},码流类型:{},收流端口: {}, 收流模式:{}, SSRC: {}, SSRC校验:{}", | |
| 189 | + device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "辅码流" : "主码流", ssrcInfo.getPort(), | |
| 190 | + device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck()); | |
| 235 | 191 | //端口获取失败的ssrcInfo 没有必要发送点播指令 |
| 236 | 192 | if (ssrcInfo.getPort() <= 0) { |
| 237 | 193 | logger.info("[点播端口分配异常],deviceId={},channelId={},ssrcInfo={}", device.getDeviceId(), channelId, ssrcInfo); |
| ... | ... | @@ -240,50 +196,27 @@ public class PlayServiceImpl implements IPlayService { |
| 240 | 196 | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| 241 | 197 | |
| 242 | 198 | callback.run(InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null); |
| 243 | - if(device.isSwitchPrimarySubStream()){ | |
| 244 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 245 | - InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null); | |
| 246 | - }else { | |
| 247 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 248 | - InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null); | |
| 249 | - } | |
| 199 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 200 | + InviteErrorCode.ERROR_FOR_RESOURCE_EXHAUSTION.getCode(), "点播端口分配异常", null); | |
| 250 | 201 | return; |
| 251 | 202 | } |
| 252 | 203 | |
| 253 | 204 | // 初始化redis中的invite消息状态 |
| 254 | - InviteInfo inviteInfo; | |
| 255 | - | |
| 256 | - if(device.isSwitchPrimarySubStream()){ | |
| 257 | - // 初始化redis中的invite消息状态 | |
| 258 | - inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId,isSubStream, ssrcInfo.getStream(), ssrcInfo, | |
| 259 | - mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY, | |
| 260 | - InviteSessionStatus.ready); | |
| 261 | - inviteStreamService.updateInviteInfoSub(inviteInfo); | |
| 262 | - }else { | |
| 263 | - // 初始化redis中的invite消息状态 | |
| 264 | - inviteInfo = InviteInfo.getinviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo, | |
| 265 | - mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY, | |
| 266 | - InviteSessionStatus.ready); | |
| 267 | - inviteStreamService.updateInviteInfo(inviteInfo); | |
| 268 | - } | |
| 205 | + InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo, | |
| 206 | + mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAY, | |
| 207 | + InviteSessionStatus.ready); | |
| 208 | + inviteInfo.setSubStream(device.isSwitchPrimarySubStream()); | |
| 209 | + inviteStreamService.updateInviteInfo(inviteInfo); | |
| 269 | 210 | // 超时处理 |
| 270 | 211 | String timeOutTaskKey = UUID.randomUUID().toString(); |
| 271 | 212 | dynamicTask.startDelay(timeOutTaskKey, () -> { |
| 272 | 213 | // 执行超时任务时查询是否已经成功,成功了则不执行超时任务,防止超时任务取消失败的情况 |
| 273 | - InviteInfo inviteInfoForTimeOut; | |
| 274 | - if(device.isSwitchPrimarySubStream()){ | |
| 275 | - // 初始化redis中的invite消息状态 | |
| 276 | - inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream); | |
| 277 | - }else { | |
| 278 | - // 初始化redis中的invite消息状态 | |
| 279 | - inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 280 | - } | |
| 214 | + InviteInfo inviteInfoForTimeOut = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 281 | 215 | if (inviteInfoForTimeOut == null || inviteInfoForTimeOut.getStreamInfo() == null) { |
| 282 | - if( device.isSwitchPrimarySubStream()){ | |
| 283 | - logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流类型:{},端口:{}, SSRC: {}", device.getDeviceId(), channelId,isSubStream ? "辅码流" : "主码流", ssrcInfo.getPort(), ssrcInfo.getSsrc()); | |
| 284 | - }else { | |
| 285 | - logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},端口:{}, SSRC: {}", device.getDeviceId(), channelId, ssrcInfo.getPort(), ssrcInfo.getSsrc()); | |
| 286 | - } | |
| 216 | + logger.info("[点播超时] 收流超时 deviceId: {}, channelId: {},码流类型:{},端口:{}, SSRC: {}", | |
| 217 | + device.getDeviceId(), channelId, device.isSwitchPrimarySubStream() ? "辅码流" : "主码流", | |
| 218 | + ssrcInfo.getPort(), ssrcInfo.getSsrc()); | |
| 219 | + | |
| 287 | 220 | // 点播超时回复BYE 同时释放ssrc以及此次点播的资源 |
| 288 | 221 | // InviteInfo inviteInfoForTimeout = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.play, device.getDeviceId(), channelId); |
| 289 | 222 | // if (inviteInfoForTimeout == null) { |
| ... | ... | @@ -295,16 +228,10 @@ public class PlayServiceImpl implements IPlayService { |
| 295 | 228 | // // TODO 发送cancel |
| 296 | 229 | // } |
| 297 | 230 | callback.run(InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); |
| 298 | - if( device.isSwitchPrimarySubStream()){ | |
| 299 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 300 | - InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); | |
| 301 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream); | |
| 231 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 232 | + InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); | |
| 233 | + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 302 | 234 | |
| 303 | - }else { | |
| 304 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 305 | - InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null); | |
| 306 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 307 | - } | |
| 308 | 235 | try { |
| 309 | 236 | cmder.streamByeCmd(device, channelId, ssrcInfo.getStream(), null); |
| 310 | 237 | } catch (InvalidArgumentException | ParseException | SipException | SsrcTransactionNotFoundException e) { |
| ... | ... | @@ -322,42 +249,26 @@ public class PlayServiceImpl implements IPlayService { |
| 322 | 249 | }, userSetting.getPlayTimeout()); |
| 323 | 250 | |
| 324 | 251 | try { |
| 325 | - cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId,isSubStream, (mediaServerItemInuse, hookParam ) -> { | |
| 252 | + cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (mediaServerItemInuse, hookParam ) -> { | |
| 326 | 253 | logger.info("收到订阅消息: " + hookParam); |
| 327 | 254 | dynamicTask.stop(timeOutTaskKey); |
| 328 | 255 | // hook响应 |
| 329 | - StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channelId,isSubStream); | |
| 256 | + StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInuse, hookParam, device.getDeviceId(), channelId); | |
| 330 | 257 | if (streamInfo == null){ |
| 331 | 258 | callback.run(InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), |
| 332 | 259 | InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); |
| 333 | - if( device.isSwitchPrimarySubStream()){ | |
| 334 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 335 | - InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), | |
| 336 | - InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); | |
| 337 | - }else { | |
| 338 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 339 | - InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), | |
| 340 | - InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); | |
| 341 | - } | |
| 260 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 261 | + InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), | |
| 262 | + InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); | |
| 342 | 263 | return; |
| 343 | 264 | } |
| 344 | 265 | callback.run(InviteErrorCode.SUCCESS.getCode(), InviteErrorCode.SUCCESS.getMsg(), streamInfo); |
| 345 | - if( device.isSwitchPrimarySubStream()){ | |
| 346 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 347 | - InviteErrorCode.SUCCESS.getCode(), | |
| 348 | - InviteErrorCode.SUCCESS.getMsg(), | |
| 349 | - streamInfo); | |
| 350 | - }else { | |
| 351 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 352 | - InviteErrorCode.SUCCESS.getCode(), | |
| 353 | - InviteErrorCode.SUCCESS.getMsg(), | |
| 354 | - streamInfo); | |
| 355 | - } | |
| 356 | - if( device.isSwitchPrimarySubStream() ){ | |
| 357 | - logger.info("[点播成功] deviceId: {}, channelId: {},码流类型:{}", device.getDeviceId(), channelId,isSubStream ? "辅码流" : "主码流"); | |
| 358 | - }else { | |
| 359 | - logger.info("[点播成功] deviceId: {}, channelId: {}", device.getDeviceId(), channelId); | |
| 360 | - } | |
| 266 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 267 | + InviteErrorCode.SUCCESS.getCode(), | |
| 268 | + InviteErrorCode.SUCCESS.getMsg(), | |
| 269 | + streamInfo); | |
| 270 | + logger.info("[点播成功] deviceId: {}, channelId: {},码流类型:{}", device.getDeviceId(), | |
| 271 | + device.isSwitchPrimarySubStream() ? "辅码流" : "主码流"); | |
| 361 | 272 | String streamUrl; |
| 362 | 273 | if (mediaServerItemInuse.getRtspPort() != 0) { |
| 363 | 274 | streamUrl = String.format("rtsp://127.0.0.1:%s/%s/%s", mediaServerItemInuse.getRtspPort(), "rtp", ssrcInfo.getStream()); |
| ... | ... | @@ -413,15 +324,9 @@ public class PlayServiceImpl implements IPlayService { |
| 413 | 324 | |
| 414 | 325 | callback.run(InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(), |
| 415 | 326 | InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null); |
| 416 | - if(device.isSwitchPrimarySubStream()){ | |
| 417 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 418 | - InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(), | |
| 419 | - InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null); | |
| 420 | - }else { | |
| 421 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 422 | - InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(), | |
| 423 | - InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null); | |
| 424 | - } | |
| 327 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 328 | + InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getCode(), | |
| 329 | + InviteErrorCode.ERROR_FOR_SDP_PARSING_EXCEPTIONS.getMsg(), null); | |
| 425 | 330 | } |
| 426 | 331 | } |
| 427 | 332 | return; |
| ... | ... | @@ -438,39 +343,26 @@ public class PlayServiceImpl implements IPlayService { |
| 438 | 343 | subscribe.removeSubscribe(hookSubscribe); |
| 439 | 344 | String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase(); |
| 440 | 345 | hookSubscribe.getContent().put("stream", stream); |
| 441 | - inviteInfo.setStream(stream); | |
| 346 | + inviteStreamService.updateInviteInfoForStream(inviteInfo, stream); | |
| 442 | 347 | subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> { |
| 443 | 348 | logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + hookParam); |
| 444 | 349 | dynamicTask.stop(timeOutTaskKey); |
| 445 | 350 | // hook响应 |
| 446 | - StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInUse, hookParam, device.getDeviceId(), channelId,isSubStream); | |
| 351 | + StreamInfo streamInfo = onPublishHandlerForPlay(mediaServerItemInUse, hookParam, device.getDeviceId(), channelId); | |
| 447 | 352 | if (streamInfo == null){ |
| 448 | 353 | callback.run(InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), |
| 449 | 354 | InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); |
| 450 | - if( device.isSwitchPrimarySubStream()){ | |
| 451 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 452 | - InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), | |
| 453 | - InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); | |
| 454 | - }else { | |
| 455 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 456 | - InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), | |
| 457 | - InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); | |
| 458 | - } | |
| 355 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 356 | + InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getCode(), | |
| 357 | + InviteErrorCode.ERROR_FOR_STREAM_PARSING_EXCEPTIONS.getMsg(), null); | |
| 459 | 358 | return; |
| 460 | 359 | } |
| 461 | 360 | callback.run(InviteErrorCode.SUCCESS.getCode(), |
| 462 | 361 | InviteErrorCode.SUCCESS.getMsg(), streamInfo); |
| 463 | - if( device.isSwitchPrimarySubStream()){ | |
| 464 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 465 | - InviteErrorCode.SUCCESS.getCode(), | |
| 466 | - InviteErrorCode.SUCCESS.getMsg(), | |
| 467 | - streamInfo); | |
| 468 | - }else { | |
| 469 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 470 | - InviteErrorCode.SUCCESS.getCode(), | |
| 471 | - InviteErrorCode.SUCCESS.getMsg(), | |
| 472 | - streamInfo); | |
| 473 | - } | |
| 362 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 363 | + InviteErrorCode.SUCCESS.getCode(), | |
| 364 | + InviteErrorCode.SUCCESS.getMsg(), | |
| 365 | + streamInfo); | |
| 474 | 366 | }); |
| 475 | 367 | return; |
| 476 | 368 | } |
| ... | ... | @@ -493,17 +385,14 @@ public class PlayServiceImpl implements IPlayService { |
| 493 | 385 | |
| 494 | 386 | callback.run(InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), |
| 495 | 387 | "下级自定义了ssrc,重新设置收流信息失败", null); |
| 496 | - if( device.isSwitchPrimarySubStream()){ | |
| 497 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 498 | - InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), | |
| 499 | - "下级自定义了ssrc,重新设置收流信息失败", null); | |
| 500 | - }else { | |
| 501 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 502 | - InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), | |
| 503 | - "下级自定义了ssrc,重新设置收流信息失败", null); | |
| 504 | - } | |
| 388 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 389 | + InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), | |
| 390 | + "下级自定义了ssrc,重新设置收流信息失败", null); | |
| 505 | 391 | |
| 506 | 392 | }else { |
| 393 | + if (ssrcInfo.getStream()!= null && !ssrcInfo.getStream().equals(inviteInfo.getStream())) { | |
| 394 | + inviteStreamService.removeInviteInfo(inviteInfo); | |
| 395 | + } | |
| 507 | 396 | ssrcInfo.setSsrc(ssrcInResponse); |
| 508 | 397 | inviteInfo.setSsrcInfo(ssrcInfo); |
| 509 | 398 | inviteInfo.setStream(ssrcInfo.getStream()); |
| ... | ... | @@ -512,11 +401,7 @@ public class PlayServiceImpl implements IPlayService { |
| 512 | 401 | logger.info("[点播消息] 收到invite 200, 下级自定义了ssrc, 但是当前模式无需修正"); |
| 513 | 402 | } |
| 514 | 403 | } |
| 515 | - if(device.isSwitchPrimarySubStream()){ | |
| 516 | - inviteStreamService.updateInviteInfoSub(inviteInfo); | |
| 517 | - }else { | |
| 518 | - inviteStreamService.updateInviteInfo(inviteInfo); | |
| 519 | - } | |
| 404 | + inviteStreamService.updateInviteInfo(inviteInfo); | |
| 520 | 405 | }, (event) -> { |
| 521 | 406 | dynamicTask.stop(timeOutTaskKey); |
| 522 | 407 | mediaServerService.closeRTPServer(mediaServerItem, ssrcInfo.getStream()); |
| ... | ... | @@ -527,19 +412,11 @@ public class PlayServiceImpl implements IPlayService { |
| 527 | 412 | |
| 528 | 413 | callback.run(InviteErrorCode.ERROR_FOR_SIGNALLING_ERROR.getCode(), |
| 529 | 414 | String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null); |
| 530 | - if( device.isSwitchPrimarySubStream()){ | |
| 531 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 532 | - InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), | |
| 533 | - String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null); | |
| 534 | - | |
| 535 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream); | |
| 536 | - }else { | |
| 537 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 538 | - InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), | |
| 539 | - String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null); | |
| 415 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 416 | + InviteErrorCode.ERROR_FOR_RESET_SSRC.getCode(), | |
| 417 | + String.format("点播失败, 错误码: %s, %s", event.statusCode, event.msg), null); | |
| 540 | 418 | |
| 541 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 542 | - } | |
| 419 | + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 543 | 420 | }); |
| 544 | 421 | } catch (InvalidArgumentException | SipException | ParseException e) { |
| 545 | 422 | |
| ... | ... | @@ -553,52 +430,30 @@ public class PlayServiceImpl implements IPlayService { |
| 553 | 430 | |
| 554 | 431 | callback.run(InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(), |
| 555 | 432 | InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null); |
| 556 | - if( device.isSwitchPrimarySubStream()){ | |
| 557 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream, null, | |
| 558 | - InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(), | |
| 559 | - InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null); | |
| 560 | - | |
| 561 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId,isSubStream); | |
| 562 | - }else { | |
| 563 | - inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 564 | - InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(), | |
| 565 | - InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null); | |
| 433 | + inviteStreamService.call(InviteSessionType.PLAY, device.getDeviceId(), channelId, null, | |
| 434 | + InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getCode(), | |
| 435 | + InviteErrorCode.ERROR_FOR_SIP_SENDING_FAILED.getMsg(), null); | |
| 566 | 436 | |
| 567 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 568 | - } | |
| 437 | + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, device.getDeviceId(), channelId); | |
| 569 | 438 | } |
| 570 | 439 | } |
| 571 | 440 | |
| 572 | - private StreamInfo onPublishHandlerForPlay(MediaServerItem mediaServerItem, HookParam hookParam, String deviceId, String channelId, boolean isSubStream) { | |
| 441 | + private StreamInfo onPublishHandlerForPlay(MediaServerItem mediaServerItem, HookParam hookParam, String deviceId, String channelId) { | |
| 573 | 442 | StreamInfo streamInfo = null; |
| 574 | 443 | Device device = redisCatchStorage.getDevice(deviceId); |
| 575 | 444 | OnStreamChangedHookParam streamChangedHookParam = (OnStreamChangedHookParam)hookParam; |
| 576 | - if( device.isSwitchPrimarySubStream() ){ | |
| 577 | - streamInfo = onPublishHandler(mediaServerItem, streamChangedHookParam, deviceId, channelId,isSubStream); | |
| 578 | - }else { | |
| 579 | - streamInfo = onPublishHandler(mediaServerItem, streamChangedHookParam, deviceId, channelId); | |
| 580 | - } | |
| 445 | + streamInfo = onPublishHandler(mediaServerItem, streamChangedHookParam, deviceId, channelId); | |
| 581 | 446 | if (streamInfo != null) { |
| 582 | - InviteInfo inviteInfo; | |
| 583 | - if(device.isSwitchPrimarySubStream()){ | |
| 584 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream); | |
| 585 | - }else { | |
| 586 | - DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId); | |
| 587 | - if (deviceChannel != null) { | |
| 588 | - deviceChannel.setStreamId(streamInfo.getStream()); | |
| 589 | - storager.startPlay(deviceId, channelId, streamInfo.getStream()); | |
| 590 | - } | |
| 591 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 447 | + DeviceChannel deviceChannel = storager.queryChannel(deviceId, channelId); | |
| 448 | + if (deviceChannel != null) { | |
| 449 | + deviceChannel.setStreamId(streamInfo.getStream()); | |
| 450 | + storager.startPlay(deviceId, channelId, streamInfo.getStream()); | |
| 592 | 451 | } |
| 452 | + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 593 | 453 | if (inviteInfo != null) { |
| 594 | 454 | inviteInfo.setStatus(InviteSessionStatus.ok); |
| 595 | 455 | inviteInfo.setStreamInfo(streamInfo); |
| 596 | - if(device.isSwitchPrimarySubStream()){ | |
| 597 | - inviteStreamService.updateInviteInfoSub(inviteInfo); | |
| 598 | - }else { | |
| 599 | - inviteStreamService.updateInviteInfo(inviteInfo); | |
| 600 | - } | |
| 601 | - | |
| 456 | + inviteStreamService.updateInviteInfo(inviteInfo); | |
| 602 | 457 | } |
| 603 | 458 | } |
| 604 | 459 | return streamInfo; |
| ... | ... | @@ -693,7 +548,7 @@ public class PlayServiceImpl implements IPlayService { |
| 693 | 548 | device.getDeviceId(), channelId, startTime, endTime, ssrcInfo.getPort(), device.getStreamMode(), |
| 694 | 549 | ssrcInfo.getSsrc(), device.isSsrcCheck()); |
| 695 | 550 | // 初始化redis中的invite消息状态 |
| 696 | - InviteInfo inviteInfo = InviteInfo.getinviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo, | |
| 551 | + InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo, | |
| 697 | 552 | mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.PLAYBACK, |
| 698 | 553 | InviteSessionStatus.ready); |
| 699 | 554 | inviteStreamService.updateInviteInfo(inviteInfo); |
| ... | ... | @@ -805,7 +660,7 @@ public class PlayServiceImpl implements IPlayService { |
| 805 | 660 | subscribe.removeSubscribe(hookSubscribe); |
| 806 | 661 | String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase(); |
| 807 | 662 | hookSubscribe.getContent().put("stream", stream); |
| 808 | - inviteInfo.setStream(stream); | |
| 663 | + inviteStreamService.updateInviteInfoForStream(inviteInfo, stream); | |
| 809 | 664 | subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> { |
| 810 | 665 | logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + hookParam); |
| 811 | 666 | dynamicTask.stop(playBackTimeOutTaskKey); |
| ... | ... | @@ -834,6 +689,10 @@ public class PlayServiceImpl implements IPlayService { |
| 834 | 689 | "下级自定义了ssrc,重新设置收流信息失败", null); |
| 835 | 690 | |
| 836 | 691 | }else { |
| 692 | + if (ssrcInfo.getStream()!= null && !ssrcInfo.getStream().equals(inviteInfo.getStream())) { | |
| 693 | + inviteStreamService.removeInviteInfo(inviteInfo); | |
| 694 | + } | |
| 695 | + | |
| 837 | 696 | ssrcInfo.setSsrc(ssrcInResponse); |
| 838 | 697 | inviteInfo.setSsrcInfo(ssrcInfo); |
| 839 | 698 | inviteInfo.setStream(ssrcInfo.getStream()); |
| ... | ... | @@ -892,7 +751,7 @@ public class PlayServiceImpl implements IPlayService { |
| 892 | 751 | } |
| 893 | 752 | logger.info("[录像下载] deviceId: {}, channelId: {}, 下载速度:{}, 收流端口:{}, 收流模式:{}, SSRC: {}, SSRC校验:{}", device.getDeviceId(), channelId, downloadSpeed, ssrcInfo.getPort(), device.getStreamMode(), ssrcInfo.getSsrc(), device.isSsrcCheck()); |
| 894 | 753 | // 初始化redis中的invite消息状态 |
| 895 | - InviteInfo inviteInfo = InviteInfo.getinviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo, | |
| 754 | + InviteInfo inviteInfo = InviteInfo.getInviteInfo(device.getDeviceId(), channelId, ssrcInfo.getStream(), ssrcInfo, | |
| 896 | 755 | mediaServerItem.getSdpIp(), ssrcInfo.getPort(), device.getStreamMode(), InviteSessionType.DOWNLOAD, |
| 897 | 756 | InviteSessionStatus.ready); |
| 898 | 757 | inviteStreamService.updateInviteInfo(inviteInfo); |
| ... | ... | @@ -998,7 +857,9 @@ public class PlayServiceImpl implements IPlayService { |
| 998 | 857 | // 添加订阅 |
| 999 | 858 | HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId()); |
| 1000 | 859 | subscribe.removeSubscribe(hookSubscribe); |
| 1001 | - hookSubscribe.getContent().put("stream", String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase()); | |
| 860 | + String stream = String.format("%08x", Integer.parseInt(ssrcInResponse)).toUpperCase(); | |
| 861 | + hookSubscribe.getContent().put("stream", stream); | |
| 862 | + inviteStreamService.updateInviteInfoForStream(inviteInfo, stream); | |
| 1002 | 863 | subscribe.addSubscribe(hookSubscribe, (mediaServerItemInUse, hookParam) -> { |
| 1003 | 864 | logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + hookParam); |
| 1004 | 865 | dynamicTask.stop(downLoadTimeOutTaskKey); |
| ... | ... | @@ -1026,6 +887,9 @@ public class PlayServiceImpl implements IPlayService { |
| 1026 | 887 | "下级自定义了ssrc,重新设置收流信息失败", null); |
| 1027 | 888 | |
| 1028 | 889 | }else { |
| 890 | + if (ssrcInfo.getStream()!= null && !ssrcInfo.getStream().equals(inviteInfo.getStream())) { | |
| 891 | + inviteStreamService.removeInviteInfo(inviteInfo); | |
| 892 | + } | |
| 1029 | 893 | ssrcInfo.setSsrc(ssrcInResponse); |
| 1030 | 894 | inviteInfo.setSsrcInfo(ssrcInfo); |
| 1031 | 895 | inviteInfo.setStream(ssrcInfo.getStream()); |
| ... | ... | @@ -1034,6 +898,7 @@ public class PlayServiceImpl implements IPlayService { |
| 1034 | 898 | logger.info("[录像下载] 收到invite 200, 下级自定义了ssrc, 但是当前模式无需修正"); |
| 1035 | 899 | } |
| 1036 | 900 | } |
| 901 | + inviteStreamService.updateInviteInfo(inviteInfo); | |
| 1037 | 902 | }); |
| 1038 | 903 | } catch (InvalidArgumentException | SipException | ParseException e) { |
| 1039 | 904 | logger.error("[命令发送失败] 录像下载: {}", e.getMessage()); |
| ... | ... | @@ -1255,18 +1120,13 @@ public class PlayServiceImpl implements IPlayService { |
| 1255 | 1120 | } |
| 1256 | 1121 | |
| 1257 | 1122 | @Override |
| 1258 | - public void getSnap(String deviceId, String channelId, String fileName,boolean isSubStream, ErrorCallback errorCallback) { | |
| 1123 | + public void getSnap(String deviceId, String channelId, String fileName, ErrorCallback errorCallback) { | |
| 1259 | 1124 | Device device = deviceService.getDevice(deviceId); |
| 1260 | 1125 | if (device == null) { |
| 1261 | 1126 | errorCallback.run(InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getCode(), InviteErrorCode.ERROR_FOR_PARAMETER_ERROR.getMsg(), null); |
| 1262 | 1127 | return; |
| 1263 | 1128 | } |
| 1264 | - InviteInfo inviteInfo; | |
| 1265 | - if(device.isSwitchPrimarySubStream()){ | |
| 1266 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream); | |
| 1267 | - }else { | |
| 1268 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 1269 | - } | |
| 1129 | + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 1270 | 1130 | if (inviteInfo != null) { |
| 1271 | 1131 | if (inviteInfo.getStreamInfo() != null) { |
| 1272 | 1132 | // 已存在线直接截图 |
| ... | ... | @@ -1292,11 +1152,11 @@ public class PlayServiceImpl implements IPlayService { |
| 1292 | 1152 | } |
| 1293 | 1153 | |
| 1294 | 1154 | MediaServerItem newMediaServerItem = getNewMediaServerItem(device); |
| 1295 | - play(newMediaServerItem, deviceId, channelId,isSubStream, (code, msg, data)->{ | |
| 1155 | + play(newMediaServerItem, deviceId, channelId, (code, msg, data)->{ | |
| 1296 | 1156 | if (code == InviteErrorCode.SUCCESS.getCode()) { |
| 1297 | 1157 | InviteInfo inviteInfoForPlay = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); |
| 1298 | 1158 | if (inviteInfoForPlay != null && inviteInfoForPlay.getStreamInfo() != null) { |
| 1299 | - getSnap(deviceId, channelId, fileName,isSubStream, errorCallback); | |
| 1159 | + getSnap(deviceId, channelId, fileName, errorCallback); | |
| 1300 | 1160 | }else { |
| 1301 | 1161 | errorCallback.run(InviteErrorCode.FAIL.getCode(), InviteErrorCode.FAIL.getMsg(), null); |
| 1302 | 1162 | } |
| ... | ... | @@ -1306,17 +1166,4 @@ public class PlayServiceImpl implements IPlayService { |
| 1306 | 1166 | }); |
| 1307 | 1167 | } |
| 1308 | 1168 | |
| 1309 | - | |
| 1310 | - /*======================设备主子码流逻辑START=========================*/ | |
| 1311 | - public StreamInfo onPublishHandler(MediaServerItem mediaServerItem, OnStreamChangedHookParam hookParam, String deviceId, String channelId,boolean isSubStream) { | |
| 1312 | - String streamId = hookParam.getStream(); | |
| 1313 | - List<OnStreamChangedHookParam.MediaTrack> tracks = hookParam.getTracks(); | |
| 1314 | - StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(mediaServerItem, "rtp", streamId, tracks, null); | |
| 1315 | - streamInfo.setDeviceID(deviceId); | |
| 1316 | - streamInfo.setChannelId(channelId); | |
| 1317 | - streamInfo.setSubStream(isSubStream); | |
| 1318 | - return streamInfo; | |
| 1319 | - } | |
| 1320 | - /*======================设备主子码流逻辑END=========================*/ | |
| 1321 | - | |
| 1322 | 1169 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/UserServiceImpl.java
| ... | ... | @@ -70,7 +70,6 @@ public class UserServiceImpl implements IUserService { |
| 70 | 70 | continue; |
| 71 | 71 | } |
| 72 | 72 | String checkStr = callId == null? user.getPushKey():(callId + "_" + user.getPushKey()) ; |
| 73 | - System.out.println(checkStr); | |
| 74 | 73 | String checkSign = DigestUtils.md5DigestAsHex(checkStr.getBytes()); |
| 75 | 74 | if (checkSign.equals(sign)) { |
| 76 | 75 | return true; | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
| ... | ... | @@ -88,17 +88,16 @@ public class PlayController { |
| 88 | 88 | @Operation(summary = "开始点播") |
| 89 | 89 | @Parameter(name = "deviceId", description = "设备国标编号", required = true) |
| 90 | 90 | @Parameter(name = "channelId", description = "通道国标编号", required = true) |
| 91 | - @Parameter(name = "isSubStream", description = "是否子码流(true-子码流,false-主码流),默认为false", required = true) | |
| 92 | 91 | @GetMapping("/start/{deviceId}/{channelId}") |
| 93 | 92 | public DeferredResult<WVPResult<StreamContent>> play(HttpServletRequest request, @PathVariable String deviceId, |
| 94 | - @PathVariable String channelId,boolean isSubStream) { | |
| 93 | + @PathVariable String channelId) { | |
| 95 | 94 | |
| 96 | 95 | // 获取可用的zlm |
| 97 | 96 | Device device = storager.queryVideoDevice(deviceId); |
| 98 | 97 | MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); |
| 99 | 98 | |
| 100 | 99 | RequestMessage requestMessage = new RequestMessage(); |
| 101 | - String key = DeferredResultHolder.getPlayKey(deviceId,channelId,device.isSwitchPrimarySubStream(),isSubStream); | |
| 100 | + String key = DeferredResultHolder.CALLBACK_CMD_PLAY + deviceId + channelId; | |
| 102 | 101 | requestMessage.setKey(key); |
| 103 | 102 | String uuid = UUID.randomUUID().toString(); |
| 104 | 103 | requestMessage.setId(uuid); |
| ... | ... | @@ -117,7 +116,7 @@ public class PlayController { |
| 117 | 116 | // 录像查询以channelId作为deviceId查询 |
| 118 | 117 | resultHolder.put(key, uuid, result); |
| 119 | 118 | |
| 120 | - playService.play(newMediaServerItem, deviceId, channelId,isSubStream, (code, msg, data) -> { | |
| 119 | + playService.play(newMediaServerItem, deviceId, channelId, (code, msg, data) -> { | |
| 121 | 120 | WVPResult<StreamContent> wvpResult = new WVPResult<>(); |
| 122 | 121 | if (code == InviteErrorCode.SUCCESS.getCode()) { |
| 123 | 122 | wvpResult.setCode(ErrorCode.SUCCESS.getCode()); |
| ... | ... | @@ -158,12 +157,7 @@ public class PlayController { |
| 158 | 157 | throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备[" + deviceId + "]不存在"); |
| 159 | 158 | } |
| 160 | 159 | |
| 161 | - InviteInfo inviteInfo =null; | |
| 162 | - if(device.isSwitchPrimarySubStream()){ | |
| 163 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream); | |
| 164 | - }else { | |
| 165 | - inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 166 | - } | |
| 160 | + InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 167 | 161 | if (inviteInfo == null) { |
| 168 | 162 | throw new ControllerException(ErrorCode.ERROR100.getCode(), "点播未找到"); |
| 169 | 163 | } |
| ... | ... | @@ -176,12 +170,8 @@ public class PlayController { |
| 176 | 170 | throw new ControllerException(ErrorCode.ERROR100.getCode(), "命令发送失败: " + e.getMessage()); |
| 177 | 171 | } |
| 178 | 172 | } |
| 179 | - if(device.isSwitchPrimarySubStream()){ | |
| 180 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId,isSubStream); | |
| 181 | - }else { | |
| 182 | - inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 183 | - storager.stopPlay(deviceId, channelId); | |
| 184 | - } | |
| 173 | + inviteStreamService.removeInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, deviceId, channelId); | |
| 174 | + storager.stopPlay(deviceId, channelId); | |
| 185 | 175 | |
| 186 | 176 | JSONObject json = new JSONObject(); |
| 187 | 177 | json.put("deviceId", deviceId); |
| ... | ... | @@ -360,9 +350,8 @@ public class PlayController { |
| 360 | 350 | logger.debug("获取截图: {}/{}", deviceId, channelId); |
| 361 | 351 | } |
| 362 | 352 | |
| 363 | - Device device = storager.queryVideoDevice(deviceId); | |
| 364 | 353 | DeferredResult<String> result = new DeferredResult<>(3 * 1000L); |
| 365 | - String key = DeferredResultHolder.getSnapKey(deviceId,channelId,device.isSwitchPrimarySubStream(),isSubStream); | |
| 354 | + String key = DeferredResultHolder.CALLBACK_CMD_SNAP + deviceId; | |
| 366 | 355 | String uuid = UUID.randomUUID().toString(); |
| 367 | 356 | resultHolder.put(key, uuid, result); |
| 368 | 357 | |
| ... | ... | @@ -371,7 +360,7 @@ public class PlayController { |
| 371 | 360 | message.setId(uuid); |
| 372 | 361 | |
| 373 | 362 | String fileName = deviceId + "_" + channelId + "_" + DateUtil.getNowForUrl() + "jpg"; |
| 374 | - playService.getSnap(deviceId, channelId, fileName,isSubStream, (code, msg, data) -> { | |
| 363 | + playService.getSnap(deviceId, channelId, fileName, (code, msg, data) -> { | |
| 375 | 364 | if (code == InviteErrorCode.SUCCESS.getCode()) { |
| 376 | 365 | message.setData(data); |
| 377 | 366 | }else { | ... | ... |
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
| ... | ... | @@ -122,7 +122,7 @@ public class ApiStreamController { |
| 122 | 122 | MediaServerItem newMediaServerItem = playService.getNewMediaServerItem(device); |
| 123 | 123 | |
| 124 | 124 | |
| 125 | - playService.play(newMediaServerItem, serial, code,false, (errorCode, msg, data) -> { | |
| 125 | + playService.play(newMediaServerItem, serial, code, (errorCode, msg, data) -> { | |
| 126 | 126 | if (errorCode == InviteErrorCode.SUCCESS.getCode()) { |
| 127 | 127 | InviteInfo inviteInfo = inviteStreamService.getInviteInfoByDeviceAndChannel(InviteSessionType.PLAY, serial, code); |
| 128 | 128 | if (inviteInfo != null && inviteInfo.getStreamInfo() != null) { | ... | ... |