Commit b957ab61c7d7f54716f81f4cd9474238fd110e1d
1 parent
c77c1a95
bug修复
Showing
12 changed files
with
71 additions
and
71 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/task/impl/MobilePositionSubscribeTask.java
| @@ -39,9 +39,9 @@ public class MobilePositionSubscribeTask implements ISubscribeTask { | @@ -39,9 +39,9 @@ public class MobilePositionSubscribeTask implements ISubscribeTask { | ||
| 39 | dynamicTask.stop(taskKey); | 39 | dynamicTask.stop(taskKey); |
| 40 | } | 40 | } |
| 41 | sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { | 41 | sipCommander.mobilePositionSubscribe(device, dialog, eventResult -> { |
| 42 | -// if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) { | ||
| 43 | -// dialog = eventResult.dialog; | ||
| 44 | -// } | 42 | + if (eventResult.dialog != null || eventResult.dialog.getState().equals(DialogState.CONFIRMED)) { |
| 43 | + dialog = eventResult.dialog; | ||
| 44 | + } | ||
| 45 | ResponseEvent event = (ResponseEvent) eventResult.event; | 45 | ResponseEvent event = (ResponseEvent) eventResult.event; |
| 46 | if (event.getResponse().getRawContent() != null) { | 46 | if (event.getResponse().getRawContent() != null) { |
| 47 | // 成功 | 47 | // 成功 |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| @@ -419,12 +419,12 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -419,12 +419,12 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 419 | } | 419 | } |
| 420 | } | 420 | } |
| 421 | } else if (gbStream != null) { | 421 | } else if (gbStream != null) { |
| 422 | - if (streamPushItem != null && streamPushItem.isStatus()) { | ||
| 423 | - // 在线状态 | 422 | + if (streamPushItem != null && streamPushItem.isPushIng()) { |
| 423 | + // 推流状态 | ||
| 424 | pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, | 424 | pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, |
| 425 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | 425 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); |
| 426 | } else { | 426 | } else { |
| 427 | - // 不在线 拉起 | 427 | + // 未推流 拉起 |
| 428 | notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, | 428 | notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, |
| 429 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | 429 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); |
| 430 | } | 430 | } |
| @@ -451,7 +451,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -451,7 +451,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 451 | int port, Boolean tcpActive, boolean mediaTransmissionTCP, | 451 | int port, Boolean tcpActive, boolean mediaTransmissionTCP, |
| 452 | String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException { | 452 | String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException { |
| 453 | // 推流 | 453 | // 推流 |
| 454 | - if (streamPushItem.getServerId().equals(userSetting.getServerId())) { | 454 | + if (streamPushItem.isSelf()) { |
| 455 | Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream()); | 455 | Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream()); |
| 456 | if (streamReady) { | 456 | if (streamReady) { |
| 457 | // 自平台内容 | 457 | // 自平台内容 |
| @@ -500,7 +500,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -500,7 +500,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 500 | String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException { | 500 | String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException { |
| 501 | if ("proxy".equals(gbStream.getStreamType())) { | 501 | if ("proxy".equals(gbStream.getStreamType())) { |
| 502 | // TODO 控制启用以使设备上线 | 502 | // TODO 控制启用以使设备上线 |
| 503 | - logger.info("[ app={}, stream={} ]通道离线,启用流后开始推流", gbStream.getApp(), gbStream.getStream()); | 503 | + logger.info("[ app={}, stream={} ]通道未推流,启用流后开始推流", gbStream.getApp(), gbStream.getStream()); |
| 504 | responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline"); | 504 | responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline"); |
| 505 | } else if ("push".equals(gbStream.getStreamType())) { | 505 | } else if ("push".equals(gbStream.getStreamType())) { |
| 506 | if (!platform.isStartOfflinePush()) { | 506 | if (!platform.isStartOfflinePush()) { |
| @@ -508,7 +508,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -508,7 +508,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 508 | return; | 508 | return; |
| 509 | } | 509 | } |
| 510 | // 发送redis消息以使设备上线 | 510 | // 发送redis消息以使设备上线 |
| 511 | - logger.info("[ app={}, stream={} ]通道离线,发送redis信息控制设备开始推流", gbStream.getApp(), gbStream.getStream()); | 511 | + logger.info("[ app={}, stream={} ]通道未推流,发送redis信息控制设备开始推流", gbStream.getApp(), gbStream.getStream()); |
| 512 | 512 | ||
| 513 | MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(1, | 513 | MessageForPushChannel messageForPushChannel = MessageForPushChannel.getInstance(1, |
| 514 | gbStream.getApp(), gbStream.getStream(), gbStream.getGbId(), gbStream.getPlatformId(), | 514 | gbStream.getApp(), gbStream.getStream(), gbStream.getGbId(), gbStream.getPlatformId(), |
| @@ -518,7 +518,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -518,7 +518,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 518 | dynamicTask.startDelay(callIdHeader.getCallId(), () -> { | 518 | dynamicTask.startDelay(callIdHeader.getCallId(), () -> { |
| 519 | logger.info("[ app={}, stream={} ] 等待设备开始推流超时", gbStream.getApp(), gbStream.getStream()); | 519 | logger.info("[ app={}, stream={} ] 等待设备开始推流超时", gbStream.getApp(), gbStream.getStream()); |
| 520 | try { | 520 | try { |
| 521 | - mediaListManager.removedChannelOnlineEventLister(gbStream.getGbId()); | 521 | + mediaListManager.removedChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream()); |
| 522 | responseAck(evt, Response.REQUEST_TIMEOUT); // 超时 | 522 | responseAck(evt, Response.REQUEST_TIMEOUT); // 超时 |
| 523 | } catch (SipException e) { | 523 | } catch (SipException e) { |
| 524 | e.printStackTrace(); | 524 | e.printStackTrace(); |
| @@ -533,7 +533,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -533,7 +533,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 533 | Boolean finalTcpActive = tcpActive; | 533 | Boolean finalTcpActive = tcpActive; |
| 534 | 534 | ||
| 535 | // 添加在本机上线的通知 | 535 | // 添加在本机上线的通知 |
| 536 | - mediaListManager.addChannelOnlineEventLister(gbStream.getGbId(), (app, stream, serverId) -> { | 536 | + mediaListManager.addChannelOnlineEventLister(gbStream.getApp(), gbStream.getStream(), (app, stream, serverId) -> { |
| 537 | dynamicTask.stop(callIdHeader.getCallId()); | 537 | dynamicTask.stop(callIdHeader.getCallId()); |
| 538 | if (serverId.equals(userSetting.getServerId())) { | 538 | if (serverId.equals(userSetting.getServerId())) { |
| 539 | SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, finalPort, ssrc, requesterId, | 539 | SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, finalPort, ssrc, requesterId, |
| @@ -621,7 +621,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -621,7 +621,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 621 | // 离线 | 621 | // 离线 |
| 622 | // 查询是否在本机上线了 | 622 | // 查询是否在本机上线了 |
| 623 | StreamPushItem currentStreamPushItem = streamPushService.getPush(streamPushItem.getApp(), streamPushItem.getStream()); | 623 | StreamPushItem currentStreamPushItem = streamPushService.getPush(streamPushItem.getApp(), streamPushItem.getStream()); |
| 624 | - if (currentStreamPushItem.isStatus()) { | 624 | + if (currentStreamPushItem.isPushIng()) { |
| 625 | // 在线状态 | 625 | // 在线状态 |
| 626 | pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, | 626 | pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, |
| 627 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | 627 | mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
| @@ -350,17 +350,17 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements | @@ -350,17 +350,17 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements | ||
| 350 | switch (event) { | 350 | switch (event) { |
| 351 | case CatalogEvent.ON: | 351 | case CatalogEvent.ON: |
| 352 | // 上线 | 352 | // 上线 |
| 353 | - logger.info("收到来自设备【{}】的通道【{}】上线通知", device.getDeviceId(), channel.getChannelId()); | 353 | + logger.info("[收到通道上线通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); |
| 354 | storager.deviceChannelOnline(deviceId, channel.getChannelId()); | 354 | storager.deviceChannelOnline(deviceId, channel.getChannelId()); |
| 355 | break; | 355 | break; |
| 356 | case CatalogEvent.OFF : | 356 | case CatalogEvent.OFF : |
| 357 | // 离线 | 357 | // 离线 |
| 358 | - logger.info("收到来自设备【{}】的通道【{}】离线通知", device.getDeviceId(), channel.getChannelId()); | 358 | + logger.info("[收到通道离线通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); |
| 359 | storager.deviceChannelOffline(deviceId, channel.getChannelId()); | 359 | storager.deviceChannelOffline(deviceId, channel.getChannelId()); |
| 360 | break; | 360 | break; |
| 361 | case CatalogEvent.VLOST: | 361 | case CatalogEvent.VLOST: |
| 362 | // 视频丢失 | 362 | // 视频丢失 |
| 363 | - logger.info("收到来自设备【{}】的通道【{}】视频丢失通知", device.getDeviceId(), channel.getChannelId()); | 363 | + logger.info("[收到通道视频丢失通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); |
| 364 | storager.deviceChannelOffline(deviceId, channel.getChannelId()); | 364 | storager.deviceChannelOffline(deviceId, channel.getChannelId()); |
| 365 | break; | 365 | break; |
| 366 | case CatalogEvent.DEFECT: | 366 | case CatalogEvent.DEFECT: |
| @@ -368,17 +368,17 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements | @@ -368,17 +368,17 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements | ||
| 368 | break; | 368 | break; |
| 369 | case CatalogEvent.ADD: | 369 | case CatalogEvent.ADD: |
| 370 | // 增加 | 370 | // 增加 |
| 371 | - logger.info("收到来自设备【{}】的增加通道【{}】通知", device.getDeviceId(), channel.getChannelId()); | 371 | + logger.info("[收到增加通道通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); |
| 372 | deviceChannelService.updateChannel(deviceId, channel); | 372 | deviceChannelService.updateChannel(deviceId, channel); |
| 373 | break; | 373 | break; |
| 374 | case CatalogEvent.DEL: | 374 | case CatalogEvent.DEL: |
| 375 | // 删除 | 375 | // 删除 |
| 376 | - logger.info("收到来自设备【{}】的删除通道【{}】通知", device.getDeviceId(), channel.getChannelId()); | 376 | + logger.info("[收到删除通道通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); |
| 377 | storager.delChannel(deviceId, channel.getChannelId()); | 377 | storager.delChannel(deviceId, channel.getChannelId()); |
| 378 | break; | 378 | break; |
| 379 | case CatalogEvent.UPDATE: | 379 | case CatalogEvent.UPDATE: |
| 380 | // 更新 | 380 | // 更新 |
| 381 | - logger.info("收到来自设备【{}】的更新通道【{}】通知", device.getDeviceId(), channel.getChannelId()); | 381 | + logger.info("[收到更新通道通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); |
| 382 | deviceChannelService.updateChannel(deviceId, channel); | 382 | deviceChannelService.updateChannel(deviceId, channel); |
| 383 | break; | 383 | break; |
| 384 | default: | 384 | default: |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/notify/cmd/AlarmNotifyMessageHandler.java
| @@ -69,7 +69,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme | @@ -69,7 +69,7 @@ public class AlarmNotifyMessageHandler extends SIPRequestProcessorParent impleme | ||
| 69 | 69 | ||
| 70 | @Override | 70 | @Override |
| 71 | public void handForDevice(RequestEvent evt, Device device, Element rootElement) { | 71 | public void handForDevice(RequestEvent evt, Device device, Element rootElement) { |
| 72 | - logger.info("收到来自设备[{}]的报警通知", device.getDeviceId()); | 72 | + logger.info("[收到报警通知]设备:{}", device.getDeviceId()); |
| 73 | // 回复200 OK | 73 | // 回复200 OK |
| 74 | try { | 74 | try { |
| 75 | responseAck(evt, Response.OK); | 75 | responseAck(evt, Response.OK); |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
| @@ -111,7 +111,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | @@ -111,7 +111,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | ||
| 111 | int sumNum = Integer.parseInt(sumNumElement.getText()); | 111 | int sumNum = Integer.parseInt(sumNumElement.getText()); |
| 112 | 112 | ||
| 113 | if (sumNum == 0) { | 113 | if (sumNum == 0) { |
| 114 | - logger.info("收到来自设备【{}】的通道: 0个", take.getDevice().getDeviceId()); | 114 | + logger.info("[收到通道]设备:{}的: 0个", take.getDevice().getDeviceId()); |
| 115 | // 数据已经完整接收 | 115 | // 数据已经完整接收 |
| 116 | storager.cleanChannelsForDevice(take.getDevice().getDeviceId()); | 116 | storager.cleanChannelsForDevice(take.getDevice().getDeviceId()); |
| 117 | catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); | 117 | catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); |
| @@ -133,7 +133,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | @@ -133,7 +133,7 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp | ||
| 133 | } | 133 | } |
| 134 | int sn = Integer.parseInt(snElement.getText()); | 134 | int sn = Integer.parseInt(snElement.getText()); |
| 135 | catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList); | 135 | catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList); |
| 136 | - logger.info("收到来自设备【{}】的通道: {}个,{}/{}", take.getDevice().getDeviceId(), channelList.size(), catalogDataCatch.get(take.getDevice().getDeviceId()) == null ? 0 :catalogDataCatch.get(take.getDevice().getDeviceId()).size(), sumNum); | 136 | + logger.info("[收到通道]设备: {} -> {}个,{}/{}", take.getDevice().getDeviceId(), channelList.size(), catalogDataCatch.get(take.getDevice().getDeviceId()) == null ? 0 :catalogDataCatch.get(take.getDevice().getDeviceId()).size(), sumNum); |
| 137 | if (catalogDataCatch.get(take.getDevice().getDeviceId()).size() == sumNum) { | 137 | if (catalogDataCatch.get(take.getDevice().getDeviceId()).size() == sumNum) { |
| 138 | // 数据已经完整接收 | 138 | // 数据已经完整接收 |
| 139 | boolean resetChannelsResult = storager.resetChannels(take.getDevice().getDeviceId(), catalogDataCatch.get(take.getDevice().getDeviceId())); | 139 | boolean resetChannelsResult = storager.resetChannels(take.getDevice().getDeviceId(), catalogDataCatch.get(take.getDevice().getDeviceId())); |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
| @@ -240,6 +240,8 @@ public class ZLMHttpHookListener { | @@ -240,6 +240,8 @@ public class ZLMHttpHookListener { | ||
| 240 | if (mediaInfo != null) { | 240 | if (mediaInfo != null) { |
| 241 | assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null); | 241 | assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null); |
| 242 | } | 242 | } |
| 243 | + }else { | ||
| 244 | + zlmMediaListManager.sendStreamEvent(param.getApp(),param.getStream(), param.getMediaServerId()); | ||
| 243 | } | 245 | } |
| 244 | 246 | ||
| 245 | ret.put("code", 0); | 247 | ret.put("code", 0); |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaListManager.java
| @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; | @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; | ||
| 4 | import com.genersoft.iot.vmp.conf.UserSetting; | 4 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 5 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; | 5 | import com.genersoft.iot.vmp.gb28181.bean.GbStream; |
| 6 | import com.genersoft.iot.vmp.media.zlm.dto.*; | 6 | import com.genersoft.iot.vmp.media.zlm.dto.*; |
| 7 | +import com.genersoft.iot.vmp.service.IMediaServerService; | ||
| 7 | import com.genersoft.iot.vmp.service.IStreamProxyService; | 8 | import com.genersoft.iot.vmp.service.IStreamProxyService; |
| 8 | import com.genersoft.iot.vmp.service.IStreamPushService; | 9 | import com.genersoft.iot.vmp.service.IStreamPushService; |
| 9 | import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; | 10 | import com.genersoft.iot.vmp.service.bean.ThirdPartyGB; |
| @@ -63,7 +64,13 @@ public class ZLMMediaListManager { | @@ -63,7 +64,13 @@ public class ZLMMediaListManager { | ||
| 63 | @Autowired | 64 | @Autowired |
| 64 | private UserSetting userSetting; | 65 | private UserSetting userSetting; |
| 65 | 66 | ||
| 66 | - private Map<String, ChannelOnlineEvent> channelOnlineEvents = new ConcurrentHashMap<>(); | 67 | + @Autowired |
| 68 | + private ZLMRTPServerFactory zlmrtpServerFactory; | ||
| 69 | + | ||
| 70 | + @Autowired | ||
| 71 | + private IMediaServerService mediaServerService; | ||
| 72 | + | ||
| 73 | + private Map<String, ChannelOnlineEvent> channelOnPublishEvents = new ConcurrentHashMap<>(); | ||
| 67 | 74 | ||
| 68 | public StreamPushItem addPush(MediaItem mediaItem) { | 75 | public StreamPushItem addPush(MediaItem mediaItem) { |
| 69 | // 查找此直播流是否存在redis预设gbId | 76 | // 查找此直播流是否存在redis预设gbId |
| @@ -79,9 +86,26 @@ public class ZLMMediaListManager { | @@ -79,9 +86,26 @@ public class ZLMMediaListManager { | ||
| 79 | }else { | 86 | }else { |
| 80 | streamPushMapper.update(transform); | 87 | streamPushMapper.update(transform); |
| 81 | } | 88 | } |
| 89 | + if (transform != null) { | ||
| 90 | + if (getChannelOnlineEventLister(transform.getApp(), transform.getStream()) != null) { | ||
| 91 | + getChannelOnlineEventLister(transform.getApp(), transform.getStream()).run(transform.getApp(), transform.getStream(), transform.getServerId()); | ||
| 92 | + removedChannelOnlineEventLister(transform.getApp(), transform.getStream()); | ||
| 93 | + } | ||
| 94 | + } | ||
| 82 | return transform; | 95 | return transform; |
| 83 | } | 96 | } |
| 84 | 97 | ||
| 98 | + public void sendStreamEvent(String app, String stream, String mediaServerId) { | ||
| 99 | + MediaServerItem mediaServerItem = mediaServerService.getOne(mediaServerId); | ||
| 100 | + // 查看推流状态 | ||
| 101 | + if (zlmrtpServerFactory.isStreamReady(mediaServerItem, app, stream)) { | ||
| 102 | + if (getChannelOnlineEventLister(app, stream) != null) { | ||
| 103 | + getChannelOnlineEventLister(app, stream).run(app, stream, mediaServerId); | ||
| 104 | + removedChannelOnlineEventLister(app, stream); | ||
| 105 | + } | ||
| 106 | + } | ||
| 107 | + } | ||
| 108 | + | ||
| 85 | public int removeMedia(String app, String streamId) { | 109 | public int removeMedia(String app, String streamId) { |
| 86 | // 查找是否关联了国标, 关联了不删除, 置为离线 | 110 | // 查找是否关联了国标, 关联了不删除, 置为离线 |
| 87 | GbStream gbStream = gbStreamMapper.selectOne(app, streamId); | 111 | GbStream gbStream = gbStreamMapper.selectOne(app, streamId); |
| @@ -89,48 +113,21 @@ public class ZLMMediaListManager { | @@ -89,48 +113,21 @@ public class ZLMMediaListManager { | ||
| 89 | if (gbStream == null) { | 113 | if (gbStream == null) { |
| 90 | result = storager.removeMedia(app, streamId); | 114 | result = storager.removeMedia(app, streamId); |
| 91 | }else { | 115 | }else { |
| 92 | - // TODO 暂不设置为离线 | ||
| 93 | result =storager.mediaOffline(app, streamId); | 116 | result =storager.mediaOffline(app, streamId); |
| 94 | } | 117 | } |
| 95 | return result; | 118 | return result; |
| 96 | } | 119 | } |
| 97 | 120 | ||
| 98 | - public void addChannelOnlineEventLister(String key, ChannelOnlineEvent callback) { | ||
| 99 | - this.channelOnlineEvents.put(key,callback); | 121 | + public void addChannelOnlineEventLister(String app, String stream, ChannelOnlineEvent callback) { |
| 122 | + this.channelOnPublishEvents.put(app + "_" + stream, callback); | ||
| 100 | } | 123 | } |
| 101 | 124 | ||
| 102 | - public void removedChannelOnlineEventLister(String key) { | ||
| 103 | - this.channelOnlineEvents.remove(key); | 125 | + public void removedChannelOnlineEventLister(String app, String stream) { |
| 126 | + this.channelOnPublishEvents.remove(app + "_" + stream); | ||
| 104 | } | 127 | } |
| 105 | 128 | ||
| 129 | + public ChannelOnlineEvent getChannelOnlineEventLister(String app, String stream) { | ||
| 130 | + return this.channelOnPublishEvents.get(app + "_" + stream); | ||
| 131 | + } | ||
| 106 | 132 | ||
| 107 | - | ||
| 108 | -// public void clearAllSessions() { | ||
| 109 | -// logger.info("清空所有国标相关的session"); | ||
| 110 | -// JSONObject allSessionJSON = zlmresTfulUtils.getAllSession(); | ||
| 111 | -// ZLMServerConfig mediaInfo = redisCatchStorage.getMediaInfo(); | ||
| 112 | -// HashSet<String> allLocalPorts = new HashSet(); | ||
| 113 | -// if (allSessionJSON.getInteger("code") == 0) { | ||
| 114 | -// JSONArray data = allSessionJSON.getJSONArray("data"); | ||
| 115 | -// if (data.size() > 0) { | ||
| 116 | -// for (int i = 0; i < data.size(); i++) { | ||
| 117 | -// JSONObject sessionJOSN = data.getJSONObject(i); | ||
| 118 | -// Integer local_port = sessionJOSN.getInteger("local_port"); | ||
| 119 | -// if (!local_port.equals(Integer.valueOf(mediaInfo.getHttpPort())) && | ||
| 120 | -// !local_port.equals(Integer.valueOf(mediaInfo.getHttpSSLport())) && | ||
| 121 | -// !local_port.equals(Integer.valueOf(mediaInfo.getRtmpPort())) && | ||
| 122 | -// !local_port.equals(Integer.valueOf(mediaInfo.getRtspPort())) && | ||
| 123 | -// !local_port.equals(Integer.valueOf(mediaInfo.getRtspSSlport())) && | ||
| 124 | -// !local_port.equals(Integer.valueOf(mediaInfo.getHookOnFlowReport()))){ | ||
| 125 | -// allLocalPorts.add(sessionJOSN.getInteger("local_port") + ""); | ||
| 126 | -// } | ||
| 127 | -// } | ||
| 128 | -// } | ||
| 129 | -// } | ||
| 130 | -// if (allLocalPorts.size() > 0) { | ||
| 131 | -// List<String> result = new ArrayList<>(allLocalPorts); | ||
| 132 | -// String localPortSStr = String.join(",", result); | ||
| 133 | -// zlmresTfulUtils.kickSessions(localPortSStr); | ||
| 134 | -// } | ||
| 135 | -// } | ||
| 136 | } | 133 | } |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
| @@ -273,8 +273,10 @@ public class ZLMRTPServerFactory { | @@ -273,8 +273,10 @@ public class ZLMRTPServerFactory { | ||
| 273 | * 查询待转推的流是否就绪 | 273 | * 查询待转推的流是否就绪 |
| 274 | */ | 274 | */ |
| 275 | public Boolean isStreamReady(MediaServerItem mediaServerItem, String app, String streamId) { | 275 | public Boolean isStreamReady(MediaServerItem mediaServerItem, String app, String streamId) { |
| 276 | - JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo(mediaServerItem, app, "rtmp", streamId); | ||
| 277 | - return (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")); | 276 | + JSONObject mediaInfo = zlmresTfulUtils.getMediaList(mediaServerItem, app, streamId); |
| 277 | + return (mediaInfo.getInteger("code") == 0 | ||
| 278 | + && mediaInfo.getJSONArray("data") != null | ||
| 279 | + && mediaInfo.getJSONArray("data").size() > 0); | ||
| 278 | } | 280 | } |
| 279 | 281 | ||
| 280 | /** | 282 | /** |
src/main/java/com/genersoft/iot/vmp/service/impl/RedisStreamMsgListener.java
| @@ -72,9 +72,10 @@ public class RedisStreamMsgListener implements MessageListener { | @@ -72,9 +72,10 @@ public class RedisStreamMsgListener implements MessageListener { | ||
| 72 | mediaItem.setOriginType(0); | 72 | mediaItem.setOriginType(0); |
| 73 | mediaItem.setOriginTypeStr("0"); | 73 | mediaItem.setOriginTypeStr("0"); |
| 74 | mediaItem.setOriginTypeStr("unknown"); | 74 | mediaItem.setOriginTypeStr("unknown"); |
| 75 | - | ||
| 76 | - zlmMediaListManager.addPush(mediaItem); | ||
| 77 | - | ||
| 78 | - | 75 | + if (register) { |
| 76 | + zlmMediaListManager.addPush(mediaItem); | ||
| 77 | + }else { | ||
| 78 | + zlmMediaListManager.removeMedia(app, stream); | ||
| 79 | + } | ||
| 79 | } | 80 | } |
| 80 | } | 81 | } |
src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java
| @@ -264,9 +264,8 @@ public class StreamPushController { | @@ -264,9 +264,8 @@ public class StreamPushController { | ||
| 264 | }) | 264 | }) |
| 265 | @GetMapping(value = "/getPlayUrl") | 265 | @GetMapping(value = "/getPlayUrl") |
| 266 | @ResponseBody | 266 | @ResponseBody |
| 267 | - public WVPResult<StreamInfo> getPlayUrl(HttpServletRequest request, @RequestParam String app, | ||
| 268 | - @RequestParam String stream, | ||
| 269 | - @RequestParam(required = false) String mediaServerId){ | 267 | + public WVPResult<StreamInfo> getPlayUrl(@RequestParam String app,@RequestParam String stream, |
| 268 | + @RequestParam(required = false) String mediaServerId){ | ||
| 270 | boolean authority = false; | 269 | boolean authority = false; |
| 271 | // 是否登陆用户, 登陆用户返回完整信息 | 270 | // 是否登陆用户, 登陆用户返回完整信息 |
| 272 | LoginUser userInfo = SecurityUtils.getUserInfo(); | 271 | LoginUser userInfo = SecurityUtils.getUserInfo(); |
| @@ -275,7 +274,7 @@ public class StreamPushController { | @@ -275,7 +274,7 @@ public class StreamPushController { | ||
| 275 | } | 274 | } |
| 276 | WVPResult<StreamInfo> result = new WVPResult<>(); | 275 | WVPResult<StreamInfo> result = new WVPResult<>(); |
| 277 | StreamPushItem push = streamPushService.getPush(app, stream); | 276 | StreamPushItem push = streamPushService.getPush(app, stream); |
| 278 | - if (!userSetting.getServerId().equals(push.getServerId()) ) { | 277 | + if (push != null && !push.isSelf()) { |
| 279 | result.setCode(-1); | 278 | result.setCode(-1); |
| 280 | result.setMsg("来自其他平台的推流信息"); | 279 | result.setMsg("来自其他平台的推流信息"); |
| 281 | return result; | 280 | return result; |
| @@ -283,7 +282,7 @@ public class StreamPushController { | @@ -283,7 +282,7 @@ public class StreamPushController { | ||
| 283 | StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority); | 282 | StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority); |
| 284 | if (streamInfo != null){ | 283 | if (streamInfo != null){ |
| 285 | result.setCode(0); | 284 | result.setCode(0); |
| 286 | - result.setMsg("scccess"); | 285 | + result.setMsg("success"); |
| 287 | result.setData(streamInfo); | 286 | result.setData(streamInfo); |
| 288 | }else { | 287 | }else { |
| 289 | result.setCode(-1); | 288 | result.setCode(-1); |
web_src/src/components/PushVideoList.vue
| @@ -76,7 +76,7 @@ | @@ -76,7 +76,7 @@ | ||
| 76 | <el-table-column label="操作" min-width="360" fixed="right"> | 76 | <el-table-column label="操作" min-width="360" fixed="right"> |
| 77 | <template slot-scope="scope"> | 77 | <template slot-scope="scope"> |
| 78 | <el-button size="medium" icon="el-icon-video-play" | 78 | <el-button size="medium" icon="el-icon-video-play" |
| 79 | - v-if="(scope.row.status == false && scope.row.gbId == null) || scope.row.status" | 79 | + v-if="scope.row.pushIng === true" |
| 80 | @click="playPush(scope.row)" type="text">播放 | 80 | @click="playPush(scope.row)" type="text">播放 |
| 81 | </el-button> | 81 | </el-button> |
| 82 | <el-divider direction="vertical"></el-divider> | 82 | <el-divider direction="vertical"></el-divider> |
web_src/src/components/dialog/catalogEdit.vue
| @@ -70,12 +70,11 @@ export default { | @@ -70,12 +70,11 @@ export default { | ||
| 70 | console.log(catalogType) | 70 | console.log(catalogType) |
| 71 | // 216 为虚拟组织 215 为业务分组;目录第一级必须为业务分组, 业务分组下为虚拟组织,虚拟组织下可以有其他虚拟组织 | 71 | // 216 为虚拟组织 215 为业务分组;目录第一级必须为业务分组, 业务分组下为虚拟组织,虚拟组织下可以有其他虚拟组织 |
| 72 | if (this.level === 1 && catalogType !== "215") { | 72 | if (this.level === 1 && catalogType !== "215") { |
| 73 | - return callback(new Error('业务分组模式下第一层目录的编号10到13位必须为215')); | 73 | + return callback(new Error('业务分组模式下第一层目录的编号11到13位必须为215')); |
| 74 | } | 74 | } |
| 75 | if (this.level > 1 && catalogType !== "216") { | 75 | if (this.level > 1 && catalogType !== "216") { |
| 76 | - return callback(new Error('业务分组模式下第一层以下目录的编号10到13位必须为216')); | 76 | + return callback(new Error('业务分组模式下第一层以下目录的编号11到13位必须为216')); |
| 77 | } | 77 | } |
| 78 | - | ||
| 79 | } | 78 | } |
| 80 | callback(); | 79 | callback(); |
| 81 | } | 80 | } |