修复协议端口配置不全导致前端播放页面无法弹出的问题
| | |
| | | |
| | | 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); |
| | | } |
| | |
| | | |
| | | 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); |
| | | } |
| | |
| | | |
| | | 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); |
| | | } |
| | |
| | | |
| | | 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); |
| | | } |
| | |
| | | |
| | | 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); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | |
| | | package com.genersoft.iot.vmp.gb28181.bean; |
| | | |
| | | import gov.nist.javax.sip.message.SIPRequest; |
| | | |
| | | public class SendRtpItem { |
| | | |
| | | /** |
| | |
| | | * 当usePs 为false时,有效。为1时,发送音频;为0时,发送视频;不传时默认为0 |
| | | */ |
| | | private boolean onlyAudio = false; |
| | | |
| | | /** |
| | | * 是否开启rtcp保活 |
| | | */ |
| | | private boolean rtcp = false; |
| | | |
| | | |
| | | /** |
| | |
| | | public void setToTag(String toTag) { |
| | | this.toTag = toTag; |
| | | } |
| | | |
| | | public boolean isRtcp() { |
| | | return rtcp; |
| | | } |
| | | |
| | | public void setRtcp(boolean rtcp) { |
| | | this.rtcp = rtcp; |
| | | } |
| | | } |
| | |
| | | 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) { |
| | |
| | | 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); |
| | |
| | | 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("服务器端口资源不足"); |
| | |
| | | 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("服务器端口资源不足"); |
| | |
| | | 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失败,可能是服务器端口资源不足"); |
| | |
| | | // 发送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("服务器端口资源不足"); |
| | |
| | | * @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; |
| | |
| | | sendRtpItem.setDeviceId(deviceId); |
| | | sendRtpItem.setChannelId(channelId); |
| | | sendRtpItem.setTcp(tcp); |
| | | sendRtpItem.setRtcp(rtcp); |
| | | sendRtpItem.setApp("rtp"); |
| | | sendRtpItem.setLocalPort(localPort); |
| | | sendRtpItem.setServerId(userSetting.getServerId()); |
| | |
| | | * @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()) { |
| | |
| | | sendRtpItem.setLocalPort(localPort); |
| | | sendRtpItem.setServerId(userSetting.getServerId()); |
| | | sendRtpItem.setMediaServerId(serverItem.getId()); |
| | | sendRtpItem.setRtcp(rtcp); |
| | | return sendRtpItem; |
| | | } |
| | | |
| | |
| | | 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); |
| | |
| | | requestSendItemMsg.setPlatformName(platformName); |
| | | requestSendItemMsg.setChannelId(channelId); |
| | | requestSendItemMsg.setTcp(isTcp); |
| | | requestSendItemMsg.setRtcp(rtcp); |
| | | |
| | | return requestSendItemMsg; |
| | | } |
| | |
| | | public void setTcp(Boolean tcp) { |
| | | isTcp = tcp; |
| | | } |
| | | |
| | | public Boolean getRtcp() { |
| | | return rtcp; |
| | | } |
| | | |
| | | public void setRtcp(Boolean rtcp) { |
| | | this.rtcp = rtcp; |
| | | } |
| | | } |
| | |
| | | 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); |
| | |
| | | * @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, |
| | |
| | | 更多地址<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> |