|  | @@ -11,6 +11,8 @@ import javax.sip.header.HeaderAddress;
 | 
	
		
			
				|  |  |  import javax.sip.header.ToHeader;
 | 
	
		
			
				|  |  |  import javax.sip.message.Response;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.common.StreamInfo;
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.gb28181.bean.Device;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.gb28181.transmit.request.SIPRequestAbstractProcessor;
 | 
	
	
		
			
				|  | @@ -18,6 +20,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.service.IMediaServerService;
 | 
	
		
			
				|  |  |  import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
 | 
	
		
			
				|  |  | +import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 | 
	
		
			
				|  |  |  import org.slf4j.Logger;
 | 
	
		
			
				|  |  |  import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -38,6 +41,8 @@ public class ByeRequestProcessor extends SIPRequestAbstractProcessor {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	private IRedisCatchStorage redisCatchStorage;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	private IVideoManagerStorager storager;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	private ZLMRTPServerFactory zlmrtpServerFactory;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	private IMediaServerService mediaServerService;
 | 
	
	
		
			
				|  | @@ -56,20 +61,32 @@ public class ByeRequestProcessor extends SIPRequestAbstractProcessor {
 | 
	
		
			
				|  |  |  				String platformGbId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(FromHeader.NAME)).getAddress().getURI()).getUser();
 | 
	
		
			
				|  |  |  				String channelId = ((SipURI) ((HeaderAddress) evt.getRequest().getHeader(ToHeader.NAME)).getAddress().getURI()).getUser();
 | 
	
		
			
				|  |  |  				SendRtpItem sendRtpItem =  redisCatchStorage.querySendRTPServer(platformGbId, channelId);
 | 
	
		
			
				|  |  | -				if (sendRtpItem == null) return;
 | 
	
		
			
				|  |  | -				String streamId = sendRtpItem.getStreamId();
 | 
	
		
			
				|  |  | -				Map<String, Object> param = new HashMap<>();
 | 
	
		
			
				|  |  | -				param.put("vhost","__defaultVhost__");
 | 
	
		
			
				|  |  | -				param.put("app",sendRtpItem.getApp());
 | 
	
		
			
				|  |  | -				param.put("stream",streamId);
 | 
	
		
			
				|  |  | -				param.put("ssrc",sendRtpItem.getSsrc());
 | 
	
		
			
				|  |  | -				logger.info("停止向上级推流:" + streamId);
 | 
	
		
			
				|  |  | -				MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
 | 
	
		
			
				|  |  | -				zlmrtpServerFactory.stopSendRtpStream(mediaInfo, param);
 | 
	
		
			
				|  |  | -				redisCatchStorage.deleteSendRTPServer(platformGbId, channelId);
 | 
	
		
			
				|  |  | -				if (zlmrtpServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId) == 0) {
 | 
	
		
			
				|  |  | -					logger.info(streamId + "无其它观看者,通知设备停止推流");
 | 
	
		
			
				|  |  | -					cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId);
 | 
	
		
			
				|  |  | +				logger.info("收到bye, [{}/{}]", platformGbId, channelId);
 | 
	
		
			
				|  |  | +				if (sendRtpItem != null){
 | 
	
		
			
				|  |  | +					String streamId = sendRtpItem.getStreamId();
 | 
	
		
			
				|  |  | +					Map<String, Object> param = new HashMap<>();
 | 
	
		
			
				|  |  | +					param.put("vhost","__defaultVhost__");
 | 
	
		
			
				|  |  | +					param.put("app",sendRtpItem.getApp());
 | 
	
		
			
				|  |  | +					param.put("stream",streamId);
 | 
	
		
			
				|  |  | +					param.put("ssrc",sendRtpItem.getSsrc());
 | 
	
		
			
				|  |  | +					logger.info("停止向上级推流:" + streamId);
 | 
	
		
			
				|  |  | +					MediaServerItem mediaInfo = mediaServerService.getOne(sendRtpItem.getMediaServerId());
 | 
	
		
			
				|  |  | +					zlmrtpServerFactory.stopSendRtpStream(mediaInfo, param);
 | 
	
		
			
				|  |  | +					redisCatchStorage.deleteSendRTPServer(platformGbId, channelId);
 | 
	
		
			
				|  |  | +					if (zlmrtpServerFactory.totalReaderCount(mediaInfo, sendRtpItem.getApp(), streamId) == 0) {
 | 
	
		
			
				|  |  | +						logger.info(streamId + "无其它观看者,通知设备停止推流");
 | 
	
		
			
				|  |  | +						cmder.streamByeCmd(sendRtpItem.getDeviceId(), channelId);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				// 可能是设备主动停止
 | 
	
		
			
				|  |  | +				Device device = storager.queryVideoDeviceByChannelId(platformGbId);
 | 
	
		
			
				|  |  | +				if (device != null) {
 | 
	
		
			
				|  |  | +					StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(device.getDeviceId(), channelId);
 | 
	
		
			
				|  |  | +					if (streamInfo != null) {
 | 
	
		
			
				|  |  | +						redisCatchStorage.stopPlay(streamInfo);
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +					storager.stopPlay(device.getDeviceId(), channelId);
 | 
	
		
			
				|  |  | +					mediaServerService.closeRTPServer(device, channelId);
 | 
	
		
			
				|  |  |  				}
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		} catch (SipException e) {
 | 
	
	
		
			
				|  | @@ -124,4 +141,12 @@ public class ByeRequestProcessor extends SIPRequestAbstractProcessor {
 | 
	
		
			
				|  |  |  	public void setMediaServerService(IMediaServerService mediaServerService) {
 | 
	
		
			
				|  |  |  		this.mediaServerService = mediaServerService;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	public IVideoManagerStorager getStorager() {
 | 
	
		
			
				|  |  | +		return storager;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	public void setStorager(IVideoManagerStorager storager) {
 | 
	
		
			
				|  |  | +		this.storager = storager;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 |