diff --git a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java index 460f418c..8311745c 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java +++ b/src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java @@ -169,25 +169,31 @@ public class StreamInfo implements Serializable, Cloneable{ public void setRtmp(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s/%s", app, stream, callIdParam); - this.rtmp = new StreamURL("rtmp", host, port, file); - if (sslPort != 0) { + if (port > 0) { + this.rtmp = new StreamURL("rtmp", host, port, file); + } + if (sslPort > 0) { this.rtmps = new StreamURL("rtmps", host, sslPort, file); } } public void setRtsp(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s/%s", app, stream, callIdParam); - this.rtsp = new StreamURL("rtsp", host, port, file); - if (sslPort != 0) { + if (port > 0) { + this.rtsp = new StreamURL("rtsp", host, port, file); + } + if (sslPort > 0) { this.rtsps = new StreamURL("rtsps", host, sslPort, file); } } public void setFlv(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s.live.flv%s", app, stream, callIdParam); - this.flv = new StreamURL("http", host, port, file); + if (port > 0) { + this.flv = new StreamURL("http", host, port, file); + } this.ws_flv = new StreamURL("ws", host, port, file); - if (sslPort != 0) { + if (sslPort > 0) { this.https_flv = new StreamURL("https", host, sslPort, file); this.wss_flv = new StreamURL("wss", host, sslPort, file); } @@ -195,9 +201,11 @@ public class StreamInfo implements Serializable, Cloneable{ public void setFmp4(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s.live.mp4%s", app, stream, callIdParam); - this.fmp4 = new StreamURL("http", host, port, file); - this.ws_fmp4 = new StreamURL("ws", host, port, file); - if (sslPort != 0) { + if (port > 0) { + this.fmp4 = new StreamURL("http", host, port, file); + this.ws_fmp4 = new StreamURL("ws", host, port, file); + } + if (sslPort > 0) { this.https_fmp4 = new StreamURL("https", host, sslPort, file); this.wss_fmp4 = new StreamURL("wss", host, sslPort, file); } @@ -205,9 +213,11 @@ public class StreamInfo implements Serializable, Cloneable{ public void setHls(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s/hls.m3u8%s", app, stream, callIdParam); - this.hls = new StreamURL("http", host, port, file); - this.ws_hls = new StreamURL("ws", host, port, file); - if (sslPort != 0) { + if (port > 0) { + this.hls = new StreamURL("http", host, port, file); + this.ws_hls = new StreamURL("ws", host, port, file); + } + if (sslPort > 0) { this.https_hls = new StreamURL("https", host, sslPort, file); this.wss_hls = new StreamURL("wss", host, sslPort, file); } @@ -215,9 +225,12 @@ public class StreamInfo implements Serializable, Cloneable{ public void setTs(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("%s/%s.live.ts%s", app, stream, callIdParam); - this.ts = new StreamURL("http", host, port, file); - this.ws_ts = new StreamURL("ws", host, port, file); - if (sslPort != 0) { + + if (port > 0) { + this.ts = new StreamURL("http", host, port, file); + this.ws_ts = new StreamURL("ws", host, port, file); + } + if (sslPort > 0) { this.https_ts = new StreamURL("https", host, sslPort, file); this.wss_ts = new StreamURL("wss", host, sslPort, file); } @@ -225,41 +238,78 @@ public class StreamInfo implements Serializable, Cloneable{ public void setRtc(String host, int port, int sslPort, String app, String stream, String callIdParam) { String file = String.format("index/api/webrtc?app=%s&stream=%s&type=play%s", app, stream, callIdParam); - this.rtc = new StreamURL("http", host, port, file); - if (sslPort != 0) { + if (port > 0) { + this.rtc = new StreamURL("http", host, port, file); + } + if (sslPort > 0) { this.rtcs = new StreamURL("https", host, sslPort, file); } } public void channgeStreamIp(String localAddr) { - this.flv.setHost(localAddr); - this.ws_flv.setHost(localAddr); - this.hls.setHost(localAddr); - this.ws_hls.setHost(localAddr); - this.ts.setHost(localAddr); - this.ws_ts.setHost(localAddr); - this.fmp4.setHost(localAddr); - this.ws_fmp4.setHost(localAddr); - this.rtc.setHost(localAddr); + if (this.flv != null) { + this.flv.setHost(localAddr); + } + if (this.ws_flv != null ){ + this.ws_flv.setHost(localAddr); + } + if (this.hls != null ) { + this.hls.setHost(localAddr); + } + if (this.ws_hls != null ) { + this.ws_hls.setHost(localAddr); + } + if (this.ts != null ) { + this.ts.setHost(localAddr); + } + if (this.ws_ts != null ) { + this.ws_ts.setHost(localAddr); + } + if (this.fmp4 != null ) { + this.fmp4.setHost(localAddr); + } + if (this.ws_fmp4 != null ) { + this.ws_fmp4.setHost(localAddr); + } + if (this.rtc != null ) { + this.rtc.setHost(localAddr); + } if (this.https_flv != null) { this.https_flv.setHost(localAddr); + } + if (this.wss_flv != null) { this.wss_flv.setHost(localAddr); + } + if (this.https_hls != null) { this.https_hls.setHost(localAddr); + } + if (this.wss_hls != null) { this.wss_hls.setHost(localAddr); + } + if (this.wss_ts != null) { this.wss_ts.setHost(localAddr); + } + if (this.https_fmp4 != null) { this.https_fmp4.setHost(localAddr); + } + if (this.wss_fmp4 != null) { this.wss_fmp4.setHost(localAddr); + } + if (this.rtcs != null) { this.rtcs.setHost(localAddr); } - this.rtsp.setHost(localAddr); + if (this.rtsp != null) { + this.rtsp.setHost(localAddr); + } if (this.rtsps != null) { this.rtsps.setHost(localAddr); } - this.rtmp.setHost(localAddr); + if (this.rtmp != null) { + this.rtmp.setHost(localAddr); + } if (this.rtmps != null) { this.rtmps.setHost(localAddr); } - } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java index 8f61bc96..c1fe2c1f 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java @@ -1,7 +1,5 @@ package com.genersoft.iot.vmp.gb28181.bean; -import gov.nist.javax.sip.message.SIPRequest; - public class SendRtpItem { /** @@ -108,6 +106,11 @@ public class SendRtpItem { */ private boolean onlyAudio = false; + /** + * 是否开启rtcp保活 + */ + private boolean rtcp = false; + /** * 播放类型 @@ -281,4 +284,12 @@ public class SendRtpItem { public void setToTag(String toTag) { this.toTag = toTag; } + + public boolean isRtcp() { + return rtcp; + } + + public void setRtcp(boolean rtcp) { + this.rtcp = rtcp; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java index 45e42b2d..7a26e783 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java @@ -120,9 +120,9 @@ public class AckRequestProcessor extends SIPRequestProcessorParent implements In param.put("pt", sendRtpItem.getPt()); param.put("use_ps", sendRtpItem.isUsePs() ? "1" : "0"); param.put("only_audio", sendRtpItem.isOnlyAudio() ? "1" : "0"); - if (!sendRtpItem.isTcp() && parentPlatform.isRtcp()) { + if (!sendRtpItem.isTcp()) { // 开启rtcp保活 - param.put("udp_rtcp_timeout", "1"); + param.put("udp_rtcp_timeout", sendRtpItem.isRtcp()? "1":"0"); } if (mediaInfo == null) { diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java index 3d3c772f..4bdbbdfb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java @@ -341,8 +341,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements return; } SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId, - device.getDeviceId(), channelId, - mediaTransmissionTCP); + device.getDeviceId(), channelId, mediaTransmissionTCP, platform.isRtcp()); if (tcpActive != null) { sendRtpItem.setTcpActive(tcpActive); @@ -537,8 +536,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements if (streamReady) { // 自平台内容 SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId, - gbStream.getApp(), gbStream.getStream(), channelId, - mediaTransmissionTCP); + gbStream.getApp(), gbStream.getStream(), channelId, mediaTransmissionTCP, platform.isRtcp()); if (sendRtpItem == null) { logger.warn("服务器端口资源不足"); @@ -577,8 +575,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements if (streamReady) { // 自平台内容 SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, port, ssrc, requesterId, - gbStream.getApp(), gbStream.getStream(), channelId, - mediaTransmissionTCP); + gbStream.getApp(), gbStream.getStream(), channelId, mediaTransmissionTCP, platform.isRtcp()); if (sendRtpItem == null) { logger.warn("服务器端口资源不足"); @@ -695,7 +692,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements dynamicTask.stop(callIdHeader.getCallId()); if (serverId.equals(userSetting.getServerId())) { SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, addressStr, finalPort, ssrc, requesterId, - app, stream, channelId, mediaTransmissionTCP); + app, stream, channelId, mediaTransmissionTCP, platform.isRtcp()); if (sendRtpItem == null) { logger.warn("上级点时创建sendRTPItem失败,可能是服务器端口资源不足"); @@ -757,7 +754,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements // 发送redis消息 redisGbPlayMsgListener.sendMsg(streamPushItem.getServerId(), streamPushItem.getMediaServerId(), streamPushItem.getApp(), streamPushItem.getStream(), addressStr, port, ssrc, requesterId, - channelId, mediaTransmissionTCP, null, responseSendItemMsg -> { + channelId, mediaTransmissionTCP, platform.isRtcp(),null, responseSendItemMsg -> { SendRtpItem sendRtpItem = responseSendItemMsg.getSendRtpItem(); if (sendRtpItem == null || responseSendItemMsg.getMediaServerItem() == null) { logger.warn("服务器端口资源不足"); diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java index dd054f85..c7105698 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java @@ -175,7 +175,7 @@ public class ZLMRTPServerFactory { * @param tcp 是否为tcp * @return SendRtpItem */ - public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String deviceId, String channelId, boolean tcp){ + public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String deviceId, String channelId, boolean tcp, boolean rtcp){ // 默认为随机端口 int localPort = 0; @@ -195,6 +195,7 @@ public class ZLMRTPServerFactory { sendRtpItem.setDeviceId(deviceId); sendRtpItem.setChannelId(channelId); sendRtpItem.setTcp(tcp); + sendRtpItem.setRtcp(rtcp); sendRtpItem.setApp("rtp"); sendRtpItem.setLocalPort(localPort); sendRtpItem.setServerId(userSetting.getServerId()); @@ -212,7 +213,7 @@ public class ZLMRTPServerFactory { * @param tcp 是否为tcp * @return SendRtpItem */ - public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String app, String stream, String channelId, boolean tcp){ + public SendRtpItem createSendRtpItem(MediaServerItem serverItem, String ip, int port, String ssrc, String platformId, String app, String stream, String channelId, boolean tcp, boolean rtcp){ // 默认为随机端口 int localPort = 0; if (userSetting.getGbSendStreamStrict()) { @@ -233,6 +234,7 @@ public class ZLMRTPServerFactory { sendRtpItem.setLocalPort(localPort); sendRtpItem.setServerId(userSetting.getServerId()); sendRtpItem.setMediaServerId(serverItem.getId()); + sendRtpItem.setRtcp(rtcp); return sendRtpItem; } diff --git a/src/main/java/com/genersoft/iot/vmp/service/bean/RequestSendItemMsg.java b/src/main/java/com/genersoft/iot/vmp/service/bean/RequestSendItemMsg.java index 66689fa6..0c6502d1 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/bean/RequestSendItemMsg.java +++ b/src/main/java/com/genersoft/iot/vmp/service/bean/RequestSendItemMsg.java @@ -63,10 +63,16 @@ public class RequestSendItemMsg { private Boolean isTcp; + /** + * 是否使用TCP + */ + private Boolean rtcp; + + public static RequestSendItemMsg getInstance(String serverId, String mediaServerId, String app, String stream, String ip, int port, - String ssrc, String platformId, String channelId, Boolean isTcp, String platformName) { + String ssrc, String platformId, String channelId, Boolean isTcp, Boolean rtcp, String platformName) { RequestSendItemMsg requestSendItemMsg = new RequestSendItemMsg(); requestSendItemMsg.setServerId(serverId); requestSendItemMsg.setMediaServerId(mediaServerId); @@ -79,6 +85,7 @@ public class RequestSendItemMsg { requestSendItemMsg.setPlatformName(platformName); requestSendItemMsg.setChannelId(channelId); requestSendItemMsg.setTcp(isTcp); + requestSendItemMsg.setRtcp(rtcp); return requestSendItemMsg; } @@ -170,4 +177,12 @@ public class RequestSendItemMsg { public void setTcp(Boolean tcp) { isTcp = tcp; } + + public Boolean getRtcp() { + return rtcp; + } + + public void setRtcp(Boolean rtcp) { + this.rtcp = rtcp; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java index 1628398a..1330262c 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java +++ b/src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java @@ -318,7 +318,7 @@ public class RedisGbPlayMsgListener implements MessageListener { SendRtpItem sendRtpItem = zlmrtpServerFactory.createSendRtpItem(mediaServerItem, content.getIp(), content.getPort(), content.getSsrc(), content.getPlatformId(), content.getApp(), content.getStream(), content.getChannelId(), - content.getTcp()); + content.getTcp(), content.getRtcp()); WVPResult result = new WVPResult<>(); result.setCode(0); @@ -348,9 +348,9 @@ public class RedisGbPlayMsgListener implements MessageListener { * @param callback 得到信息的回调 */ public void sendMsg(String serverId, String mediaServerId, String app, String stream, String ip, int port, String ssrc, - String platformId, String channelId, boolean isTcp, String platformName, PlayMsgCallback callback, PlayMsgErrorCallback errorCallback) { + String platformId, String channelId, boolean isTcp, boolean rtcp, String platformName, PlayMsgCallback callback, PlayMsgErrorCallback errorCallback) { RequestSendItemMsg requestSendItemMsg = RequestSendItemMsg.getInstance( - serverId, mediaServerId, app, stream, ip, port, ssrc, platformId, channelId, isTcp, platformName); + serverId, mediaServerId, app, stream, ip, port, ssrc, platformId, channelId, isTcp, rtcp, platformName); requestSendItemMsg.setServerId(serverId); String key = UUID.randomUUID().toString(); WvpRedisMsg redisMsg = WvpRedisMsg.getRequestInstance(userSetting.getServerId(), serverId, WvpRedisMsgCmd.GET_SEND_ITEM, diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue index e640d6f8..7c16c7cd 100644 --- a/web_src/src/components/dialog/devicePlayer.vue +++ b/web_src/src/components/dialog/devicePlayer.vue @@ -53,91 +53,91 @@ 更多地址 - + FLV: {{ streamInfo.flv.url }} - + FLV(https): {{ streamInfo.https_flv.url }} - + FLV(ws): {{ streamInfo.ws_flv.url }} - + FLV(wss): {{ streamInfo.wss_flv.url }} - + FMP4: {{ streamInfo.fmp4.url }} - + FMP4(https): {{ streamInfo.https_fmp4.url }} - + FMP4(ws): {{ streamInfo.ws_fmp4.url }} - + FMP4(wss): {{ streamInfo.wss_fmp4.url }} - + HLS: {{ streamInfo.hls.url }} - + HLS(https): {{ streamInfo.https_hls.url }} - + HLS(ws): {{ streamInfo.ws_hls.url }} - + HLS(wss): {{ streamInfo.wss_hls.url }} - + TS: {{ streamInfo.ts.url }} - + TS(https): {{ streamInfo.https_ts.url }} - + TS(ws): {{ streamInfo.ws_ts.url }} - + TS(wss): {{ streamInfo.wss_ts.url }} - + RTC: {{ streamInfo.rtc.url }} - + RTCS: {{ streamInfo.rtcs }} - + RTMP: {{ streamInfo.rtmp.url }} - + RTMPS: {{ streamInfo.rtmps.url }} - + RTSP: {{ streamInfo.rtsp.url }} - + RTSPS: {{ streamInfo.rtsps.url }}