Commit 14c4a3c7e81e9a3898a3f301b9303c381a806932
1 parent
8acd64ea
优化历史录像下载,目前已测试大华国标级联下载
Showing
4 changed files
with
49 additions
and
30 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
| ... | ... | @@ -541,11 +541,14 @@ public class SIPCommander implements ISIPCommander { |
| 541 | 541 | content.append("a=downloadspeed:" + downloadSpeed + "\r\n"); |
| 542 | 542 | |
| 543 | 543 | content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc |
| 544 | - | |
| 544 | + logger.debug("此时请求下载信令的ssrc===>{}",ssrcInfo.getSsrc()); | |
| 545 | 545 | HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId()); |
| 546 | 546 | // 添加订阅 |
| 547 | + CallIdHeader newCallIdHeader = sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()), device.getTransport()); | |
| 548 | + String callId=newCallIdHeader.getCallId(); | |
| 547 | 549 | subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> { |
| 548 | - hookEvent.call(new InviteStreamInfo(mediaServerItem, json,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); | |
| 550 | + logger.debug("sipc 添加订阅===callId {}",callId); | |
| 551 | + hookEvent.call(new InviteStreamInfo(mediaServerItem, json,callId, "rtp", ssrcInfo.getStream())); | |
| 549 | 552 | subscribe.removeSubscribe(hookSubscribe); |
| 550 | 553 | hookSubscribe.getContent().put("regist", false); |
| 551 | 554 | hookSubscribe.getContent().put("schema", "rtsp"); |
| ... | ... | @@ -554,7 +557,7 @@ public class SIPCommander implements ISIPCommander { |
| 554 | 557 | (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> { |
| 555 | 558 | logger.info("[录像]下载结束, 发送BYE"); |
| 556 | 559 | try { |
| 557 | - streamByeCmd(device, channelId, ssrcInfo.getStream(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId()); | |
| 560 | + streamByeCmd(device, channelId, ssrcInfo.getStream(),callId); | |
| 558 | 561 | } catch (InvalidArgumentException | ParseException | SipException | |
| 559 | 562 | SsrcTransactionNotFoundException e) { |
| 560 | 563 | logger.error("[录像]下载结束, 发送BYE失败 {}", e.getMessage()); |
| ... | ... | @@ -562,15 +565,23 @@ public class SIPCommander implements ISIPCommander { |
| 562 | 565 | }); |
| 563 | 566 | }); |
| 564 | 567 | |
| 565 | - Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()), ssrcInfo.getSsrc()); | |
| 568 | + Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,newCallIdHeader, ssrcInfo.getSsrc()); | |
| 566 | 569 | if (inviteStreamCallback != null) { |
| 567 | - inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream())); | |
| 570 | + inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,callId, "rtp", ssrcInfo.getStream())); | |
| 568 | 571 | } |
| 569 | 572 | |
| 570 | 573 | sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, event -> { |
| 571 | 574 | ResponseEvent responseEvent = (ResponseEvent) event.event; |
| 572 | 575 | SIPResponse response = (SIPResponse) responseEvent.getResponse(); |
| 573 | - streamSession.put(device.getDeviceId(), channelId, response.getCallIdHeader().getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download); | |
| 576 | + String contentString =new String(response.getRawContent()); | |
| 577 | + int ssrcIndex = contentString.indexOf("y="); | |
| 578 | + String ssrc=ssrcInfo.getSsrc(); | |
| 579 | + if (ssrcIndex >= 0) { | |
| 580 | + ssrc = contentString.substring(ssrcIndex + 2, ssrcIndex + 12); | |
| 581 | + } | |
| 582 | + logger.debug("接收到的下载响应ssrc====>{}",ssrcInfo.getSsrc()); | |
| 583 | + logger.debug("接收到的下载响应ssrc====>{}",ssrc); | |
| 584 | + streamSession.put(device.getDeviceId(), channelId, response.getCallIdHeader().getCallId(), ssrcInfo.getStream(), ssrc, mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download); | |
| 574 | 585 | okEvent.response(event); |
| 575 | 586 | }); |
| 576 | 587 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| ... | ... | @@ -635,23 +635,23 @@ public class PlayServiceImpl implements IPlayService { |
| 635 | 635 | hookCallBack.call(downloadResult); |
| 636 | 636 | streamSession.remove(device.getDeviceId(), channelId, ssrcInfo.getStream()); |
| 637 | 637 | }; |
| 638 | - | |
| 638 | + InviteStreamCallback hookEvent = (InviteStreamInfo inviteStreamInfo) -> { | |
| 639 | + logger.info("收到订阅消息: " + inviteStreamInfo.getCallId()); | |
| 640 | + dynamicTask.stop(downLoadTimeOutTaskKey); | |
| 641 | + StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); | |
| 642 | + streamInfo.setStartTime(startTime); | |
| 643 | + streamInfo.setEndTime(endTime); | |
| 644 | + redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId()); | |
| 645 | + downloadResult.setCode(ErrorCode.SUCCESS.getCode()); | |
| 646 | + downloadResult.setMsg(ErrorCode.SUCCESS.getMsg()); | |
| 647 | + downloadResult.setData(streamInfo); | |
| 648 | + downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); | |
| 649 | + downloadResult.setResponse(inviteStreamInfo.getResponse()); | |
| 650 | + hookCallBack.call(downloadResult); | |
| 651 | + }; | |
| 639 | 652 | try { |
| 640 | 653 | cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack, |
| 641 | - inviteStreamInfo -> { | |
| 642 | - logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString()); | |
| 643 | - dynamicTask.stop(downLoadTimeOutTaskKey); | |
| 644 | - StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId); | |
| 645 | - streamInfo.setStartTime(startTime); | |
| 646 | - streamInfo.setEndTime(endTime); | |
| 647 | - redisCatchStorage.startDownload(streamInfo, inviteStreamInfo.getCallId()); | |
| 648 | - downloadResult.setCode(ErrorCode.SUCCESS.getCode()); | |
| 649 | - downloadResult.setMsg(ErrorCode.SUCCESS.getMsg()); | |
| 650 | - downloadResult.setData(streamInfo); | |
| 651 | - downloadResult.setMediaServerItem(inviteStreamInfo.getMediaServerItem()); | |
| 652 | - downloadResult.setResponse(inviteStreamInfo.getResponse()); | |
| 653 | - hookCallBack.call(downloadResult); | |
| 654 | - }, errorEvent, eventResult -> | |
| 654 | + hookEvent, errorEvent, eventResult -> | |
| 655 | 655 | { |
| 656 | 656 | if (eventResult.type == SipSubscribe.EventResultType.response) { |
| 657 | 657 | ResponseEvent responseEvent = (ResponseEvent) eventResult.event; |
| ... | ... | @@ -690,9 +690,9 @@ public class PlayServiceImpl implements IPlayService { |
| 690 | 690 | subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject response) -> { |
| 691 | 691 | logger.info("[ZLM HOOK] ssrc修正后收到订阅消息: " + response.toJSONString()); |
| 692 | 692 | dynamicTask.stop(downLoadTimeOutTaskKey); |
| 693 | - // hook响应,TODO 此处待处理 | |
| 694 | -// onPublishHandlerForPlayback(mediaServerItemInUse, response, device.getDeviceId(), channelId, playBackCallback); | |
| 695 | -// hookCallBack.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream())); | |
| 693 | + // hook响应 | |
| 694 | + onPublishHandlerForPlayback(mediaServerItemInUse, response, device.getDeviceId(), channelId, hookCallBack); | |
| 695 | + hookEvent.call(new InviteStreamInfo(mediaServerItem, null, eventResult.callId, "rtp", ssrcInfo.getStream())); | |
| 696 | 696 | }); |
| 697 | 697 | } |
| 698 | 698 | // 关闭rtp server | ... | ... |
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
| ... | ... | @@ -177,12 +177,14 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { |
| 177 | 177 | @Override |
| 178 | 178 | public boolean startDownload(StreamInfo stream, String callId) { |
| 179 | 179 | boolean result; |
| 180 | + String key=String.format("%S_%s_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, | |
| 181 | + userSetting.getServerId(), stream.getMediaServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId); | |
| 180 | 182 | if (stream.getProgress() == 1) { |
| 181 | - result = RedisUtil.set(String.format("%S_%s_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, | |
| 182 | - userSetting.getServerId(), stream.getMediaServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId), stream); | |
| 183 | + logger.debug("添加下载缓存==已完成下载=》{}",key); | |
| 184 | + result = RedisUtil.set(key, stream); | |
| 183 | 185 | }else { |
| 184 | - result = RedisUtil.set(String.format("%S_%s_%s_%s_%s_%s_%s", VideoManagerConstants.DOWNLOAD_PREFIX, | |
| 185 | - userSetting.getServerId(), stream.getMediaServerId(), stream.getDeviceID(), stream.getChannelId(), stream.getStream(), callId), stream, 60*60); | |
| 186 | + logger.debug("添加下载缓存==未完成下载=》{}",key); | |
| 187 | + result = RedisUtil.set(key, stream, 60*60); | |
| 186 | 188 | } |
| 187 | 189 | return result; |
| 188 | 190 | } |
| ... | ... | @@ -617,7 +619,7 @@ public class RedisCatchStorageImpl implements IRedisCatchStorage { |
| 617 | 619 | stream, |
| 618 | 620 | callId |
| 619 | 621 | ); |
| 620 | - List<Object> streamInfoScan = RedisUtil.scan(key); | |
| 622 | + List<Object> streamInfoScan = RedisUtil.scan2(key); | |
| 621 | 623 | if (streamInfoScan.size() > 0) { |
| 622 | 624 | return (StreamInfo) RedisUtil.get((String) streamInfoScan.get(0)); |
| 623 | 625 | }else { | ... | ... |
src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
| ... | ... | @@ -881,7 +881,13 @@ public class RedisUtil { |
| 881 | 881 | |
| 882 | 882 | return new ArrayList<>(resultKeys); |
| 883 | 883 | } |
| 884 | - | |
| 884 | + public static List<Object> scan2(String query) { | |
| 885 | + if (redisTemplate == null) { | |
| 886 | + redisTemplate = SpringBeanFactory.getBean("redisTemplate"); | |
| 887 | + } | |
| 888 | + Set<String> keys = redisTemplate.keys(query); | |
| 889 | + return new ArrayList<>(keys); | |
| 890 | + } | |
| 885 | 891 | // ============================== 消息发送与订阅 ============================== |
| 886 | 892 | public static void convertAndSend(String channel, JSONObject msg) { |
| 887 | 893 | if (redisTemplate == null) { | ... | ... |