From fa2ccb4ec8737df8718f1507bdd290fc7b5dd144 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期五, 25 十一月 2022 10:50:16 +0800
Subject: [PATCH] 修复协议端口配置不全导致前端播放页面无法弹出的问题

---
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java |   13 +--
 src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpItem.java                                   |   15 +++
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java                              |    6 +
 web_src/src/components/dialog/devicePlayer.vue                                                      |   44 +++++-----
 src/main/java/com/genersoft/iot/vmp/service/bean/RequestSendItemMsg.java                            |   17 ++++
 src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java                                          |  108 +++++++++++++++++++-------
 src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/AckRequestProcessor.java    |    4 
 src/main/java/com/genersoft/iot/vmp/service/redisMsg/RedisGbPlayMsgListener.java                    |    6 
 8 files changed, 144 insertions(+), 69 deletions(-)

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 460f418..8311745 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 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 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 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 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 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 8f61bc9..c1fe2c1 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 {
 
     /**
@@ -107,6 +105,11 @@
      * 褰搖sePs 涓篺alse鏃讹紝鏈夋晥銆備负1鏃讹紝鍙戦�侀煶棰戯紱涓�0鏃讹紝鍙戦�佽棰戯紱涓嶄紶鏃堕粯璁や负0
      */
     private boolean onlyAudio = false;
+
+    /**
+     * 鏄惁寮�鍚痳tcp淇濇椿
+     */
+    private boolean rtcp = false;
 
 
     /**
@@ -281,4 +284,12 @@
     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 45e42b2..7a26e78 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 @@
 		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()) {
 			// 寮�鍚痳tcp淇濇椿
-			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 3d3c772..4bdbbdf 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 @@
                         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 @@
             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("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
@@ -577,8 +575,7 @@
             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("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
@@ -695,7 +692,7 @@
                 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澶辫触锛屽彲鑳芥槸鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
@@ -757,7 +754,7 @@
         // 鍙戦�乺edis娑堟伅
         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("鏈嶅姟鍣ㄧ鍙h祫婧愪笉瓒�");
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 dd054f8..c710569 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 @@
      * @param tcp 鏄惁涓簍cp
      * @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 @@
         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 @@
      * @param tcp 鏄惁涓簍cp
      * @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 @@
         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 66689fa..0c6502d 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 @@
     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 @@
         requestSendItemMsg.setPlatformName(platformName);
         requestSendItemMsg.setChannelId(channelId);
         requestSendItemMsg.setTcp(isTcp);
+        requestSendItemMsg.setRtcp(rtcp);
 
         return  requestSendItemMsg;
     }
@@ -170,4 +177,12 @@
     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 1628398..1330262 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 @@
         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<ResponseSendItemMsg> result = new WVPResult<>();
         result.setCode(0);
@@ -348,9 +348,9 @@
      * @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 e640d6f..7c16c7c 100644
--- a/web_src/src/components/dialog/devicePlayer.vue
+++ b/web_src/src/components/dialog/devicePlayer.vue
@@ -53,91 +53,91 @@
                                 鏇村鍦板潃<i class="el-icon-arrow-down el-icon--right"></i>
                               </el-button>
                               <el-dropdown-menu slot="dropdown" >
-                                <el-dropdown-item :command="streamInfo.flv.url">
+                                <el-dropdown-item v-if="streamInfo.flv" :command="streamInfo.flv.url">
                                   <el-tag >FLV:</el-tag>
                                   <span>{{ streamInfo.flv.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.https_flv.url">
+                                <el-dropdown-item v-if="streamInfo.https_flv" :command="streamInfo.https_flv.url">
                                   <el-tag >FLV(https):</el-tag>
                                   <span>{{ streamInfo.https_flv.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.ws_flv.url">
+                                <el-dropdown-item v-if="streamInfo.ws_flv" :command="streamInfo.ws_flv.url">
                                   <el-tag  >FLV(ws):</el-tag>
                                   <span >{{ streamInfo.ws_flv.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.wss_flv.url">
+                                <el-dropdown-item v-if="streamInfo.wss_flv" :command="streamInfo.wss_flv.url">
                                   <el-tag  >FLV(wss):</el-tag>
                                   <span>{{ streamInfo.wss_flv.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.fmp4.url">
+                                <el-dropdown-item v-if="streamInfo.fmp4" :command="streamInfo.fmp4.url">
                                   <el-tag >FMP4:</el-tag>
                                   <span>{{ streamInfo.fmp4.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.https_fmp4.url">
+                                <el-dropdown-item v-if="streamInfo.https_fmp4" :command="streamInfo.https_fmp4.url">
                                   <el-tag >FMP4(https):</el-tag>
                                   <span>{{ streamInfo.https_fmp4.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.ws_fmp4.url">
+                                <el-dropdown-item v-if="streamInfo.ws_fmp4" :command="streamInfo.ws_fmp4.url">
                                   <el-tag >FMP4(ws):</el-tag>
                                   <span>{{ streamInfo.ws_fmp4.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.wss_fmp4.url">
+                                <el-dropdown-item v-if="streamInfo.wss_fmp4" :command="streamInfo.wss_fmp4.url">
                                   <el-tag >FMP4(wss):</el-tag>
                                   <span>{{ streamInfo.wss_fmp4.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.hls.url">
+                                <el-dropdown-item v-if="streamInfo.hls" :command="streamInfo.hls.url">
                                   <el-tag>HLS:</el-tag>
                                   <span>{{ streamInfo.hls.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.https_hls.url">
+                                <el-dropdown-item v-if="streamInfo.https_hls" :command="streamInfo.https_hls.url">
                                   <el-tag >HLS(https):</el-tag>
                                   <span>{{ streamInfo.https_hls.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.ws_hls.url">
+                                <el-dropdown-item v-if="streamInfo.ws_hls" :command="streamInfo.ws_hls.url">
                                   <el-tag >HLS(ws):</el-tag>
                                   <span>{{ streamInfo.ws_hls.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.wss_hls.url">
+                                <el-dropdown-item v-if="streamInfo.wss_hls"  :command="streamInfo.wss_hls.url">
                                   <el-tag >HLS(wss):</el-tag>
                                   <span>{{ streamInfo.wss_hls.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.ts.url">
+                                <el-dropdown-item v-if="streamInfo.ts"  :command="streamInfo.ts.url">
                                   <el-tag>TS:</el-tag>
                                   <span>{{ streamInfo.ts.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.https_ts.url">
+                                <el-dropdown-item v-if="streamInfo.https_ts" :command="streamInfo.https_ts.url">
                                   <el-tag>TS(https):</el-tag>
                                   <span>{{ streamInfo.https_ts.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.ws_ts.url">
+                                <el-dropdown-item v-if="streamInfo.ws_ts" :command="streamInfo.ws_ts.url">
                                   <el-tag>TS(ws):</el-tag>
                                   <span>{{ streamInfo.ws_ts.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.wss_ts.url">
+                                <el-dropdown-item v-if="streamInfo.wss_ts" :command="streamInfo.wss_ts.url">
                                   <el-tag>TS(wss):</el-tag>
                                   <span>{{ streamInfo.wss_ts.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.rtc.url">
+                                <el-dropdown-item v-if="streamInfo.rtc" :command="streamInfo.rtc.url">
                                   <el-tag >RTC:</el-tag>
                                   <span>{{ streamInfo.rtc.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.rtcs.url">
+                                <el-dropdown-item v-if="streamInfo.rtcs" :command="streamInfo.rtcs.url">
                                   <el-tag >RTCS:</el-tag>
                                   <span>{{ streamInfo.rtcs }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.rtmp.url">
+                                <el-dropdown-item v-if="streamInfo.rtmp" :command="streamInfo.rtmp.url">
                                   <el-tag >RTMP:</el-tag>
                                   <span>{{ streamInfo.rtmp.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.rtmps.url">
+                                <el-dropdown-item v-if="streamInfo.rtmps" :command="streamInfo.rtmps.url">
                                   <el-tag >RTMPS:</el-tag>
                                   <span>{{ streamInfo.rtmps.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.rtsp.url">
+                                <el-dropdown-item v-if="streamInfo.rtsp" :command="streamInfo.rtsp.url">
                                   <el-tag >RTSP:</el-tag>
                                   <span>{{ streamInfo.rtsp.url }}</span>
                                 </el-dropdown-item>
-                                <el-dropdown-item :command="streamInfo.rtsps.url">
+                                <el-dropdown-item v-if="streamInfo.rtsps" :command="streamInfo.rtsps.url">
                                   <el-tag >RTSPS:</el-tag>
                                   <span>{{ streamInfo.rtsps.url }}</span>
                                 </el-dropdown-item>

--
Gitblit v1.8.0