|  | @@ -470,8 +470,9 @@ public class SIPCommander implements ISIPCommander {
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  |      @Override
 |  |      @Override
 | 
											
												
													
														|  |      public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
 |  |      public void downloadStreamCmd(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, Device device, String channelId,
 | 
											
												
													
														|  | -                                  String startTime, String endTime, int downloadSpeed, InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent,
 |  | 
 | 
											
												
													
														|  | -                                  SipSubscribe.Event errorEvent) throws InvalidArgumentException, SipException, ParseException {
 |  | 
 | 
											
												
													
														|  | 
 |  | +                                  String startTime, String endTime, int downloadSpeed,
 | 
											
												
													
														|  | 
 |  | +                                  InviteStreamCallback inviteStreamCallback, InviteStreamCallback hookEvent,
 | 
											
												
													
														|  | 
 |  | +                                  SipSubscribe.Event errorEvent,SipSubscribe.Event okEvent) throws InvalidArgumentException, SipException, ParseException {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
 |  |          logger.info("{} 分配的ZLM为: {} [{}:{}]", ssrcInfo.getStream(), mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
 | 
											
												
													
														|  |          String sdpIp;
 |  |          String sdpIp;
 | 
											
										
											
												
													
														|  | @@ -540,11 +541,14 @@ public class SIPCommander implements ISIPCommander {
 | 
											
												
													
														|  |          content.append("a=downloadspeed:" + downloadSpeed + "\r\n");
 |  |          content.append("a=downloadspeed:" + downloadSpeed + "\r\n");
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
 |  |          content.append("y=" + ssrcInfo.getSsrc() + "\r\n");//ssrc
 | 
											
												
													
														|  | -        
 |  | 
 | 
											
												
													
														|  | 
 |  | +        logger.debug("此时请求下载信令的ssrc===>{}",ssrcInfo.getSsrc());
 | 
											
												
													
														|  |          HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId());
 |  |          HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, null, mediaServerItem.getId());
 | 
											
												
													
														|  |          // 添加订阅
 |  |          // 添加订阅
 | 
											
												
													
														|  | 
 |  | +        CallIdHeader newCallIdHeader = sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()), device.getTransport());
 | 
											
												
													
														|  | 
 |  | +        String callId=newCallIdHeader.getCallId();
 | 
											
												
													
														|  |          subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
 |  |          subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json) -> {
 | 
											
												
													
														|  | -            hookEvent.call(new InviteStreamInfo(mediaServerItem, json,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
 |  | 
 | 
											
												
													
														|  | 
 |  | +            logger.debug("sipc 添加订阅===callId {}",callId);
 | 
											
												
													
														|  | 
 |  | +            hookEvent.call(new InviteStreamInfo(mediaServerItem, json,callId, "rtp", ssrcInfo.getStream()));
 | 
											
												
													
														|  |              subscribe.removeSubscribe(hookSubscribe);
 |  |              subscribe.removeSubscribe(hookSubscribe);
 | 
											
												
													
														|  |              hookSubscribe.getContent().put("regist", false);
 |  |              hookSubscribe.getContent().put("regist", false);
 | 
											
												
													
														|  |              hookSubscribe.getContent().put("schema", "rtsp");
 |  |              hookSubscribe.getContent().put("schema", "rtsp");
 | 
											
										
											
												
													
														|  | @@ -553,7 +557,7 @@ public class SIPCommander implements ISIPCommander {
 | 
											
												
													
														|  |                      (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> {
 |  |                      (MediaServerItem mediaServerItemForEnd, JSONObject jsonForEnd) -> {
 | 
											
												
													
														|  |                          logger.info("[录像]下载结束, 发送BYE");
 |  |                          logger.info("[录像]下载结束, 发送BYE");
 | 
											
												
													
														|  |                          try {
 |  |                          try {
 | 
											
												
													
														|  | -                            streamByeCmd(device, channelId, ssrcInfo.getStream(),sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId());
 |  | 
 | 
											
												
													
														|  | 
 |  | +                            streamByeCmd(device, channelId, ssrcInfo.getStream(),callId);
 | 
											
												
													
														|  |                          } catch (InvalidArgumentException | ParseException | SipException |
 |  |                          } catch (InvalidArgumentException | ParseException | SipException |
 | 
											
												
													
														|  |                                   SsrcTransactionNotFoundException e) {
 |  |                                   SsrcTransactionNotFoundException e) {
 | 
											
												
													
														|  |                              logger.error("[录像]下载结束, 发送BYE失败 {}", e.getMessage());
 |  |                              logger.error("[录像]下载结束, 发送BYE失败 {}", e.getMessage());
 | 
											
										
											
												
													
														|  | @@ -561,15 +565,24 @@ public class SIPCommander implements ISIPCommander {
 | 
											
												
													
														|  |                      });
 |  |                      });
 | 
											
												
													
														|  |          });
 |  |          });
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()), ssrcInfo.getSsrc());
 |  | 
 | 
											
												
													
														|  | 
 |  | +        Request request = headerProvider.createPlaybackInviteRequest(device, channelId, content.toString(), null, SipUtils.getNewFromTag(), null,newCallIdHeader, ssrcInfo.getSsrc());
 | 
											
												
													
														|  |          if (inviteStreamCallback != null) {
 |  |          if (inviteStreamCallback != null) {
 | 
											
												
													
														|  | -            inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,sipSender.getNewCallIdHeader(sipLayer.getLocalIp(device.getLocalIp()),device.getTransport()).getCallId(), "rtp", ssrcInfo.getStream()));
 |  | 
 | 
											
												
													
														|  | 
 |  | +            inviteStreamCallback.call(new InviteStreamInfo(mediaServerItem, null,callId, "rtp", ssrcInfo.getStream()));
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, okEvent -> {
 |  | 
 | 
											
												
													
														|  | -            ResponseEvent responseEvent = (ResponseEvent) okEvent.event;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        sipSender.transmitRequest(sipLayer.getLocalIp(device.getLocalIp()), request, errorEvent, event -> {
 | 
											
												
													
														|  | 
 |  | +            ResponseEvent responseEvent = (ResponseEvent) event.event;
 | 
											
												
													
														|  |              SIPResponse response = (SIPResponse) responseEvent.getResponse();
 |  |              SIPResponse response = (SIPResponse) responseEvent.getResponse();
 | 
											
												
													
														|  | -            streamSession.put(device.getDeviceId(), channelId, response.getCallIdHeader().getCallId(), ssrcInfo.getStream(), ssrcInfo.getSsrc(), mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download);
 |  | 
 | 
											
												
													
														|  | 
 |  | +            String contentString =new String(response.getRawContent());
 | 
											
												
													
														|  | 
 |  | +            int ssrcIndex = contentString.indexOf("y=");
 | 
											
												
													
														|  | 
 |  | +            String ssrc=ssrcInfo.getSsrc();
 | 
											
												
													
														|  | 
 |  | +            if (ssrcIndex >= 0) {
 | 
											
												
													
														|  | 
 |  | +                ssrc = contentString.substring(ssrcIndex + 2, ssrcIndex + 12);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            logger.debug("接收到的下载响应ssrc====>{}",ssrcInfo.getSsrc());
 | 
											
												
													
														|  | 
 |  | +            logger.debug("接收到的下载响应ssrc====>{}",ssrc);
 | 
											
												
													
														|  | 
 |  | +            streamSession.put(device.getDeviceId(), channelId, response.getCallIdHeader().getCallId(), ssrcInfo.getStream(), ssrc, mediaServerItem.getId(), response, VideoStreamSessionManager.SessionType.download);
 | 
											
												
													
														|  | 
 |  | +            okEvent.response(event);
 | 
											
												
													
														|  |          });
 |  |          });
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -801,7 +814,6 @@ public class SIPCommander implements ISIPCommander {
 | 
											
												
													
														|  |       *
 |  |       *
 | 
											
												
													
														|  |       * @param device      视频设备
 |  |       * @param device      视频设备
 | 
											
												
													
														|  |       * @param channelId      通道id,非通道则是设备本身
 |  |       * @param channelId      通道id,非通道则是设备本身
 | 
											
												
													
														|  | -     * @param frontCmd     上级平台的指令,如果存在则直接下发
 |  | 
 | 
											
												
													
														|  |       * @param enabled     看守位使能:1 = 开启,0 = 关闭
 |  |       * @param enabled     看守位使能:1 = 开启,0 = 关闭
 | 
											
												
													
														|  |       * @param resetTime   自动归位时间间隔,开启看守位时使用,单位:秒(s)
 |  |       * @param resetTime   自动归位时间间隔,开启看守位时使用,单位:秒(s)
 | 
											
												
													
														|  |       * @param presetIndex 调用预置位编号,开启看守位时使用,取值范围0~255
 |  |       * @param presetIndex 调用预置位编号,开启看守位时使用,取值范围0~255
 |