|
|
@ -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; |
|
|
|
} |
|
|
|
} |
|
|
|