修复stream-none-reader-delay-ms为-1时不自动关闭流
| | |
| | | ByeRequestProcessor processor = new ByeRequestProcessor();
|
| | | processor.setRequestEvent(evt);
|
| | | processor.setRedisCatchStorage(redisCatchStorage);
|
| | | processor.setStorager(storager);
|
| | | processor.setZlmrtpServerFactory(zlmrtpServerFactory);
|
| | | processor.setSIPCommander(cmder);
|
| | | processor.setMediaServerService(mediaServerService);
|
| | |
| | | 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;
|
| | |
| | | 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;
|
| | |
|
| | |
| | |
|
| | | private IRedisCatchStorage redisCatchStorage;
|
| | |
|
| | | private IVideoManagerStorager storager;
|
| | |
|
| | | private ZLMRTPServerFactory zlmrtpServerFactory;
|
| | |
|
| | | private IMediaServerService mediaServerService;
|
| | |
| | | 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;
|
| | | logger.info("收到bye, [{}/{}]", platformGbId, channelId);
|
| | | if (sendRtpItem != null){
|
| | | String streamId = sendRtpItem.getStreamId();
|
| | | Map<String, Object> param = new HashMap<>();
|
| | | param.put("vhost","__defaultVhost__");
|
| | |
| | | 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) {
|
| | |
| | | public void setMediaServerService(IMediaServerService mediaServerService) {
|
| | | this.mediaServerService = mediaServerService;
|
| | | }
|
| | |
|
| | | public IVideoManagerStorager getStorager() {
|
| | | return storager;
|
| | | }
|
| | |
|
| | | public void setStorager(IVideoManagerStorager storager) {
|
| | | this.storager = storager;
|
| | | }
|
| | | }
|
| | |
| | | deferredResultHolder.invokeResult(msg);
|
| | | }
|
| | | } catch (DocumentException | SipException | InvalidArgumentException | ParseException e) {
|
| | | // } catch (DocumentException e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | |
| | | @Override
|
| | | public void process(ResponseEvent evt, SipLayer layer, SipConfig config) {
|
| | | // TODO Auto-generated method stub
|
| | | |
| | | System.out.println( );
|
| | | }
|
| | |
|
| | | }
|
| | |
| | | redisCatchStorage.stopPlayback(streamInfoForPlayBackCatch);
|
| | | }
|
| | | }
|
| | | MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId);
|
| | | if (mediaServerItem != null && "-1".equals(mediaServerItem.getStreamNoneReaderDelayMS())) {
|
| | | ret.put("close", false);
|
| | | }
|
| | | return new ResponseEntity<String>(ret.toString(),HttpStatus.OK);
|
| | | }else {
|
| | | JSONObject ret = new JSONObject();
|
| | |
| | | if (userSetup.isAutoApplyPlay() && mediaInfo != null) {
|
| | | String app = json.getString("app");
|
| | | String streamId = json.getString("stream");
|
| | | if ("rtp".equals(app) && streamId.contains("gb_play") ) {
|
| | | if ("rtp".equals(app)) {
|
| | | String[] s = streamId.split("_");
|
| | | if (s.length == 4) {
|
| | | String deviceId = s[2];
|
| | |
| | | SSRCInfo ssrcInfo;
|
| | | String streamId2 = null;
|
| | | if (mediaInfo.isRtpEnable()) {
|
| | | streamId2 = String.format("gb_play_%s_%s", device.getDeviceId(), channelId);
|
| | | streamId2 = String.format("%s/%s", device.getDeviceId(), channelId);
|
| | | }
|
| | | ssrcInfo = mediaServerService.openRTPServer(mediaInfo, streamId2);
|
| | | cmder.playStreamCmd(mediaInfo, ssrcInfo, device, channelId, (MediaServerItem mediaServerItemInuse, JSONObject response) -> {
|
| | |
| | | String mediaServerId = streamSession.getMediaServerId(device.getDeviceId(), channelId); |
| | | MediaServerItem mediaServerItem = this.getOne(mediaServerId); |
| | | if (mediaServerItem != null) { |
| | | String streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId); |
| | | String streamId = String.format("%s/%s", device.getDeviceId(), channelId); |
| | | zlmrtpServerFactory.closeRTPServer(mediaServerItem, streamId); |
| | | releaseSsrc(mediaServerItem, streamSession.getSSRC(device.getDeviceId(), channelId)); |
| | | } |
| | |
| | | param.put("hook.on_stream_none_reader",String.format("%s/on_stream_none_reader", hookPrex)); |
| | | param.put("hook.on_stream_not_found",String.format("%s/on_stream_not_found", hookPrex)); |
| | | param.put("hook.timeoutSec","20"); |
| | | param.put("general.streamNoneReaderDelayMS",mediaServerItem.getStreamNoneReaderDelayMS()); |
| | | param.put("general.streamNoneReaderDelayMS","-1".equals(mediaServerItem.getStreamNoneReaderDelayMS())?"3600000":mediaServerItem.getStreamNoneReaderDelayMS() ); |
| | | |
| | | JSONObject responseJSON = zlmresTfulUtils.setServerConfig(mediaServerItem, param); |
| | | |
| | |
| | | SSRCInfo ssrcInfo; |
| | | String streamId = null; |
| | | if (mediaServerItem.isRtpEnable()) { |
| | | streamId = String.format("gb_play_%s_%s", device.getDeviceId(), channelId); |
| | | streamId = String.format("%s/%s", device.getDeviceId(), channelId); |
| | | } |
| | | |
| | | ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId); |
| | |
| | | SSRCInfo ssrcInfo; |
| | | String streamId2 = null; |
| | | if (mediaServerItem.isRtpEnable()) { |
| | | streamId2 = String.format("gb_play_%s_%s", device.getDeviceId(), channelId); |
| | | streamId2 = String.format("%s/%s", device.getDeviceId(), channelId); |
| | | } |
| | | ssrcInfo = mediaServerService.openRTPServer(mediaServerItem, streamId2); |
| | | |
| | |
| | | void updateMediaServer(MediaServerItem mediaServerItem);
|
| | |
|
| | | List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean b);
|
| | |
|
| | | Device queryVideoDeviceByChannelId(String platformGbId);
|
| | | }
|
| | |
| | | " </script>"}) |
| | | |
| | | List<ChannelReduce> queryChannelListInAll(String query, Boolean online, Boolean hasSubChannel, String platformId, Boolean inPlatform); |
| | | |
| | | @Select("SELECT * FROM device_channel WHERE channelId=#{channelId}") |
| | | List<DeviceChannel> queryChannelByChannelId(String channelId); |
| | | } |
| | |
| | | public List<StreamProxyItem> getStreamProxyListForEnableInMediaServer(String id, boolean enable) { |
| | | return streamProxyMapper.selectForEnableInMediaServer(id, enable); |
| | | } |
| | | |
| | | @Override |
| | | public Device queryVideoDeviceByChannelId(String channelId) { |
| | | Device result = null; |
| | | List<DeviceChannel> channelList = deviceChannelMapper.queryChannelByChannelId(channelId); |
| | | if (channelList.size() == 1) { |
| | | result = deviceMapper.getDeviceByDeviceId(channelList.get(0).getDeviceId()); |
| | | } |
| | | return result; |
| | | } |
| | | } |
| | |
| | | }) |
| | | @PostMapping("/convert/{streamId}") |
| | | public ResponseEntity<String> playConvert(@PathVariable String streamId) { |
| | | StreamInfo streamInfo = streamId.startsWith("gb_play_") ? redisCatchStorage.queryPlayByStreamId(streamId) : redisCatchStorage.queryPlaybackByStreamId(streamId); |
| | | StreamInfo streamInfo = redisCatchStorage.queryPlayByStreamId(streamId); |
| | | if (streamInfo == null) { |
| | | streamInfo = redisCatchStorage.queryPlaybackByStreamId(streamId); |
| | | } |
| | | if (streamInfo == null) { |
| | | logger.warn("视频转码API调用失败!, 视频流已经停止!"); |
| | | return new ResponseEntity<String>("未找到视频流信息, 视频流可能已经停止", HttpStatus.OK); |