From 15c5e70dd90a0389d70b3d855977dfd9070588fc Mon Sep 17 00:00:00 2001 From: web <candymxq888@outlook.com> Date: 星期二, 03 六月 2025 09:48:55 +0800 Subject: [PATCH] fix:修改金川视频播放,弹窗方式 --- src/components/VideoPlayer/VideoPlayer.vue | 37 ++++++++---- src/views/screen/flow/graphic/index.vue | 90 +++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 15 deletions(-) diff --git a/src/components/VideoPlayer/VideoPlayer.vue b/src/components/VideoPlayer/VideoPlayer.vue index 084aca4..82e1f2d 100644 --- a/src/components/VideoPlayer/VideoPlayer.vue +++ b/src/components/VideoPlayer/VideoPlayer.vue @@ -4,7 +4,6 @@ <div class="playerBtn"> <el-icon class="icon" v-if="showPlay" @click="handlePlayer"><VideoPlay /></el-icon> <el-icon class="icon" v-if="showPause" @click="hanlePause"><VideoPause /></el-icon> - <el-icon class="icon is-loading" v-if="showLoading"><Loading /></el-icon> </div> </div> </template> @@ -27,22 +26,22 @@ const videoRef = ref(null); const videojsb = ref(); -const showPlay = ref(true); +const isPlay = ref(false); +const showPlay = ref(false); const showPause = ref(false); -const showLoading = ref(false); let timer = null; +let timerOut = null; //通知设备上传媒体流,做节流,防止过度点击 const handlePlayer = debounce(function() { showPlay.value = false; - showLoading.value = true; // 获取播放地址 getVideoMedia(props.item.deviceId, props.item.channelId).then(res => { videojsb.value.play(res.data.url); + isPlay.value = true; }).catch(() => { + isPlay.value = false; showPlay.value = true; - }).finally(() => { - showLoading.value = false; }) // 挂定时任务,2分钟获取一次直播流数据,防止客户关闭页面,如果2分钟未获取,后端断开链接 if(timer) clearInterval(timer) @@ -53,22 +52,35 @@ }, 2000, true) const hanlePause = () => { + isPlay.value = false; showPause.value = false; showPlay.value = true; clearInterval(timer) + clearTimeout(timerOut); stopVideoMedia(props.item.deviceId, props.item.channelId).then(() => { console.log('关闭成功') }) } const handleEnter = () => { - if(props.item.deviceId && props.item.channelId && !showPlay.value && !showLoading.value) { - showPause.value = true; + if(props.item.deviceId && props.item.channelId) { + if(isPlay.value) { + if(timerOut) clearTimeout(timerOut); + showPause.value = true; + // 延时2秒隐藏暂停按钮 + timerOut = setTimeout(() => { + showPause.value = false; + }, 3000) + } else { + showPlay.value = true; + } } } const handleLeave = () => { + if(timerOut) clearTimeout(timerOut); showPause.value = false; + showPlay.value = false; } // 实例化dom节点 @@ -87,7 +99,7 @@ // debug: true, supportDblclickFullscreen: false, operateBtns: { - fullscreen: true, + fullscreen: false, play: false, audio: true, recorder: false, @@ -128,6 +140,7 @@ videojsb.value.destroy(); } if(timer) clearInterval(timer) + if(timerOut) clearTimeout(timerOut) }) @@ -160,8 +173,8 @@ font-size: 3rem; } } - :deep(.jessibuca-controls) { - background-color: transparent; - } + .mask{ + position: absolute; + } } </style> diff --git a/src/views/screen/flow/graphic/index.vue b/src/views/screen/flow/graphic/index.vue index 8fce991..a769c19 100644 --- a/src/views/screen/flow/graphic/index.vue +++ b/src/views/screen/flow/graphic/index.vue @@ -14,11 +14,16 @@ const userType = ref(getUserType()) const searchVal = ref('') const playerData = ref([]) +const showFullScreen = ref(false) +const fullIndex = ref() // 全屏弹窗 const handleFullScreen = (index) => { - const dom = document.getElementById(`player${index}`) - dom.requestFullscreen() + fullIndex.value = index + showFullScreen.value = true +} +const closeFullScreen = () => { + showFullScreen.value = false } // 抓拍 @@ -116,7 +121,7 @@ <div class="item" v-for="(item, index) in playerData" :key="index"> <div class="title">{{ item.pointName }}</div> <div class="item-video" :id="`player${index}`"> - <VideoPlayer :item="item" :autoPlay="true" /> + <VideoPlayer :item="item" :autoPlay="false" /> </div> <div class="info"> <div class="info-list"> @@ -161,6 +166,47 @@ <el-button style="width: 6rem" @click="handleSnap(index)">抓拍</el-button> </div> </div> + </div> + </div> + </div> + </div> + + <div class="fullDialog" v-if="showFullScreen"> + <VideoPlayer :item="playerData[fullIndex]" :autoPlay="true" /> + <div class="closeIcon" @click="closeFullScreen"><el-icon><CircleClose /></el-icon></div> + <div class="full-mask"> + <div class="mask-list"> + <div class="mask-item"> + <div class="name">水位:</div> + <div class="val"><span>{{ playerData[fullIndex].waterLevel }}</span>m</div> + </div> + <div class="mask-item"> + <div class="name">表面流速:</div> + <div class="val"><span>{{ playerData[fullIndex].flowVelocity }}</span>m/s</div> + </div> + <div class="mask-item"> + <div class="name">水面宽度:</div> + <div class="val"><span>{{ playerData[fullIndex].waterWidth }}</span>m</div> + </div> + <div class="mask-item"> + <div class="name">平均流速:</div> + <div class="val"><span>{{ playerData[fullIndex].avgVelocity }}</span>m/s</div> + </div> + <div class="mask-item"> + <div class="name">过水面积:</div> + <div class="val"><span>{{ playerData[fullIndex].waterArea }}</span>m³</div> + </div> + <div class="mask-item"> + <div class="name">雷达流速:</div> + <div class="val"><span>{{ playerData[fullIndex].radarVelocity }}</span>m/s</div> + </div> + <div class="mask-item"> + <div class="name">实时流量:</div> + <div class="val"><span>{{ playerData[fullIndex].newFlow }}</span>m³/h</div> + </div> + <div class="mask-item"> + <div class="name">起点距:</div> + <div class="val"><span>{{ playerData[fullIndex].radarDistance }}</span>m</div> </div> </div> </div> @@ -338,5 +384,43 @@ } } } + + .fullDialog{ + position: fixed; + left: 0; + top: 0; + z-index: 200; + width: 100%; + height: 100%; + background-color: #000; + .closeIcon{ + position: absolute; + right: 20px; + top: 20px; + color: #fff; + font-size: 36px; + } + .full-mask{ + position: absolute; + left: 100px; + bottom: 100px; + width: 250px; + height: 270px; + background-color: rgba(0, 0, 0, 0.5); + border-radius: 20px; + .mask-list{ + padding: 10px 20px; + .mask-item{ + display: flex; + align-items: center; + color: #fff; + padding: 5px 0; + .name{ + width: 50%; + } + } + } + } + } } </style> \ No newline at end of file -- Gitblit v1.9.3