panlinlin
2021-04-22 a29a0a0785f966294ba01982fba62c1ff0f23bea
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -10,14 +10,18 @@
import javax.sip.header.ViaHeader;
import javax.sip.message.Request;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.MediaServerConfig;
import com.genersoft.iot.vmp.gb28181.event.SipSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
import gov.nist.javax.sip.message.SIPRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -74,6 +78,9 @@
   @Autowired
   private ZLMRTPServerFactory zlmrtpServerFactory;
   @Autowired
   private ZLMRESTfulUtils zlmresTfulUtils;
   @Value("${media.rtp.enable}")
   private boolean rtpEnable;
@@ -376,7 +383,7 @@
         //
         StringBuffer content = new StringBuffer(200);
         content.append("v=0\r\n");
//         content.append("o="+channelId+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
//         content.append("o=" + sipConfig.getSipId() + " 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
         content.append("o="+"00000"+" 0 0 IN IP4 "+mediaInfo.getWanIp()+"\r\n");
         content.append("s=Play\r\n");
         content.append("c=IN IP4 "+mediaInfo.getWanIp()+"\r\n");
@@ -577,11 +584,38 @@
      
      try {
         ClientTransaction transaction = streamSession.getTransaction(deviceId, channelId);
         // 服务重启后
         // 服务重启后, 无法直接发送bye, 通过手动构建发送
         if (transaction == null) {
            StreamInfo streamInfo = redisCatchStorage.queryPlayByDevice(deviceId, channelId);
            if (streamInfo != null) {
               JSONObject mediaList = zlmresTfulUtils.getMediaList(streamInfo.getApp(), streamInfo.getStreamId());
               if (mediaList != null) { // 仍在推流才发送
                  if (mediaList.getInteger("code") == 0) {
                     JSONArray data = mediaList.getJSONArray("data");
                     if (data != null && data.size() > 0) {
                        Device device = storager.queryVideoDevice(deviceId);
                        if (device != null) {
                           StreamInfo.TransactionInfo transactionInfo = streamInfo.getTransactionInfo();
                           try {
                              Request byteRequest = headerProvider.createByteRequest(device, channelId,
                                    transactionInfo.branch,
                                    transactionInfo.localTag,
                                    transactionInfo.remoteTag,
                                    transactionInfo.callId);
                              transmitRequest(device, byteRequest);
                           } catch (InvalidArgumentException e) {
                              e.printStackTrace();
                           }
                        }
                     }
                  }
               }
               redisCatchStorage.stopPlay(streamInfo);
            }
            if (okEvent != null) {
               okEvent.response(null);
            }
            return;
         }
@@ -592,15 +626,9 @@
         }
         Request byeRequest = dialog.createRequest(Request.BYE);
         SipURI byeURI = (SipURI) byeRequest.getRequestURI();
         String vh = transaction.getRequest().getHeader(ViaHeader.NAME).toString();
         Pattern p = Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)\\:(\\d+)");
         Matcher matcher = p.matcher(vh);
         if (matcher.find()) {
            String ip = matcher.group(1);
            byeURI.setHost(ip);
            String port = matcher.group(2);
            byeURI.setPort(Integer.parseInt(port));
         }
         SIPRequest request = (SIPRequest)transaction.getRequest();
         byeURI.setHost(request.getRemoteAddress().getHostName());
         byeURI.setPort(request.getRemotePort());
         ViaHeader viaHeader = (ViaHeader) byeRequest.getHeader(ViaHeader.NAME);
         String protocol = viaHeader.getTransport().toUpperCase();
         ClientTransaction clientTransaction = null;