Vue3 视频播放器完整指南 – @videojs-player/vue 从入门到精通

前言

在 Vue 3 生态中,视频播放功能是许多应用的核心需求。@videojs-player/vue 是一个专门为 Vue 3 设计的视频播放器组件,基于成熟的 Video.js 库构建,提供了简单而强大的视频播放解决方案。

主要特性

  • Vue 3 组件化:原生 Vue 3 组件,完美融入组合式 API
  • 功能丰富:支持多种视频格式、直播流、字幕等
  • 高度可定制:支持主题、插件、控制栏等多种自定义选项
  • TypeScript 支持:完整的类型定义
  • 响应式设计:自适应不同屏幕尺寸

安装方式

# npm
npm install video.js @videojs-player/vue# yarn
yarn add video.js @videojs-player/vue# pnpm
pnpm add video.js @videojs-player/vue

快速上手

基础用法

<template><div class="text-center"><h2 class="text-2xl font-bold p-2">基础视频播放器</h2><VideoPlayersrc="https://vjs.zencdn.net/v/oceans.mp4"poster="https://github.surmon.me/images/poster/oceans.png":controls="true":fluid="true"/></div>
</template><script setup>
import { VideoPlayer } from "@videojs-player/vue";
import "video.js/dist/video-js.css";
</script>

自定义配置

<template><div><h2>自定义配置播放器</h2><VideoPlayer :options="videoOptions" @ready="onPlayerReady" /></div>
</template><script setup>
import { ref } from "vue";
import { VideoPlayer } from "@videojs-player/vue";
import "video.js/dist/video-js.css";const videoOptions = ref({autoplay: "muted", // 自动播放controls: true, // 是否显示控制栏responsive: true, // 是否响应式fluid: true, // 是否自适应父容器宽度loop: true, // 是否循环播放playbackRate: 2, // 播放速度playbackRates: [0.5, 1, 1.5, 2], // 播放速度选项sources: [{src: "https://vjs.zencdn.net/v/oceans.mp4",type: "video/mp4",},],poster: "https://github.surmon.me/images/poster/oceans.png",
});const onPlayerReady = (player) => {console.log("播放器已准备就绪", player);
};
</script>

高级用法

播放器控制

<template><divclass="min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900 p-8"><div class="max-w-4xl mx-auto"><!-- 标题 --><h1class="text-3xl font-bold text-white text-center mb-8 bg-gradient-to-r from-blue-400 to-purple-400 bg-clip-text text-transparent">视频播放器演示</h1><!-- 视频播放器容器 --><divclass="bg-white/10 backdrop-blur-sm rounded-2xl p-6 shadow-2xl border border-white/20"><video-player:options="videoOptions"@mounted="handleMounted"class="w-full h-auto max-w-full rounded-xl overflow-hidden shadow-lg"/></div><!-- 控制按钮区域 --><divclass="mt-8 bg-white/10 backdrop-blur-sm rounded-2xl p-6 shadow-2xl border border-white/20"><h2 class="text-xl font-semibold text-white mb-4 text-center">播放控制</h2><div class="flex flex-wrap gap-4 justify-center"><button@click="play"class="px-6 py-3 bg-gradient-to-r from-green-500 to-emerald-600 hover:from-green-600 hover:to-emerald-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transform hover:scale-105 transition-all duration-200 flex items-center gap-2"><svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"><path d="M8 5v10l8-5-8-5z" /></svg>播放</button><button@click="pause"class="px-6 py-3 bg-gradient-to-r from-yellow-500 to-orange-600 hover:from-yellow-600 hover:to-orange-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transform hover:scale-105 transition-all duration-200 flex items-center gap-2"><svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"><path d="M5 4h3v12H5V4zm7 0h3v12h-3V4z" /></svg>暂停</button><button@click="mute"class="px-6 py-3 bg-gradient-to-r from-red-500 to-pink-600 hover:from-red-600 hover:to-pink-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transform hover:scale-105 transition-all duration-200 flex items-center gap-2"><svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"><pathd="M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.617.794L5.617 14H3a1 1 0 01-1-1V7a1 1 0 011-1h2.617l2.766-2.794a1 1 0 011-.13zM14.657 2.929a1 1 0 011.414 0A9.972 9.972 0 0119 10a9.972 9.972 0 01-2.929 7.071 1 1 0 01-1.414-1.414A7.971 7.971 0 0017 10c0-2.21-.894-4.208-2.343-5.657a1 1 0 010-1.414zm-2.829 2.828a1 1 0 011.415 0A5.983 5.983 0 0115 10a5.984 5.984 0 01-1.757 4.243 1 1 0 01-1.415-1.415A3.984 3.984 0 0013 10a3.983 3.983 0 00-1.172-2.828 1 1 0 010-1.415z"/></svg>静音</button><button@click="setVolume(0.5)"class="px-6 py-3 bg-gradient-to-r from-blue-500 to-indigo-600 hover:from-blue-600 hover:to-indigo-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transform hover:scale-105 transition-all duration-200 flex items-center gap-2"><svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"><pathd="M9.383 3.076A1 1 0 0110 4v12a1 1 0 01-1.617.794L5.617 14H3a1 1 0 01-1-1V7a1 1 0 011-1h2.617l2.766-2.794a1 1 0 011-.13z"/></svg>设置音量</button><button@click="seekTo(30)"class="px-6 py-3 bg-gradient-to-r from-purple-500 to-violet-600 hover:from-purple-600 hover:to-violet-700 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transform hover:scale-105 transition-all duration-200 flex items-center gap-2"><svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20"><pathd="M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z"/></svg>跳转到30秒</button></div></div></div></div>
</template><script setup>
import { ref, reactive } from "vue";
import { VideoPlayer } from "@videojs-player/vue";
import "video.js/dist/video-js.css";const player = ref();const videoOptions = reactive({controls: true,sources: [{src: "https://vjs.zencdn.net/v/oceans.mp4",type: "video/mp4",},],poster: "https://github.surmon.me/images/poster/oceans.png",
});const handleMounted = (payload) => {console.log("handleMounted", payload);player.value = payload.player;
};const play = () => {if (player.value) {player.value.play();}
};const pause = () => {if (player.value) {player.value.pause();}
};const mute = () => {if (player.value) {player.value.muted(!player.value.muted());}
};const setVolume = (volume) => {if (player.value) {player.value.volume(volume);}
};const seekTo = (time) => {if (player.value) {player.value.currentTime(time);}
};
</script>

直播流播放

<template><div><h2>直播流播放器</h2><VideoPlayer :options="liveOptions" @ready="onLivePlayerReady" /></div>
</template><script setup>
import { ref } from "vue";
import { VideoPlayer } from "@videojs-player/vue";
import "video.js/dist/video-js.css";const liveOptions = ref({controls: true,responsive: true,fluid: true,liveui: true,sources: [{src: "https://example.com/live-stream.m3u8",type: "application/x-mpegURL",},],
});const onLivePlayerReady = (player) => {};
</script>

字幕支持

<template><div><h2>字幕支持播放器</h2><VideoPlayer :options="subtitleOptions" @ready="onSubtitlePlayerReady" /></div>
</template><script setup>
import { ref } from "vue";
import { VideoPlayer } from "@videojs-player/vue";
import "video.js/dist/video-js.css";const subtitleOptions = ref({controls: true,responsive: true,fluid: true,sources: [{src: "https://vjs.zencdn.net/v/oceans.mp4",type: "video/mp4",},],tracks: [{kind: "subtitles",src: "https://example.com/subtitles-zh.vtt",srclang: "zh",label: "中文",default: true,},{kind: "subtitles",src: "https://example.com/subtitles-en.vtt",srclang: "en",label: "English",},],
});const onSubtitlePlayerReady = (player) => {};
</script>

常见问题

Q: 如何实现自动播放?

A: 由于浏览器限制,自动播放需要满足以下条件之一:

  • 视频设置为静音(muted: true
  • 用户已与页面交互
<VideoPlayer autoplay="muted" />

Q: 如何处理跨域视频?

A: 确保视频服务器设置了正确的 CORS 头,或在组件上添加 crossorigin 属性:

<VideoPlayer :src="videoSrc" crossorigin="anonymous" />

总结

@videojs-player/vue 是 Vue 3 应用中实现视频播放功能的最佳选择之一,它简单、可靠、高效,能够满足大多数视频播放需求。无论是简单的视频展示还是复杂的流媒体应用,它都能提供出色的解决方案。

 Vue3 视频播放器完整指南 - @videojs-player/vue 从入门到精通 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

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

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

相关文章

【靶场练习】--DVWA第一关Brute Force(暴力破解)全难度分析

注意&#xff0c;这一关必须要使用Burpsuite来抓包 目录Low1.抓包2.发送到爆破模块3.选择爆破模式爆破模式介绍4.添加载荷5.添加字典6.爆破查看查看源码Medium查看源码High1.抓包2.在bp的extensions中找到CSRF Token Tracker&#xff0c;并安装3.构造字典4.成功爆破查看源码Imp…

Java语言——排序算法

一、基本概念排序&#xff1a;将n个数字按一定顺序排列&#xff08;比如&#xff1a;升序&#xff0c;或者降序&#xff09; ^内部排序 &#xff1a;若整个排序过程不需要访问外存便能完成&#xff0c;则称此类排序问题为内部排序 ^外部排序&#xff1a;若参加排序的记录数量很…

【Linux】人事档案——用户及组管理

目录 1 用户及组管理 2 用户及用户组管理命令 2.1 useradd&#xff1a;建立用户 useradd命令用于建立用户&#xff0c;该 2.2 passwd&#xff1a;更改用户密码 2.3 usermod&#xff1a;更改用户信息 2.4 groupadd&#xff1a;建立用户组 2.5 finger&#xff1a;查找并显…

给定一个有序的正数数组arr和一个正数range,如果可以自由选择arr中的数字,想累加得 到 1~range 范围上所有的数,返回arr最少还缺几个数。

给定一个有序的正数数组arr和一个正数range&#xff0c;如果可以自由选择arr中的数字&#xff0c;想累加得 到 1~range 范围上所有的数&#xff0c;返回arr最少还缺几个数。 #include <iostream> #include <vector>using namespace std;void func1(std::vector<…

BigemapPro快速添加历史影像(Arcgis卫星地图历史地图)

这是Esri(Arcgis)官方提供的历史影像数据&#xff0c;可放心使用。https://livingatlas.arcgis.com/wayback如何快速添加到Bigemap Pro软件里&#xff0c;详细步骤如下&#xff1a;复制下面的文本保存为 配置.bmmap,然后拖入软件就可以了{"BmLayerVersion":"1.0…

[免费]基于Python的Django医院管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是python222_小锋老师&#xff0c;看到一个不错的基于Python的Django医院管理系统&#xff0c;分享下哈。 项目视频演示 https://www.bilibili.com/video/BV1iPH8zmEut/ 项目介绍 随着人民生活水平日益增长&#xff0c;科技日益发达的今天&#xff0c;…

MyBatis 从入门到精通(第三篇)—— 动态 SQL、关联查询与查询缓存

在前两篇博客中&#xff0c;我们掌握了 MyBatis 的基础搭建、核心架构与 Mapper 代理开发&#xff0c;能应对简单的单表 CRUD 场景。但实际项目中&#xff0c;业务往往更复杂 —— 比如 “多条件动态查询”“员工与部门的关联查询”“高频查询的性能优化” 等。本篇将聚焦 MyBa…

Linux内核中IPv4的BEET模式封装机制解析

引言 在Linux网络栈中,IPSec提供了网络层的数据加密和认证服务。传统的IPSec支持两种模式:传输模式(Transport Mode)和隧道模式(Tunnel Mode)。然而,这两种模式各有优缺点:传输模式开销小但无法隐藏原始IP头;隧道模式提供完全封装但增加了开销。 BEET(Bound End-to…

设计模式——创建型模式

什么是设计模式&#xff1f;设计模式是软件工程中解决常见问题的经典方案&#xff0c;它们代表了最佳实践和经验总结。通过使用设计模式&#xff0c;开发者可以创建更加灵活、可维护和可扩展的代码结构。设计模式不是具体的代码实现&#xff0c;而是针对特定问题的通用解决方案…

我爱学算法之—— 位运算(上)

常见位运算 对于位运算&#xff1a; &&#xff1a;按位与&#xff0c;有0则0。 |&#xff1a;按位或&#xff0c;有1则1。 ^&#xff1a;按位异或&#xff0c;相同为0、不同为1。&#xff08;无进位相加&#xff09; ~&#xff1a;二进制位按位取反。 对于位运算的常见使用…

智能语音系统

智能语音系统通过技术手段让机器能够“听懂”、“理解”并“回应”人类的语音&#xff0c;是实现人机交互的关键技术之一。下面我将为你梳理智能语音系统的核心组成部分、工作原理、应用场景以及面临的挑战。&#x1f9e0; 核心技术与工作原理智能语音系统之所以能实现人机交互…

水泵自动化远程监测与控制的御控物联网解决方案

一、行业背景与痛点分析水泵作为工业生产、农业灌溉、城市供水等领域的核心设备&#xff0c;其运行效率直接影响系统稳定性与运营成本。然而&#xff0c;传统管理模式存在三大核心痛点&#xff1a;人工巡检低效&#xff1a;偏远地区水泵分布分散&#xff0c;依赖人工定期巡检&a…

Python实现点云法向量各种方向设定

本次我们分享点云法向量定向的四种方法&#xff0c;分别是XYZ轴、相机位置、最小生成树(MST)和质心设定方法。通常出现在三维点云处理、三维重建、计算机视觉或图形学中&#xff0c;需要估计点云的法向量方向。它们的核心任务是&#xff1a;在已知点坐标和局部几何结构&#xf…

腾讯云智能体开发平台

提供全球领先的云计算服务腾讯云&#xff0c;腾讯集团倾力打造的云计算品牌&#xff0c;面向全世界各个国家和地区的政府机构、企业组织和个人开发者&#xff0c;提供全球领先的云计算、大数据、人工智能等技术产品与服务&#xff0c;以卓越的科技能力打造丰富的行业解决方案&a…

css flex布局,设置flex-wrap:wrap换行后,如何保证子节点被内容撑高后,每一行的子节点高度一致。

flex布局&#xff0c;设置flex-wrap&#xff1a;wrap换行后&#xff0c;如何保证子节点被内容撑高后&#xff0c;每一行的子节点高度一致。核心&#xff1a;需要设置父节点和子节点&#xff1a;align-items: stretch&#xff0c;两个都要。代码&#xff1a;<div class"…

Nginx_Tomcat综合案例

要求 需求&#xff1a;通过 nginx 来代理两个 tomcat 服务器&#xff08;反向代理&#xff09;&#xff0c;然后通过 https://www.nginx.com 来进行访问。主机名IP软件nginx192.168.30.10nginxtomcat1192.168.30.11java&#xff0c;tomcattomcat2192.168.30.12java&#xff0c;…

【Vue2手录12】单文件组件SFC

一、知识回顾-Vue2项目基础操作与环境配置 1.1 项目启动 项目打开方式&#xff1a;直接将项目文件夹&#xff08;如my-app&#xff09;拖拽到 Visual Studio Code&#xff08;推荐编辑器&#xff09;&#xff0c;避免拖拽父级文件夹&#xff0c;防止路径混乱。启动命令&#xf…

VS2022下载+海康SDK环境配置实现实时预览

一.VS2022下载去官网下载就可以了&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/下载Community版本是免费的。&#xff08;2&#xff09;下载后得安装包VisualStudioSetup.exe打开&#xff1a;点击继续等待下载完成&#xff0c;出现如下界面&#xff0c;这里是选…

YOLO 模型从 PyTorch 转换为 ONNX 并优化

YOLO 模型从 PyTorch 转换为 ONNX 并优化 在深度学习部署中&#xff0c;ONNX&#xff08;Open Neural Network Exchange&#xff09; 已成为跨框架与跨平台的标准格式。我们经常需要将 YOLOv8 在 PyTorch 中训练好的模型转换为 ONNX&#xff0c;并进行优化&#xff0c;以便在 …

推进新型信息基础设施建设发展:蜂窝模组行业迎来结构性机遇

工信部副部长张云明在2025年9月9日国新办新闻发布会上明确表示&#xff0c;将"扎实推进新型信息基础设施建设发展"&#xff0c;并重点强调"打造新型工业网络&#xff0c;推进蜂窝车联网部署" 。这一政策表态对蜂窝模组行业产生深远影响&#xff0c;将推动行…