因为需求理解不到位,视频自动播放列表又重写了

news2024/11/17 5:44:43

一、一定要理解需求再下手

刚接手一个旧项目,只需要在上面添加一些新功能,和后端对对接口就可以了。因为害怕总是去问别人需求惹人烦,所以好几次讨论给我讲需求我就说我懂了,然后下来自己思考怎么做。最后又因为好多需求理解不到位,自己开发起来很费劲,耽搁了时间不说,还犯了很多错误,甚至接口都调错了好几次。所以以后一定要理解需求,最好有时间画一个流程图或者思维导图,犯了错也能有迹可循。

二、因为需求理解不到位,视频列表又重写了

还是上一篇文章的需求,但是被我想的很复杂。其实只需要有一个video播放器和一个视频列表,视频可以点击列表切换,每次切换时改变一个video播放器的视频地址就可以了,样子大概还是这样:

总的说来就三个要点:

  • 进入页面自动播放视频
  • 点击列表切换视频
  • 当前视频播放完毕自动播放下一个视频

虽然需求少,但是需要考虑的东西还是挺多的,比如:列表的交互,最后一个视频播放完成切换到第一个,自动切换时列表样式也要随之切换等等。

三、重新理解需求后的新思路

video播放器

这里本来用的 vue3-video-play 组件,结果后面踩了一个坑,不知道是不是组件的bug(后面会讲),后面又换成原生 video 标签了,但是控制器就不好看了。

视频列表

这里还是使用的 swiper ,控制自由切换确实很方便

四、编码

  • 下载引入 vue3-video-play,文档,建议跳过,已经踩了坑了,可以就用原生

保存数据

const state = reactive({
    videoData: [], //所有视频数据,因为数据不多,暂时没有考虑分页
    curData: {}, //当前视频数据
    swiper:{}, //swiper实例
}) 

swiper因为之前用的原生写的,所以对原生比较熟悉,就直接用的原生了,其实有swiper集成vue,有时间再看下。

切记要在拿到数据后才创建swiper实例

const getVideoData = () => {
    getDataScreenMediaList(params).then(res => {
        // state.videoData = res.data
        state.videoData = [
          {
                fileId: "1",
                fileSurfacePlot: "src/assets/images/banner/g1.png",
                filePath: "https://cdn.uviewui.com/uview/resources/video.mp4",
                mediaTitle: "transition是一种动画的表现形式,有4个属性",
          }
      ]
        return
  }).then(()=>{
        createSwiper()
  })
}
const createSwiper = () => {
    state.swiper = new Swiper(".mySwiper", {
        spaceBetween: 10,
        slidesPerView: 4,
        freeMode: true,
        watchSlidesProgress: true,
  });
}; 

页面结构大概就是这样

<div class="main">
    <div class="video">
        <!--- 这里之前是vue3-video-play的组件,后面换原生了 --->
        <video
               class="d-player-video-main"
               :src="state.curData.filePath"
               :poster="state.curData.fileSurfacePlot"
               controls
               @ended="onended"
               @pause="onpause"
               ></video>
    </div>
    <div class="swiper mySwiper">
        <div class="swiper-wrapper">
            <div
                 v-for="(item, index) in state.videoData"
                 :key="item.fileId"
                 :class="[{ active: state.curData.fileId == item.fileId },'swiper-slide',]"
                 @click="switchVideo(item, index)"
                 >
                <p>{{ item.mediaTitle }}</p>
                <img :src="item.fileSurfacePlot" />
            </div>
        </div>
    </div> 

接下来,控制切换自动播放视频

//切换视频
const switchVideo = async (val: object, index: number) => {
  state.swiper.slideTo(index);
  state.curData = val;
  await nextTick();
  document.querySelector(".d-player-video-main").play();
}; 

就是在这里那个 vue3-video-play 组件出现了问题,切换的时候自动播放,但是控制器还是停止播放的样式。

当点击暂停后切换,视频会自动播放,但是样式还是暂停的样式

忘记截图了,坑已经踩过了,有没有遇到过这个问题的,其实还是想用这个组件,ui会比原生好看一点,后面有机会看看 vue3-video-player

然后,监听视频播放结束切换下一个视频

//监听视频播放结束
const onended = async () => {
    let index = state.videoData.findIndex(
      (item) => item.fileId == state.curData.fileId
  );
    if (state.videoData[index + 1]) {
        state.curData = state.videoData[index + 1];
        state.swiper.slideNext();
  } else {
        state.swiper.slideTo(0);
        state.curData = state.videoData[0];
  }
    await nextTick();
    document.querySelector(".d-player-video-main").play();
}; 

最后,进入页面自动播放视频,这个问题百度了很多总的说来就三个方案

  • autoplay 静音自动播放
  • iframe可以设置自动播放,src设置一个很短的音频触发浏览器打开音频
  • 监听用户事件触发play()方法

选择了第三种方式

//放在创建了swiper实例之后的 .then 中
document.querySelector(".main").addEventListener("mousemove", mouseMove);
document.querySelector(".main").addEventListener("click", mouseClick); 
//鼠标移动事件回调
const mouseMove = () => {
    document.querySelector(".d-player-video-main").play().catch(()=>{
        return
  });
};
//鼠标点击事件回调 
const mouseClick = () => {
    document.querySelector(".main").removeEventListener("mousemove", mouseMove);
} 

记得在 onUnmounted 中移除事件

onUnmounted(()=>{
  document.querySelector(".main").removeEventListener("click", mouseClick);
  document.querySelector(".main").removeEventListener("mousemove", mouseMove);
}) 

五、总结

写一个视频播放也算是踩坑无数了,还是经历的太少了,以后做需求一定要理解需求,最好画个流程图再开始做。

  • 根据后端返回数据编写页面结构,使用swiper插件制作播放列表效果
  • 进入页面监听鼠标移动事件:触发play方法,监听点击事件:移除鼠标移动事件
  • 监听列表点击事件,传入视频数据和下标,修改当前视频数据,移动slide到当前下标
  • 监听视频播放结束事件,将当前视频数据修改为下一个(如果存在),移动slide到下一个(如果存在),不存在就回到第一个。

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】机器学习实验一:线性回归(详细代码展示)

文章目录一、前言二、梯度下降理解算法2.1 单变量线性回归2.2 多变量线性回归2.3 正则化2.3.1 L2正则化&#xff08;Ridge回归&#xff09;2.3.2 L1正则化&#xff08;Lasso回归&#xff09;三、实验一详细代码案例一、前言 本次实验我将分为两个部分进行讲解&#xff0c;第一…

Echarts 模拟汽车速度和油量的仪表显示,两个仪表盘同图

第025个点击查看专栏目录本示例的目标是模拟汽车速度和油量的仪表显示&#xff0c;这里两个仪表盘同图&#xff0c;并倾斜一定的角度。 文章目录示例效果示例源代码&#xff08;共115行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共115行&#xff09; /*…

ABAP中Literals的用法(untyped literal vs. typed literal)

1. 什么是Literals ? Literals的字面意思即“文字”。其实&#xff0c;Literals就是在ABAP代码中直接指定的一个字符串&#xff0c;但注意哦&#xff0c;这个字符串并不意味着其类型一定是string哦。 要弄清这个概念&#xff0c;就要清楚ABAP对于Literals 的定义和处理方式。…

Win10+vs2019配置与运行RenderMatch+用contextcapture进行重建

Win10vs2019配置与运行RenderMatch用contextcapture进行重建 继上一篇博客&#xff0c;ground image 和aerial image影像匹配结果将会被保存为match.bin二进制文件里 再次运行时&#xff0c;只需要把这个bin文件load进来就可以了&#xff0c;不需要再次进行匹配&#xff0c;修…

推荐五款在手机上写代码的APP(附下载地址)

&#x1f31f;1.C4droid一款Android设备上的C/C程序IDE&#x1f31f;2.AIDE一个直接在 Android 设备上开发 Android 应用的集成开发环境基于原版深度定制、适配本土化的操作习惯&#xff0c;一键快速添加常用的代码&#xff0c;大幅提高开发效率。实时的语言翻译&#xff0c;帮…

CUDA的卸载

大家好,下面将进行CUDA的卸载,卸载情况描述如下: > 安装在电脑Windows10系统 (1)安装在电脑Windows10系统,打开控制面板-程序-程序和功能,可以看到自己已经安装过的CUDA,如下所示: (2)依次选中需要卸载的CUDA包,鼠标右键点击卸载即可,一般需要保留3个已经安装…

idea集成Alibaba Cloud Toolkit插件

idea集成Alibaba Cloud Toolkit插件 ​ 使用该插件主要是简化打包、上传、启动服务的相关操作。 ​ 很早之前的方式是使用开发工具&#xff08;eclipse,idea&#xff09;&#xff0c;使用maven命令完成项目打包&#xff08;这里指jar&#xff09;&#xff0c;然后通过shell工…

SSL证书的五大优势

SSL 重要吗&#xff1f;我需要 SSL 吗&#xff1f;开车时需要系好安全带吗&#xff1f;看日食时需要戴防护眼镜吗&#xff1f;就前三个问题而言&#xff0c;答案是一个很大的“是”&#xff01;如果您在 2021 年拥有网站或博客&#xff0c;则需要 SSL。就这么简单。SSL 证书不再…

BigBird:大鸟模型中文生成式长文本摘要实践

1、介绍 BigBird 是一种基于稀疏注意力的Transformer&#xff0c;可将基于Transformer的模型&#xff08;例如 BERT&#xff09;扩展到更长的序列。 论文&#xff1a;https://arxiv.org/abs/2007.14062 代码&#xff1a;https://github.com/google-research/bigbird BigBir…

Day902.Memory存储引擎 -MySQL实战

Memory存储引擎 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Memory存储引擎的内容。 两个 group by 语句都用了 order by null&#xff0c;为什么使用内存临时表得到的语句结果里&#xff0c;0 这个值在最后一行&#xff1b; 而使用磁盘临时表得到的结果里&…

ARM的工作模式和37个寄存器

一、ARM的工作模式 ARM一共有7种工作模式 模式含义User非特权模式&#xff0c;大部分任务执行在这种模式FIQ当一个高优先级&#xff08;fast) 中断产生时将会进入这种模式IRQ当一个低优先级&#xff08;normal) 中断产生时将会进入这种模式Supervisor当复位或软中断指令执行时…

巨头混战,抢着“兜底”自动驾驶安全

诚然&#xff0c;中国汽车行业的发展绝对不会拘泥于电动化&#xff0c;必定会在电动化的基础上&#xff0c;迎接下半场的快速智能化。 2021年6月&#xff0c;长城汽车线控底盘全球首次发布。 彼时&#xff0c;长城汽车技术副总裁宋东先宣布&#xff0c;整合了线控转向、线控制…

基于海鸥算法改进的DELM分类-附代码

海鸥算法改进的深度极限学习机DELM的分类 文章目录海鸥算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机&#xff08;DELM&#xff09;原理3.海鸥算法4.海鸥算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考&#xff1a;https://blog.c…

【数据结构与算法】单链表的增删查改(附源码)

这么可爱的猫猫不值得点个赞吗&#x1f63d;&#x1f63b; 目录 一.链表的概念和结构 二.单链表的逻辑结构和物理结构 1.逻辑结构 2.物理结构 三.结构体的定义 四.增加 1.尾插 SListpushback 2.头插 SListpushfront 五.删除 1.尾删 SListpopback 2.头删 SListpo…

浅谈音视频开发,如何更好的去学习?

Android音视频跟普通的应用层开发相比&#xff0c;的确更花费精力。期间为了学习音视频的录制&#xff0c;编码&#xff0c;处理也看过大大小小的几十个项目。总体感觉就是知识比较零散&#xff0c;对刚入门的朋友比较不友好。所以才萌生了整理一个Android音视频学习路线的想法…

Qss自定义属性

QSS自定义属性 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;QSS样式学习 &#x1f448;文章目录QSS自定义属性[toc]前言一、实现效果二、使用方式1.QSS设置Q_PROPERTY属性样式2.QSS设置动态属性样式3.qproperty-<属性名称>语法14.qproperty-&…

如何在报表生成工具 Stimulsoft 中自定义报告查看器?

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

华为OD机试模拟题 用 C++ 实现 - 猜字谜(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明猜字谜题目输入输出描述备注示例一输入输出示例二输入输出思路Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,

IDEA配置 External Tool

有一些文件无法使用IDEA自带的工具打开&#xff0c;这时候就需要借助电脑上安装的第三方软件协助打开。比如使用电脑上安装的Notepad打开项目中的*.ppm文件。 一、配置External Tool 参数说明&#xff1a; 名称(Name)&#xff1a;将在IntelliJ IDEA界面&#xff08;“ 工具”菜…

什么是api接口?(基本介绍)

API:应用程序接口(API:Application Program Interface) 应用程序接口是一组定义、程序及协议的集合&#xff0c;通过 API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过调用 API 函数对应用程序进行开发&#xff0c;可以减轻编程任务。 …