|  | @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSONArray;
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.common.StreamInfo;
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.conf.DynamicTask;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.conf.UserSetting;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.bean.*;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
 | 
	
	
		
			
				|  | @@ -86,6 +87,9 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private UserSetting userSetting;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private DynamicTask dynamicTask;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -100,7 +104,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |          String uuid = UUID.randomUUID().toString();
 | 
	
		
			
				|  |  |          msg.setId(uuid);
 | 
	
		
			
				|  |  |          playResult.setUuid(uuid);
 | 
	
		
			
				|  |  | -        DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(userSetting.getPlayTimeout());
 | 
	
		
			
				|  |  | +        DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(userSetting.getPlayTimeout().longValue());
 | 
	
		
			
				|  |  |          playResult.setResult(result);
 | 
	
		
			
				|  |  |          // 录像查询以channelId作为deviceId查询
 | 
	
		
			
				|  |  |          resultHolder.put(key, uuid, result);
 | 
	
	
		
			
				|  | @@ -237,30 +241,27 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 超时处理
 | 
	
		
			
				|  |  | -        Timer timer = new Timer();
 | 
	
		
			
				|  |  | +        String timeOutTaskKey = UUID.randomUUID().toString();
 | 
	
		
			
				|  |  |          SSRCInfo finalSsrcInfo = ssrcInfo;
 | 
	
		
			
				|  |  | -        timer.schedule(new TimerTask() {
 | 
	
		
			
				|  |  | -            @Override
 | 
	
		
			
				|  |  | -            public void run() {
 | 
	
		
			
				|  |  | -                logger.warn(String.format("设备点播超时,deviceId:%s ,channelId:%s", device.getDeviceId(), channelId));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
 | 
	
		
			
				|  |  | -                if (dialog != null) {
 | 
	
		
			
				|  |  | -                    timeoutCallback.run(1, "收流超时");
 | 
	
		
			
				|  |  | -                    // 点播超时回复BYE 同时释放ssrc以及此次点播的资源
 | 
	
		
			
				|  |  | -                    cmder.streamByeCmd(device.getDeviceId(), channelId, finalSsrcInfo.getStream(), null);
 | 
	
		
			
				|  |  | -                }else {
 | 
	
		
			
				|  |  | -                    timeoutCallback.run(0, "点播超时");
 | 
	
		
			
				|  |  | -                    mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
 | 
	
		
			
				|  |  | -                    mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
 | 
	
		
			
				|  |  | -                    streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +        dynamicTask.startDelay( timeOutTaskKey,()->{
 | 
	
		
			
				|  |  | +            logger.warn(String.format("设备点播超时,deviceId:%s ,channelId:%s", device.getDeviceId(), channelId));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            SIPDialog dialog = streamSession.getDialogByStream(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
 | 
	
		
			
				|  |  | +            if (dialog != null) {
 | 
	
		
			
				|  |  | +                timeoutCallback.run(1, "收流超时");
 | 
	
		
			
				|  |  | +                // 点播超时回复BYE 同时释放ssrc以及此次点播的资源
 | 
	
		
			
				|  |  | +                cmder.streamByeCmd(device.getDeviceId(), channelId, finalSsrcInfo.getStream(), null);
 | 
	
		
			
				|  |  | +            }else {
 | 
	
		
			
				|  |  | +                timeoutCallback.run(0, "点播超时");
 | 
	
		
			
				|  |  | +                mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
 | 
	
		
			
				|  |  | +                mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
 | 
	
		
			
				|  |  | +                streamSession.remove(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -        }, userSetting.getPlayTimeout());
 | 
	
		
			
				|  |  | +        }, userSetting.getPlayTimeout()*1000);
 | 
	
		
			
				|  |  |          final String ssrc = ssrcInfo.getSsrc();
 | 
	
		
			
				|  |  |          cmder.playStreamCmd(mediaServerItem, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
 | 
	
		
			
				|  |  |              logger.info("收到订阅消息: " + response.toJSONString());
 | 
	
		
			
				|  |  | -            timer.cancel();
 | 
	
		
			
				|  |  | +            dynamicTask.stop(timeOutTaskKey);
 | 
	
		
			
				|  |  |              // hook响应
 | 
	
		
			
				|  |  |              onPublishHandlerForPlay(mediaServerItemInuse, response, device.getDeviceId(), channelId, uuid);
 | 
	
		
			
				|  |  |              hookEvent.response(mediaServerItemInuse, response);
 | 
	
	
		
			
				|  | @@ -292,7 +293,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }, (event) -> {
 | 
	
		
			
				|  |  | -            timer.cancel();
 | 
	
		
			
				|  |  | +            dynamicTask.stop(timeOutTaskKey);
 | 
	
		
			
				|  |  |              mediaServerService.closeRTPServer(device.getDeviceId(), channelId, finalSsrcInfo.getStream());
 | 
	
		
			
				|  |  |              // 释放ssrc
 | 
	
		
			
				|  |  |              mediaServerService.releaseSsrc(mediaServerItem.getId(), finalSsrcInfo.getSsrc());
 | 
	
	
		
			
				|  | @@ -334,7 +335,9 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public MediaServerItem getNewMediaServerItem(Device device) {
 | 
	
		
			
				|  |  | -        if (device == null) return null;
 | 
	
		
			
				|  |  | +        if (device == null) {
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          String mediaServerId = device.getMediaServerId();
 | 
	
		
			
				|  |  |          MediaServerItem mediaServerItem;
 | 
	
		
			
				|  |  |          if (mediaServerId == null) {
 | 
	
	
		
			
				|  | @@ -353,7 +356,9 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                                                             String endTime,InviteStreamCallback inviteStreamCallback,
 | 
	
		
			
				|  |  |                                                             PlayBackCallback callback) {
 | 
	
		
			
				|  |  |          Device device = storager.queryVideoDevice(deviceId);
 | 
	
		
			
				|  |  | -        if (device == null) return null;
 | 
	
		
			
				|  |  | +        if (device == null) {
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
 | 
	
		
			
				|  |  |          SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -365,7 +370,9 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                                                             String deviceId, String channelId, String startTime,
 | 
	
		
			
				|  |  |                                                             String endTime, InviteStreamCallback infoCallBack,
 | 
	
		
			
				|  |  |                                                             PlayBackCallback playBackCallback) {
 | 
	
		
			
				|  |  | -        if (mediaServerItem == null || ssrcInfo == null) return null;
 | 
	
		
			
				|  |  | +        if (mediaServerItem == null || ssrcInfo == null) {
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          String uuid = UUID.randomUUID().toString();
 | 
	
		
			
				|  |  |          String key = DeferredResultHolder.CALLBACK_CMD_PLAYBACK + deviceId + channelId;
 | 
	
		
			
				|  |  |          DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L);
 | 
	
	
		
			
				|  | @@ -380,34 +387,31 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |          msg.setId(uuid);
 | 
	
		
			
				|  |  |          msg.setKey(key);
 | 
	
		
			
				|  |  |          PlayBackResult<RequestMessage> playBackResult = new PlayBackResult<>();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Timer timer = new Timer();
 | 
	
		
			
				|  |  | -        timer.schedule(new TimerTask() {
 | 
	
		
			
				|  |  | -            @Override
 | 
	
		
			
				|  |  | -            public void run() {
 | 
	
		
			
				|  |  | -                logger.warn(String.format("设备回放超时,deviceId:%s ,channelId:%s", deviceId, channelId));
 | 
	
		
			
				|  |  | -                playBackResult.setCode(-1);
 | 
	
		
			
				|  |  | -                playBackResult.setData(msg);
 | 
	
		
			
				|  |  | -                playBackCallback.call(playBackResult);
 | 
	
		
			
				|  |  | -                SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | +        String  playBackTimeOutTaskKey = UUID.randomUUID().toString();
 | 
	
		
			
				|  |  | +        dynamicTask.startDelay(playBackTimeOutTaskKey, ()->{
 | 
	
		
			
				|  |  | +            logger.warn(String.format("设备回放超时,deviceId:%s ,channelId:%s", deviceId, channelId));
 | 
	
		
			
				|  |  | +            playBackResult.setCode(-1);
 | 
	
		
			
				|  |  | +            playBackResult.setData(msg);
 | 
	
		
			
				|  |  | +            playBackCallback.call(playBackResult);
 | 
	
		
			
				|  |  | +            SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | +            // 点播超时回复BYE 同时释放ssrc以及此次点播的资源
 | 
	
		
			
				|  |  | +            if (dialog != null) {
 | 
	
		
			
				|  |  |                  // 点播超时回复BYE 同时释放ssrc以及此次点播的资源
 | 
	
		
			
				|  |  | -                if (dialog != null) {
 | 
	
		
			
				|  |  | -                    // 点播超时回复BYE 同时释放ssrc以及此次点播的资源
 | 
	
		
			
				|  |  | -                    cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
 | 
	
		
			
				|  |  | -                }else {
 | 
	
		
			
				|  |  | -                    mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
 | 
	
		
			
				|  |  | -                    mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | -                    streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  |                  cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
 | 
	
		
			
				|  |  | -                // 回复之前所有的点播请求
 | 
	
		
			
				|  |  | -                playBackCallback.call(playBackResult);
 | 
	
		
			
				|  |  | +            }else {
 | 
	
		
			
				|  |  | +                mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
 | 
	
		
			
				|  |  | +                mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | +                streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -        }, userSetting.getPlayTimeout());
 | 
	
		
			
				|  |  | +            cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
 | 
	
		
			
				|  |  | +            // 回复之前所有的点播请求
 | 
	
		
			
				|  |  | +            playBackCallback.call(playBackResult);
 | 
	
		
			
				|  |  | +        }, userSetting.getPlayTimeout()*1000);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          cmder.playbackStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, infoCallBack,
 | 
	
		
			
				|  |  |                  (InviteStreamInfo inviteStreamInfo) -> {
 | 
	
		
			
				|  |  |                      logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString());
 | 
	
		
			
				|  |  | -                    timer.cancel();
 | 
	
		
			
				|  |  | +                    dynamicTask.stop(playBackTimeOutTaskKey);
 | 
	
		
			
				|  |  |                      StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
 | 
	
		
			
				|  |  |                      if (streamInfo == null) {
 | 
	
		
			
				|  |  |                          logger.warn("设备回放API调用失败!");
 | 
	
	
		
			
				|  | @@ -425,7 +429,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                      playBackResult.setResponse(inviteStreamInfo.getResponse());
 | 
	
		
			
				|  |  |                      playBackCallback.call(playBackResult);
 | 
	
		
			
				|  |  |                  }, event -> {
 | 
	
		
			
				|  |  | -                    timer.cancel();
 | 
	
		
			
				|  |  | +                    dynamicTask.stop(playBackTimeOutTaskKey);
 | 
	
		
			
				|  |  |                      msg.setData(String.format("回放失败, 错误码: %s, %s", event.statusCode, event.msg));
 | 
	
		
			
				|  |  |                      playBackResult.setCode(-1);
 | 
	
		
			
				|  |  |                      playBackResult.setData(msg);
 | 
	
	
		
			
				|  | @@ -439,7 +443,9 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public DeferredResult<ResponseEntity<String>> download(String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
 | 
	
		
			
				|  |  |          Device device = storager.queryVideoDevice(deviceId);
 | 
	
		
			
				|  |  | -        if (device == null) return null;
 | 
	
		
			
				|  |  | +        if (device == null) {
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          MediaServerItem newMediaServerItem = getNewMediaServerItem(device);
 | 
	
		
			
				|  |  |          SSRCInfo ssrcInfo = mediaServerService.openRTPServer(newMediaServerItem, null, true);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -448,7 +454,9 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public DeferredResult<ResponseEntity<String>> download(MediaServerItem mediaServerItem, SSRCInfo ssrcInfo, String deviceId, String channelId, String startTime, String endTime, int downloadSpeed, InviteStreamCallback infoCallBack, PlayBackCallback hookCallBack) {
 | 
	
		
			
				|  |  | -        if (mediaServerItem == null || ssrcInfo == null) return null;
 | 
	
		
			
				|  |  | +        if (mediaServerItem == null || ssrcInfo == null) {
 | 
	
		
			
				|  |  | +            return null;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          String uuid = UUID.randomUUID().toString();
 | 
	
		
			
				|  |  |          String key = DeferredResultHolder.CALLBACK_CMD_DOWNLOAD + deviceId + channelId;
 | 
	
		
			
				|  |  |          DeferredResult<ResponseEntity<String>> result = new DeferredResult<>(30000L);
 | 
	
	
		
			
				|  | @@ -467,34 +475,31 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |          PlayBackResult<RequestMessage> downloadResult = new PlayBackResult<>();
 | 
	
		
			
				|  |  |          downloadResult.setData(msg);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        Timer timer = new Timer();
 | 
	
		
			
				|  |  | -        timer.schedule(new TimerTask() {
 | 
	
		
			
				|  |  | -            @Override
 | 
	
		
			
				|  |  | -            public void run() {
 | 
	
		
			
				|  |  | -                logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId));
 | 
	
		
			
				|  |  | -                wvpResult.setCode(-1);
 | 
	
		
			
				|  |  | -                wvpResult.setMsg("录像下载请求超时");
 | 
	
		
			
				|  |  | -                downloadResult.setCode(-1);
 | 
	
		
			
				|  |  | -                hookCallBack.call(downloadResult);
 | 
	
		
			
				|  |  | -                SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | +        String downLoadTimeOutTaskKey = UUID.randomUUID().toString();
 | 
	
		
			
				|  |  | +        dynamicTask.startDelay(downLoadTimeOutTaskKey, ()->{
 | 
	
		
			
				|  |  | +            logger.warn(String.format("录像下载请求超时,deviceId:%s ,channelId:%s", deviceId, channelId));
 | 
	
		
			
				|  |  | +            wvpResult.setCode(-1);
 | 
	
		
			
				|  |  | +            wvpResult.setMsg("录像下载请求超时");
 | 
	
		
			
				|  |  | +            downloadResult.setCode(-1);
 | 
	
		
			
				|  |  | +            hookCallBack.call(downloadResult);
 | 
	
		
			
				|  |  | +            SIPDialog dialog = streamSession.getDialogByStream(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | +            // 点播超时回复BYE 同时释放ssrc以及此次点播的资源
 | 
	
		
			
				|  |  | +            if (dialog != null) {
 | 
	
		
			
				|  |  |                  // 点播超时回复BYE 同时释放ssrc以及此次点播的资源
 | 
	
		
			
				|  |  | -                if (dialog != null) {
 | 
	
		
			
				|  |  | -                    // 点播超时回复BYE 同时释放ssrc以及此次点播的资源
 | 
	
		
			
				|  |  | -                    cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
 | 
	
		
			
				|  |  | -                }else {
 | 
	
		
			
				|  |  | -                    mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
 | 
	
		
			
				|  |  | -                    mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | -                    streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  |                  cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
 | 
	
		
			
				|  |  | -                // 回复之前所有的点播请求
 | 
	
		
			
				|  |  | -                hookCallBack.call(downloadResult);
 | 
	
		
			
				|  |  | +            }else {
 | 
	
		
			
				|  |  | +                mediaServerService.releaseSsrc(mediaServerItem.getId(), ssrcInfo.getSsrc());
 | 
	
		
			
				|  |  | +                mediaServerService.closeRTPServer(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  | +                streamSession.remove(deviceId, channelId, ssrcInfo.getStream());
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -        }, userSetting.getPlayTimeout());
 | 
	
		
			
				|  |  | +            cmder.streamByeCmd(device.getDeviceId(), channelId, ssrcInfo.getStream(), null);
 | 
	
		
			
				|  |  | +            // 回复之前所有的点播请求
 | 
	
		
			
				|  |  | +            hookCallBack.call(downloadResult);
 | 
	
		
			
				|  |  | +        }, userSetting.getPlayTimeout()*1000);
 | 
	
		
			
				|  |  |          cmder.downloadStreamCmd(mediaServerItem, ssrcInfo, device, channelId, startTime, endTime, downloadSpeed, infoCallBack,
 | 
	
		
			
				|  |  |                  inviteStreamInfo -> {
 | 
	
		
			
				|  |  |                      logger.info("收到订阅消息: " + inviteStreamInfo.getResponse().toJSONString());
 | 
	
		
			
				|  |  | -                    timer.cancel();
 | 
	
		
			
				|  |  | +                    dynamicTask.stop(downLoadTimeOutTaskKey);
 | 
	
		
			
				|  |  |                      StreamInfo streamInfo = onPublishHandler(inviteStreamInfo.getMediaServerItem(), inviteStreamInfo.getResponse(), deviceId, channelId);
 | 
	
		
			
				|  |  |                      streamInfo.setStartTime(startTime);
 | 
	
		
			
				|  |  |                      streamInfo.setEndTime(endTime);
 | 
	
	
		
			
				|  | @@ -515,7 +520,7 @@ public class PlayServiceImpl implements IPlayService {
 | 
	
		
			
				|  |  |                      downloadResult.setResponse(inviteStreamInfo.getResponse());
 | 
	
		
			
				|  |  |                      hookCallBack.call(downloadResult);
 | 
	
		
			
				|  |  |                  }, event -> {
 | 
	
		
			
				|  |  | -                    timer.cancel();
 | 
	
		
			
				|  |  | +                    dynamicTask.stop(downLoadTimeOutTaskKey);
 | 
	
		
			
				|  |  |                      downloadResult.setCode(-1);
 | 
	
		
			
				|  |  |                      wvpResult.setCode(-1);
 | 
	
		
			
				|  |  |                      wvpResult.setMsg(String.format("录像下载失败, 错误码: %s, %s", event.statusCode, event.msg));
 |