Commit c273a6aa5a8e02c12ad43c2c29108829583ebbbc
1 parent
d09d8f11
更新级联查看直播视频及代理拉流视频bug
Showing
3 changed files
with
83 additions
and
10 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| ... | ... | @@ -17,9 +17,11 @@ import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; |
| 17 | 17 | import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; |
| 18 | 18 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; |
| 19 | 19 | import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; |
| 20 | +import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; | |
| 20 | 21 | import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; |
| 21 | 22 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| 22 | 23 | import com.genersoft.iot.vmp.service.IPlayService; |
| 24 | +import com.genersoft.iot.vmp.service.IStreamProxyService; | |
| 23 | 25 | import com.genersoft.iot.vmp.service.IStreamPushService; |
| 24 | 26 | import com.genersoft.iot.vmp.service.bean.MessageForPushChannel; |
| 25 | 27 | import com.genersoft.iot.vmp.service.bean.SSRCInfo; |
| ... | ... | @@ -65,6 +67,8 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 65 | 67 | |
| 66 | 68 | @Autowired |
| 67 | 69 | private IStreamPushService streamPushService; |
| 70 | + @Autowired | |
| 71 | + private IStreamProxyService streamProxyService; | |
| 68 | 72 | |
| 69 | 73 | @Autowired |
| 70 | 74 | private IRedisCatchStorage redisCatchStorage; |
| ... | ... | @@ -145,6 +149,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 145 | 149 | |
| 146 | 150 | MediaServerItem mediaServerItem = null; |
| 147 | 151 | StreamPushItem streamPushItem = null; |
| 152 | + StreamProxyItem proxyByAppAndStream =null; | |
| 148 | 153 | // 不是通道可能是直播流 |
| 149 | 154 | if (channel != null && gbStream == null) { |
| 150 | 155 | if (channel.getStatus() == 0) { |
| ... | ... | @@ -178,6 +183,13 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 178 | 183 | responseAck(evt, Response.GONE); |
| 179 | 184 | return; |
| 180 | 185 | } |
| 186 | + }else if("proxy".equals(gbStream.getStreamType())){ | |
| 187 | + proxyByAppAndStream = streamProxyService.getStreamProxyByAppAndStream(gbStream.getApp(), gbStream.getStream()); | |
| 188 | + if (proxyByAppAndStream == null) { | |
| 189 | + logger.info("[ app={}, stream={} ]找不到zlm {},返回410", gbStream.getApp(), gbStream.getStream(), mediaServerId); | |
| 190 | + responseAck(evt, Response.GONE); | |
| 191 | + return; | |
| 192 | + } | |
| 181 | 193 | } |
| 182 | 194 | } |
| 183 | 195 | responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 通道存在,发181,呼叫转接中 |
| ... | ... | @@ -419,14 +431,33 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 419 | 431 | } |
| 420 | 432 | } |
| 421 | 433 | } else if (gbStream != null) { |
| 422 | - if (streamPushItem != null && streamPushItem.isPushIng()) { | |
| 423 | - // 推流状态 | |
| 424 | - pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, | |
| 425 | - mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | |
| 426 | - } else { | |
| 427 | - // 未推流 拉起 | |
| 428 | - notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, | |
| 429 | - mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | |
| 434 | + if("push".equals(gbStream.getStreamType())) { | |
| 435 | + if (streamPushItem != null && streamPushItem.isPushIng()) { | |
| 436 | + // 推流状态 | |
| 437 | + pushStream(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, | |
| 438 | + mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | |
| 439 | + } else { | |
| 440 | + // 未推流 拉起 | |
| 441 | + notifyStreamOnline(evt, gbStream, streamPushItem, platform, callIdHeader, mediaServerItem, port, tcpActive, | |
| 442 | + mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | |
| 443 | + } | |
| 444 | + }else if ("proxy".equals(gbStream.getStreamType())){ | |
| 445 | + if(null != proxyByAppAndStream &&proxyByAppAndStream.isStatus()){ | |
| 446 | + pushProxyStream(evt, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive, | |
| 447 | + mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | |
| 448 | + }else{ | |
| 449 | + //开启代理拉流 | |
| 450 | + boolean start1 = streamProxyService.start(gbStream.getApp(), gbStream.getStream()); | |
| 451 | + if(start1) { | |
| 452 | + pushProxyStream(evt, gbStream, platform, callIdHeader, mediaServerItem, port, tcpActive, | |
| 453 | + mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | |
| 454 | + }else{ | |
| 455 | + //失败后通知 | |
| 456 | + notifyStreamOnline(evt, gbStream, null, platform, callIdHeader, mediaServerItem, port, tcpActive, | |
| 457 | + mediaTransmissionTCP, channelId, addressStr, ssrc, requesterId); | |
| 458 | + } | |
| 459 | + } | |
| 460 | + | |
| 430 | 461 | } |
| 431 | 462 | } |
| 432 | 463 | } |
| ... | ... | @@ -445,7 +476,39 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 445 | 476 | /** |
| 446 | 477 | * 安排推流 |
| 447 | 478 | */ |
| 479 | + private void pushProxyStream(RequestEvent evt, GbStream gbStream, ParentPlatform platform, | |
| 480 | + CallIdHeader callIdHeader, MediaServerItem mediaServerItem, | |
| 481 | + int port, Boolean tcpActive, boolean mediaTransmissionTCP, | |
| 482 | + String channelId, String addressStr, String ssrc, String requesterId) throws InvalidArgumentException, ParseException, SipException { | |
| 483 | + Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, gbStream.getApp(), gbStream.getStream()); | |
| 484 | + if (streamReady) { | |
| 485 | + // 自平台内容 | |
| 486 | + SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId, | |
| 487 | + gbStream.getApp(), gbStream.getStream(), channelId, | |
| 488 | + mediaTransmissionTCP); | |
| 448 | 489 | |
| 490 | + if (sendRtpItem == null) { | |
| 491 | + logger.warn("服务器端口资源不足"); | |
| 492 | + responseAck(evt, Response.BUSY_HERE); | |
| 493 | + return; | |
| 494 | + } | |
| 495 | + if (tcpActive != null) { | |
| 496 | + sendRtpItem.setTcpActive(tcpActive); | |
| 497 | + } | |
| 498 | + sendRtpItem.setPlayType(InviteStreamType.PUSH); | |
| 499 | + // 写入redis, 超时时回复 | |
| 500 | + sendRtpItem.setStatus(1); | |
| 501 | + sendRtpItem.setCallId(callIdHeader.getCallId()); | |
| 502 | + byte[] dialogByteArray = SerializeUtils.serialize(evt.getDialog()); | |
| 503 | + sendRtpItem.setDialog(dialogByteArray); | |
| 504 | + byte[] transactionByteArray = SerializeUtils.serialize(evt.getServerTransaction()); | |
| 505 | + sendRtpItem.setTransaction(transactionByteArray); | |
| 506 | + redisCatchStorage.updateSendRTPSever(sendRtpItem); | |
| 507 | + sendStreamAck(mediaServerItem, sendRtpItem, platform, evt); | |
| 508 | + | |
| 509 | + } | |
| 510 | + | |
| 511 | + } | |
| 449 | 512 | private void pushStream(RequestEvent evt, GbStream gbStream, StreamPushItem streamPushItem, ParentPlatform platform, |
| 450 | 513 | CallIdHeader callIdHeader, MediaServerItem mediaServerItem, |
| 451 | 514 | int port, Boolean tcpActive, boolean mediaTransmissionTCP, |
| ... | ... | @@ -490,7 +553,6 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements |
| 490 | 553 | } |
| 491 | 554 | |
| 492 | 555 | } |
| 493 | - | |
| 494 | 556 | /** |
| 495 | 557 | * 通知流上线 |
| 496 | 558 | */ | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
| ... | ... | @@ -277,7 +277,11 @@ public class MediaServerServiceImpl implements IMediaServerService { |
| 277 | 277 | return null; |
| 278 | 278 | } |
| 279 | 279 | String key = VideoManagerConstants.MEDIA_SERVER_PREFIX + userSetting.getServerId() + "_" + mediaServerId; |
| 280 | - return (MediaServerItem)redisUtil.get(key); | |
| 280 | + MediaServerItem serverItem=(MediaServerItem)redisUtil.get(key); | |
| 281 | + if(null==serverItem){ | |
| 282 | + serverItem=mediaServerMapper.queryOne(mediaServerId); | |
| 283 | + } | |
| 284 | + return serverItem; | |
| 281 | 285 | } |
| 282 | 286 | |
| 283 | 287 | @Override | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
| ... | ... | @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; |
| 4 | 4 | import com.alibaba.fastjson.JSONArray; |
| 5 | 5 | import com.alibaba.fastjson.JSONObject; |
| 6 | 6 | import com.alibaba.fastjson.TypeReference; |
| 7 | +import com.genersoft.iot.vmp.conf.MediaConfig; | |
| 7 | 8 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 8 | 9 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 9 | 10 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
| ... | ... | @@ -78,6 +79,10 @@ public class StreamPushServiceImpl implements IStreamPushService { |
| 78 | 79 | @Autowired |
| 79 | 80 | TransactionDefinition transactionDefinition; |
| 80 | 81 | |
| 82 | + @Autowired | |
| 83 | + private MediaConfig mediaConfig; | |
| 84 | + | |
| 85 | + | |
| 81 | 86 | @Override |
| 82 | 87 | public List<StreamPushItem> handleJSON(String jsonData, MediaServerItem mediaServerItem) { |
| 83 | 88 | if (jsonData == null) { |
| ... | ... | @@ -142,6 +147,8 @@ public class StreamPushServiceImpl implements IStreamPushService { |
| 142 | 147 | stream.setStreamType("push"); |
| 143 | 148 | stream.setStatus(true); |
| 144 | 149 | stream.setCreateTime(DateUtil.getNow()); |
| 150 | + stream.setStreamType("push"); | |
| 151 | + stream.setMediaServerId(mediaConfig.getId()); | |
| 145 | 152 | int add = gbStreamMapper.add(stream); |
| 146 | 153 | return add > 0; |
| 147 | 154 | } | ... | ... |