Commit c273a6aa5a8e02c12ad43c2c29108829583ebbbc

Authored by gushouzheng
1 parent d09d8f11

更新级联查看直播视频及代理拉流视频bug

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 }
... ...