src/main/java/com/genersoft/iot/vmp/gb28181/session/SsrcUtil.java
@@ -5,7 +5,10 @@ import java.util.Random; import com.genersoft.iot.vmp.conf.SipConfig; import com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; import com.genersoft.iot.vmp.utils.SpringBeanFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @Description:SIP信令中的SSRC工具类。SSRC值由10位十进制整数组成的字符串,第一位为0代表实况,为1则代表回放;第二位至第六位由监控域ID的第4位到第8位组成;最后4位为不重复的4个整数 @@ -13,6 +16,8 @@ * @date: 2020年5月10日 上午11:57:57 */ public class SsrcUtil { private final static Logger logger = LoggerFactory.getLogger(SsrcUtil.class); private static String ssrcPrefix; @@ -59,6 +64,10 @@ * */ public static void releaseSsrc(String ssrc) { if (ssrc == null) { logger.error("要释放ssrc为null"); return; } String sn = ssrc.substring(6); isUsed.remove(sn); notUsed.add(sn); src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
@@ -42,7 +42,9 @@ public void remove(String deviceId, String channelId) { sessionMap.remove(deviceId + "_" + channelId); if (ssrcMap.get(deviceId + "_" + channelId) != null) { SsrcUtil.releaseSsrc(ssrcMap.get(deviceId + "_" + channelId)); } ssrcMap.remove(deviceId + "_" + channelId); streamIdMap.remove(deviceId + "_" + channelId); } src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/SIPRequestHeaderProvider.java
@@ -69,8 +69,7 @@ SipURI requestLine = sipFactory.createAddressFactory().createSipURI(channelId, device.getHostAddress()); //via ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(device.getIp(), device.getPort(), device.getTransport(), viaTag); // ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag); ViaHeader viaHeader = sipFactory.createHeaderFactory().createViaHeader(sipConfig.getSipIp(), sipConfig.getSipPort(), device.getTransport(), viaTag); viaHeader.setRPort(); viaHeaders.add(viaHeader); src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -21,6 +21,7 @@ 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; @@ -625,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; src/main/java/com/genersoft/iot/vmp/gb28181/transmit/response/impl/InviteResponseProcessor.java
@@ -2,16 +2,13 @@ import java.text.ParseException; import javax.sip.Dialog; import javax.sip.InvalidArgumentException; import javax.sip.ResponseEvent; import javax.sip.SipException; import javax.sip.*; import javax.sip.address.SipURI; import javax.sip.header.CSeqHeader; import javax.sip.header.ViaHeader; import javax.sip.message.Request; import javax.sip.message.Response; import gov.nist.javax.sip.ResponseEventExt; import org.springframework.stereotype.Component; import com.genersoft.iot.vmp.conf.SipConfig; @@ -46,16 +43,15 @@ // 成功响应 // 下发ack if (statusCode == Response.OK) { ResponseEventExt event = (ResponseEventExt)evt; Dialog dialog = evt.getDialog(); CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME); Request reqAck = dialog.createAck(cseq.getSeqNumber()); SipURI requestURI = (SipURI) reqAck.getRequestURI(); ViaHeader viaHeader = (ViaHeader) response.getHeader(ViaHeader.NAME); requestURI.setHost(viaHeader.getHost()); requestURI.setPort(viaHeader.getPort()); requestURI.setHost(event.getRemoteIpAddress()); requestURI.setPort(event.getRemotePort()); reqAck.setRequestURI(requestURI); System.out.println("向 " + event.getRemoteIpAddress() + ":" + event.getRemotePort() + "回复ack"); dialog.sendAck(reqAck); } } catch (InvalidArgumentException | SipException e) { src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
@@ -251,7 +251,7 @@ JSONArray tracks = json.getJSONArray("tracks"); boolean regist = json.getBoolean("regist"); if (tracks != null) { System.out.println("222222" + schema); System.out.println("on_stream_changed->>" + schema); } if ("rtmp".equals(schema)){