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