H5页面多个视频如何只同时播放一个?

news/2024/11/16 8:25:02/

目录

      • 背景
        • 1. 首先介绍下 muted 属性
        • 2. 监听播放和暂停操作
        • 3. 视频播放完毕后返回桌面,再进入H5页面发现视频封面丢失置灰
          • 解决思路:

背景

页面模块同时有个四个视频模块,发现可以同时播放四个视频,但是理想的是每次只播放一个。
在这里插入图片描述

旧代码:

<div class="list-item" v-for="item of VIDEO_TYPES" :key="item.title"><videoref="videosRef"class="video"playsinlinemutedwebkit-playsinlinepreload="auto"x5-video-player-type="h5-page"controls:poster="item.poster":src="item.video"></video></div>
1. 首先介绍下 muted 属性

一个布尔属性,指明在视频中音频的默认设置。设置后,音频会初始化为静音。默认值是 false, 意味着视频播放的时候音频也会播放。

视频静音的情况下,IOS 可以同时播放多个,所以把这个属性去掉,IOS 每次就只能播放一个了,但是 Android 比较特殊,即使去到这个属性也还是可以同时播放多个视频。

2. 监听播放和暂停操作

在每次点击播放的时候,先停止所有视频,然后在播放正在点击的视频。

 <div class="list-item" v-for="item of VIDEO_TYPES" :key="item.title"><videoref="videosRef"class="video"playsinlinewebkit-playsinlinepreload="auto"x5-video-player-type="h5-page"controls:poster="item.poster":src="item.video"@play="onPlay(item.video)"@pause="onPause(item.video)"></video><div class="title">{{ item.title }}</div></div>const activeVideoId = ref('');const onPlay = (videoId) => {if (isIOS) return; // IOS不需要处理,不然会有点击的卡顿感// 如果已有视频在播放,暂停它if (activeVideoId.value && activeVideoId.value !== videoId) {const activeVideo = videosRef.value.find((video) => {return video.src === activeVideoId.value;});if (activeVideo) {activeVideo.pause();}}activeVideoId.value = videoId; // 设置当前播放的视频
};
// 视频暂停时触发
const onPause = (videoId) => {if (isIOS) return;if (activeVideoId.value === videoId) {activeVideoId.value = null; // 清除当前播放的视频 ID}
};

在这里插入图片描述

3. 视频播放完毕后返回桌面,再进入H5页面发现视频封面丢失置灰

在这里插入图片描述
可能原因:
当你退出视频播放页面(例如最小化到桌面),浏览器可能会暂停页面的 JavaScript 执行或丢失某些页面状态。导致重新进入页面时,视频封面未被正确恢复。

解决思路:

确保封面重新加载:

在页面重新进入时,强制重新加载封面图像。你可以通过监听 visibilitychange 事件或使用 onfocus 事件来确保封面图像的状态恢复。

const refreshVideo = () => {const videos = document.querySelectorAll('video');// 遍历每个 video 元素videos.forEach((video) => {const src = video.getAttribute('src');const wasPlaying = !video.paused;video.setAttribute('src', '');video.setAttribute('src', src);if (wasPlaying) {video.play();} else {// 重新加载视频video.load();}});
};onMounted(() => {document.addEventListener('visibilitychange', refreshVideo);});
onBeforeMount(() => {document.removeEventListener('visibilitychange', refreshVideo);
});

http://www.ppmy.cn/news/1547403.html

相关文章

ApiSmart-QWen2.5 coder vs GPT-4o 那个更强? ApiSmart 测评

QWen2.5 coder vs GPT-4o 那个更强&#xff1f; 那个更快&#xff0c; 那个更精准&#xff0c;让我们来看看&#xff1b; ApiSmart Api design Copilot - ApiHugApiSmart make your api design and implement happierhttps://apihug.com/zhCN-docs/copilot 【Apismart】QWen2.…

SpringBoot -- 自动化装配源码

自动化装配源码 EnableAutoConfiguration 注解&#xff0c;开启自动配置的核心注解AutoConfigurationPackage 注解 AutoConfigurationImportSelector 类getAutoConfigurationEntry 方法getCandidateConfigurations 方法 SpringFactoriesLoader EnableAutoConfiguration 注解&am…

Rust 语言学习笔记(五)

终于来到了 Rust 的精髓所在了&#xff0c;那就是使之不依赖于垃圾回收又能保障内存安全且高效运行的所有权系统(Ownership System)。想要用 Rust 做一个稍显规模项目必定绕不过它&#xff0c;所有权系统包括所有权(Ownership), 借用(Borrowing), 生命周期(Lifetimes)。 以下概…

【教程】Ubuntu设置alacritty为默认终端

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景介绍 设置教程 注意事项 背景介绍 alacritty是一个开源的终端&#xff0c;比默认的xterm更好看&#xff0c;甚至编辑文本时候还会代码高亮…

使用 Vue 和 ECharts 创建交互式图表

使用 Vue 和 ECharts 创建交互式图表 引言 在现代 Web 应用中&#xff0c;数据可视化是一个重要的组成部分。它不仅能够帮助用户更好地理解复杂的数据&#xff0c;还能提升用户体验。 技术背景 Vue.js Vue.js 是一个渐进式 JavaScript 框架&#xff0c;用于构建用户界面。…

面试经典 150 题:20、2、228

20. 有效的括号 参考代码 #include <stack>class Solution { public:bool isValid(string s) {if(s.size() < 2){ //特判&#xff1a;空字符串和一个字符的情况return false;}bool flag true;stack<char> st; //栈for(int i0; i<s.size(); i){if(s[i] ( |…

免押租赁系统的优势与应用前景分析

内容概要 免押租赁系统是一种新兴的租赁形式&#xff0c;它利用了信用大数据与区块链技术的优势&#xff0c;帮助用户摆脱了传统租赁中常见的押金烦恼。通过这种方式&#xff0c;用户不仅可以体验到更低的租用门槛&#xff0c;还能享受到更顺畅的交易过程。用户只需提供基本的…

Linux网络——网络初识

目录 1. 认识协议 2. 协议的分层 3. OSI 七层模型 && TCP/IP 五层(四层)模型 4. 网络传输的基本流程 5. 以太网的通信原理 6. 数据的跨网络传播 7. 认识 IP 地址 ① IP 是什么 ② IP 与 MAC 的关系 ③ 为什么需要 IP 在谈及网络之前&#xff0c;我们要先对学…