Vue3视频播放组件(Video)

news2025/7/22 5:00:43

Vue2视频播放组件

可自定义设置以下属性:  

  • 视频文件url(videoUrl),必传,支持网络地址https和相对地址

  • 视频封面url(videoCover),默认为null,支持网络地址https和相对地址

  • 视频播放器宽度(width),默认为800px

  • 视频播放器高度(height),默认为450px

  • 视频就绪后是否马上播放(autoplay),默认为false

  • 是否向用户显示控件,比如是否向用户显示控件,比如进度条,全屏等(controls),默认为true

  • 视频播放完成后,是否循环播放(loop),默认为false

  • 是否静音(muted),默认为false

  • 是否在页面加载后载入视频(preload)如果设置了autoplay属性,则preload将被忽略,默认为auto // auto:一旦页面加载,则开始加载视频; metadata:当页面加载后仅加载视频的元数据 none:页面加载后不应加载视频

  • 播放暂停时是否显示播放器中间的暂停图标(showPlay),默认为false

  • 中间播放暂停按钮的边长(playWidth),默认为96px

  • video的poster默认图片和视频内容的缩放规则(zoom),默认为'none' // none:(默认)保存原有内容,不进行缩放; fill:不保持原有比例,内容拉伸填充整个内容容器; contain:保存原有比例,内容以包含方式缩放; cover:保存原有比例,内容以覆盖方式缩放

效果如下图:

①创建视频播放组件Video.vue: 

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'
interface Props {
  videoUrl: string, // 视频文件url,必传,支持网络地址 https 和相对地址 require('@/assets/files/Bao.mp4')
  videoCover?: string // 视频封面url,支持网络地址 https 和相对地址 require('@/assets/images/Bao.jpg')
  width?: number // 视频播放器宽度
  height?: number // 视频播放器高度
  autoplay?: boolean, // 视频就绪后是否马上播放
  controls?: boolean, // 是否向用户显示控件,比如进度条,全屏
  loop?: boolean // 视频播放完成后,是否循环播放
  muted?: boolean // 是否静音
  preload?: string // 是否在页面加载后载入视频,如果设置了autoplay属性,则preload将被忽略;
  showPlay?: boolean, // 播放暂停时是否显示播放器中间的暂停图标
  playWidth?: number, // 中间播放暂停按钮的边长
  zoom?: string // video的poster默认图片和视频内容缩放规则
}
const props = withDefaults(defineProps<Props>(), {
  videoUrl: '',
  videoCover: '',
  width: 800,
  height: 450,
  /*
    autoplay:由于目前在最新版的Chrome浏览器(以及所有以Chromium为内核的浏览器)中,
    已不再允许自动播放音频和视频。就算你为video或audio标签设置了autoplay
    属性也一样不能自动播放!
    本组件解决方法:设置视频 autoplay 时,自动将视频设置为静音 muted: true 即可实现自
    动播放,然后用户可以使用控制栏开启声音,类似某宝商品自动播放的宣传视频逻辑
  */
  autoplay: false,
  controls: true,
  loop: false,
  muted: false,
  /*
    preload可选属性:
    auto:一旦页面加载,则开始加载视频;
    metadata:当页面加载后仅加载视频的元数据
    none:页面加载后不应加载视频
  */
  preload: 'auto',
  showPlay: false,
  playWidth: 96,
  /*
    zoom可选属性:
    none:(默认)保存原有内容,不进行缩放;
    fill:不保持原有比例,内容拉伸填充整个内容容器;
    contain:保存原有比例,内容以包含方式缩放;
    cover:保存原有比例,内容以覆盖方式缩放
  */
  zoom: 'none'
})
const originPlay = ref(true)
const vplay = ref(false)
// 为模板引用标注类型
// 或 const veo = ref()
const veo = ref<HTMLVideoElement | null>(null) // 声明一个同名的模板引用

function onPlay () {
  console.log('click')
  if (props.autoplay) {
    veo.value?.pause()
  } else {
    vplay.value = true
    originPlay.value = false
    veo.value?.play()
  }
}
function onPause () {
  vplay.value = false
  console.log('pause')
}
function onPlaying () {
  vplay.value = true
  console.log('playing')
}
onMounted(() => {
  if (props.showPlay) {
    veo.value?.addEventListener('pause', onPause)
    veo.value?.addEventListener('playing', onPlaying)
  }
  if (props.autoplay) {
    vplay.value = true
    originPlay.value = false
  }
  // 自定义设置播放速度
  // this.$refs.veo.playbackRate = 2
})
onUnmounted(() => {
  veo.value?.removeEventListener('pause', onPause)
  veo.value?.removeEventListener('playing', onPlaying)
})
</script>
<template>
  <div class="m-video" :style="`width: ${width}px; height: ${height}px;`">
    <video
      ref="veo"
      :style="`object-fit: ${zoom};`"
      :src="videoUrl"
      :poster="videoCover"
      :width="width"
      :height="height"
      :autoplay="autoplay"
      :controls="!originPlay&&controls"
      :loop="loop"
      :muted="autoplay || muted"
      :preload="preload"
      @click.prevent.once="onPlay">
      您的浏览器不支持video标签。
    </video>
    <svg v-show="originPlay || showPlay" :class="[vplay ? 'hidden' : 'u-play']" :style="`width: ${playWidth}px; height: ${playWidth}px;`" viewBox="0 0 24 24">
      <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4.75 6.75C4.75 5.64543 5.64543 4.75 6.75 4.75H17.25C18.3546 4.75 19.25 5.64543 19.25 6.75V17.25C19.25 18.3546 18.3546 19.25 17.25 19.25H6.75C5.64543 19.25 4.75 18.3546 4.75 17.25V6.75Z"></path>
      <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M15.25 12L9.75 8.75V15.25L15.25 12Z"></path>
    </svg>
  </div>
</template>
<style lang="less" scoped>
.m-video {
  display: inline-block;
  position: relative;
  background: #000;
  cursor: pointer;
  &:hover {
    .u-play {
      opacity: 0.9;
    }
  }
  .u-play {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    margin: auto;
    fill: none;
    color: #FFF;
    pointer-events: none;
    opacity: 0.7;
    transition: opacity .3s;
  }
  .hidden {
    display: none;
  }
}
</style>

②在要使用的页面引入:

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import Video from './Video.vue'
// import videoUrl from '@/assets/files/Bao.mp4'
// import videoCover from '@/assets/images/Bao.jpg'

// 可以本地静态资源路径
const videoUrl = ref(new URL('@/assets/files/Bao.mp4', import.meta.url).href)
const videoCover = ref(new URL('@/assets/images/Bao.jpg', import.meta.url).href)

// 也可以https网络地址
// const videoUrl = ref()
// const videoCover = ref()

onMounted(() => {
  // setTimeout(() => { // 模拟接口调用
  //     videoUrl.value = 'https网络地址'
  //     videoCover.value = 'https:网络地址
  //   }, 1000)
})
</script>
<template>
  <Video
    v-show="true"
    :videoUrl="videoUrl"
    :videoCover="videoCover"
    :width="800"
    :height="450"
    :autoplay="true"
    :controls="true"
    :loop="false"
    :muted="false"
    preload="auto"
    :showPlay="true"
    :playWidth="96"
    zoom="cotain"
    />
</template>

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

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

相关文章

【nacos2.2.1本地启动】

nacos2.2.1本地启动填坑之行 下载nacos代码 nacos文档地址&#xff1a;https://nacos.io/zh-cn/docs/quick-start-spring.html github地址下载代码&#xff1a;https://github.com/alibaba/nacos.git appllo文章&#xff1a;https://blog.51cto.com/muxiaonong/3933418 下…

UEFI学习(三)-创建一个dxe driver-UDK2017

创建一个dxe driver 创建UEFI DXE driver DXE驱动的运行阶段 DXE驱动创建 创建UEFI DXE driver 在edk2中&#xff0c;我们可以了解到它有非常多种类的模块&#xff0c;每种模块运行于不同阶段&#xff0c;上一阶段&#xff0c;我们尝试了一下标准应用程序的工程模块&#xff0c…

Centos7超详细安装教程

Centos 7适合初入门的带图形化的界面系统安装 本文是基于VMware虚拟机&#xff0c;centos7 64位安装教学 文章目录Centos 7适合初入门的带图形化的界面系统安装一、软件准备二、VMware新建适配虚拟机三、Centos 安装四、基础检查一、软件准备 VMware 虚拟机安装 官网下载链接&…

Redis 做延迟消息队列

背景 看到消息队列&#xff0c;我们肯定会想到各种MQ&#xff0c;比如&#xff1a;RabbitMQ&#xff0c;acivityMQ、RocketMQ、Kafka等。 但是&#xff0c;当我们需要使用消息中间件的时候&#xff0c;并非每次都需要非常专业的消息中间件&#xff0c;假如我们只有一个消息队…

问一下ChatGPT:DIKW金字塔模型

经常看到这张DIKW金字塔模型图&#xff0c;还看到感觉有点过份解读的图&#xff0c;后面又加上了insight&#xff0c;impact等内容。 Data&#xff1a;是数据&#xff0c;零散的、无规则的呈现到人们眼前&#xff0c;如果你只看到这些数字&#xff0c;如果没有强大的知识背景&a…

STM32之DMA

DMA介绍DMA(Direct MemoryAccess&#xff0c;直接存储器访问)提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&#xff0c;CPU对于内存的工作来说就无法使用。DMA…

音乐、音效素材库,好听的BGM都在这~

推荐6个超好用的音频素材网站&#xff0c;免费可商用&#xff0c;热门BGM配乐都能找到&#xff0c;自媒体视频剪辑必备&#xff01;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/audio.html?vNTYxMjky 菜鸟图库素材非常多&#xff0c;包含了设计、办公、自媒体…

详解FPGA:人工智能时代的驱动引擎观后感

详解FPGA&#xff1a;人工智能时代的驱动引擎观后感 本书大目录 第一章 延续摩尔定律 第二章 拥抱大数据的洪流 第三章 FPGA在人工智能时代的独特优势 第四章 更简单也更复杂——FPGA开发的新方法 第五章 站在巨人肩上——FPGA发展新趋势 文章目录详解FPGA&#xff1a;人工智能…

Redis技术详解

Redis技术详解 Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存&#xff0c;事件发布或订阅&#xff0c;高速队列等场景。支持网络&#xff0c;提供字符串&#xff0c;哈希&#xff0c;列表&#xff0c;队列&#xff0c;集合结构直接存取&#xff0c;基于内存&…

75. CSV文件的写入(保姆级教程)

75. CSV文件的写入&#xff08;保姆级教程&#xff09; 文章目录75. CSV文件的写入&#xff08;保姆级教程&#xff09;1. 目标任务2. 什么是CSV文件2.1 CSV文件知识2.2 准备工作2.3 实操练习12.4 实操练习22.5 实操练习33. os模块文件操作3.1 准备工作3.2 os模块知识回顾3.3 模…

12N60-ASEMI高压MOS管12N60

编辑-Z 12N60在TO-220封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为0.7Ω&#xff0c;是一款N沟道高压MOS管。12N60的最大脉冲正向电流ISM为48A&#xff0c;零栅极电压漏极电流(IDSS)为1uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。12N60功耗&#xff…

SpringCloud微服务实战——搭建企业级开发框架(五十):集成移动端推送功能的系统通知公告数据库设计

系统的通知公告功能似乎是很容易被忽略的功能模块&#xff0c;在传统的软件系统中&#xff0c;一般OA类软件系统不可或缺&#xff0c;而在应用软件系统中此功能或有或无&#xff0c;在现在大多数的互联网软件系统中&#xff0c;此功能又必不可缺。所以&#xff0c;在框架设计时…

C++基础了解-04-C++ 变量作用域

变量作用域 一、C 变量作用域 作用域是程序的一个区域&#xff0c;一般来说有三个地方可以定义变量&#xff1a; 1、在函数或一个代码块内部声明的变量&#xff0c;称为局部变量。 2、在函数参数的定义中声明的变量&#xff0c;称为形式参数。 3、在所有函数外部声明的变量…

神经网络结构常见可视化工具汇总及效果演示

文章目录各种训练框架自带的可视化工具pytorch自带pytorchvizkeras自带visualkerasTensorFlow自带TensorBoard其它画图工具NN-SVG&#xff1a;FCNN style、LeNet style、AlexNet stylePlotNeuralNet&#xff1a;使用Latex编写Netron&#xff1a;多种格式的网络模型文件可视化ZE…

计算机网络的166个概念你知道几个 第九部分

计算机网络网络层 路由选择算法&#xff1a;网络层中决定分组发送路径的一种算法。 转发&#xff1a;它指的是将分组从一个输入链路转移到合适的输出链路的动作。 路由选择&#xff1a;指确定分组从一端发送到另一端所选择路径的处理过程。 三种路由交换技术&#xff1a;内…

对word文档中指定的相同内容/文字加颜色或背景颜色

1.请看一段文章。 2.我们要给文中的“code”换成白色字体&#xff0c;黑色背景如何批量呢&#xff1f; 2.1.先摁下“ctrl”"H" 2.2.选择“查找” 2.3.查找内容框填入“code” 2.4.点击以下项中查找&#xff0c;选择主文档。&#xff08;如果你要对某一段文章的相…

Docker操作指南

Docker操作指南 概念解释&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起供运行启动&#xff0c;称为镜像。 容器&#xff08;Container&#xff09;&#xff1a;镜像中的应用程序运行后形…

3.7 最大异或对

异或 二进制位同为0&#xff0c;异为1 异或符号 ^ 异或性质&#xff1a; a^a0 a^00 (a^ b ^c) (a^c ^b) 一道异或的题目 最大异或对 题目链接 思路 注重思维方式 首先是暴力想法&#xff0c;使用两重循环&#xff0c;对每两个数字进行取异或运算&#xff0c;得出最大值考虑…

wireshark 着色规则的含义

文章目录前言wireshark 着色规则的含义前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! wires…

【FATE联邦学习debug】 No module named ‘federatedml‘

直接pip install federatedml是无法找得到这个库的。 这个的原因是环境变量的事情&#xff0c;因为在部署文档中&#xff0c;本身提示我们要更新一些环境变量&#xff0c;如果不export那些变量&#xff0c;下面的fate_test其实也是无法测试成功的。 打开bin/init_env.sh&#x…