更新记录
1.4.1(2026-10-11)
- 修复清晰度切换后进度跳转失效的问题:改为等待新视频源
loadedmetadata 就绪后再跳转进度,避免固定延时导致的竞态
- 修复同页面存在多个播放器时键盘快捷键互相干扰的问题:键盘监听改为绑定到播放器容器,点击视频获得焦点后生效
- 修复 App 端 renderjs 在渲染层未挂载时无限重试创建 video 的问题,改为有限次重试
- 修复全屏切换后测量尺寸的定时器未回收的问题,组件销毁时统一清理
- 修复桌面端滚轮监听解除时可能因重新查询元素失败而残留的问题
平台兼容性
uni-app(5.0)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
× |
√ |
√ |
× |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
√ |
√ |
√ |
× |
× |
√ |
√ |
√ |
√ |
√ |
其他
| 多语言 |
暗黑模式 |
宽屏模式 |
蒸汽模式 |
| × |
× |
√ |
× |
hy-video-player 视频播放器
hy-video-player 是一个功能完整、开箱即用的视频播放器组件,基于 uni-app 编写,兼容 Vue2 / Vue3。内置自定义控制层与全套手势交互:长按倍速、双击左右快进/快退、水平滑动调节进度、左侧上下滑动调节亮度、右侧上下滑动调节音量,并支持播放暂停、进度拖拽、全屏、倍速、清晰度切换等常用功能。
功能特性
- 自定义控制层:播放/暂停、时间显示、进度条拖拽(支持点击/拖动、触摸与桌面鼠标)、缓冲进度、全屏、倍速、清晰度、循环播放开关
- 菜单自动收起:倍速/清晰度菜单在点击播放、音量、循环、全屏、进度条等其它功能或控制层自动隐藏时自动关闭
- 控制栏自动隐藏:播放时控制栏延时自动隐藏(
autoHideDelay,默认 4000ms);打开菜单或拖拽进度条等操作过程中不会自动隐藏,操作结束或关闭菜单后重新计时;设为 0 可禁用自动隐藏
- 桌面端交互(H5/PC):鼠标按住拖动可调节亮度(左半屏上下)/ 音量(右半屏上下)/ 进度(水平);鼠标滚轮调节音量(Ctrl / Alt + 滚轮调节亮度);键盘快捷键:空格播放/暂停、← / → 快退/快进、↑ / ↓ 调音量、Esc 退出全屏(可通过
enableWheel、enableKeyboard 关闭)
- 宽屏自适应:未设置
height 时按 aspectRatio(默认 16:9)随容器宽度自适应高度,电脑宽屏下高度自动缩放;显式设置 height 时以 height 为准
- 长按倍速:长按视频临时提升倍速播放,松手恢复(倍速与长按时长可配置)
- 双击快进 / 快退:双击左半屏快退、右半屏快进(步长可配置)
- 水平滑动调节进度:左右滑动实时预览目标时间,松手生效
- 垂直滑动调节亮度:左半屏上下滑动调节屏幕亮度(App / 小程序调用系统亮度,H5 用遮罩模拟)
- 垂直滑动调节音量:右半屏上下滑动调节音量(App / H5 生效,其他平台降级)
- 多清晰度切换:传入
sources 即可在控制层切换,切换时自动保持播放进度
- App 端 renderjs 渲染:使用 HTML5 video 渲染,绕开原生组件层级限制,自定义 UI 可完整覆盖
- 零第三方依赖:图标全部使用内联 CSS 绘制
安装
将 hy-video-player 目录放入项目的 uni_modules 目录即可,组件已支持 easycom,无需手动 import。
基本用法
<template>
<view>
<hy-video-player
:src="src"
poster="https://example.com/poster.png"
title="演示视频"
height="420rpx"
:autoplay="false"
:seek-step="10"
:long-press-rate="3"
theme-color="#3b7cff"
@play="onPlay"
@timeupdate=""
@ended=""
/>
</view>
</template>
<script>
export default {
data() {
return {
src: 'https://example.com/video.mp4'
}
},
methods: {
onPlay() {},
(e) {
// e.currentTime, e.duration
},
() {}
}
}
</script>
属性 Props
| 属性 |
类型 |
默认值 |
说明 |
| src |
String |
'' |
视频地址 |
| poster |
String |
'' |
封面图地址 |
| title |
String |
'' |
顶部标题,为空时不显示 |
| autoplay |
Boolean |
false |
是否自动播放 |
| loop |
Boolean |
false |
是否循环播放(初始化值,可通过循环按钮或方法切换) |
| muted |
Boolean |
false |
是否静音 |
| initialTime |
Number |
0 |
初始播放位置(秒) |
| durationHint |
Number |
0 |
时长提示(秒),用于在元数据加载前显示总时长 |
| objectFit |
String |
contain |
视频填充模式:contain / fill / cover |
| height |
String |
'' |
播放器高度,如 420rpx。为空时按 aspectRatio 自适应高度(宽屏适配) |
| aspectRatio |
String |
16:9 |
宽高比,height 为空时生效,如 16:9 / 4:3 / 21:9 |
| rounded |
Boolean |
false |
是否显示圆角 |
| backgroundColor |
String |
#000000 |
播放器背景色(视频未铺满时的留白区域,如宽高比不一致的黑边) |
| themeColor |
String |
#3b7cff |
主题色(进度条、当前菜单项) |
| showBack |
Boolean |
false |
是否显示返回按钮(触发 back 事件) |
| showFullscreenBtn |
Boolean |
true |
是否显示全屏按钮 |
| showSpeedBtn |
Boolean |
true |
是否显示倍速按钮 |
| showQualityBtn |
Boolean |
true |
是否显示清晰度按钮(需同时传入非空 sources 才显示) |
| showVolumeBtn |
Boolean |
true |
是否显示音量按钮 |
| showLoopBtn |
Boolean |
true |
是否显示循环播放按钮 |
| volume |
Number |
1 |
初始音量,0~1 |
| speedOptions |
Array |
[0.5,0.75,1,1.25,1.5,2,2.5,3] |
可选倍速列表 |
| sources |
Array |
[] |
清晰度列表,元素形如 { label, src },为空时不显示清晰度按钮 |
| enableGesture |
Boolean |
true |
是否启用手势 |
| enableWheel |
Boolean |
true |
桌面端(H5)是否启用鼠标滚轮调节:默认调节音量,按住 Ctrl / Alt 时调节亮度 |
| enableKeyboard |
Boolean |
true |
桌面端(H5)是否启用键盘快捷键:空格播放/暂停、←→ 快退/快进、↑↓ 音量、Esc 退出全屏 |
| enableLongPress |
Boolean |
true |
是否启用长按倍速 |
| enableDoubleTap |
Boolean |
true |
是否启用双击快进/快退 |
| enableSeek |
Boolean |
true |
是否启用滑动/双击调节进度 |
| enableVolume |
Boolean |
true |
是否启用滑动调节音量 |
| enableBrightness |
Boolean |
true |
是否启用滑动调节亮度 |
| longPressRate |
Number |
3 |
长按时的倍速 |
| longPressDuration |
Number |
300 |
长按判定时长(毫秒) |
| seekStep |
Number |
10 |
双击快进/快退步长(秒) |
| autoHideDelay |
Number |
4000 |
播放时控制栏自动隐藏延时(毫秒)。操作中(打开菜单、拖拽进度条)不会自动隐藏;设为 0 表示从不自动隐藏 |
事件 Events
| 事件名 |
回调参数 |
说明 |
| play |
- |
开始播放 |
| pause |
- |
暂停播放 |
| ended |
- |
播放结束 |
| timeupdate |
{ currentTime, duration } |
播放进度变化 |
| progress |
{ buffered } |
缓冲进度变化 |
| waiting |
- |
缓冲等待 |
| loadedmetadata |
{ duration } |
元数据加载完成 |
| seek |
{ currentTime, duration } |
进度跳转(拖拽/滑动/双击) |
| ratechange |
{ rate } |
倍速变化 |
| volumechange |
{ volume } |
音量变化 |
| brightnesschange |
{ brightness } |
亮度变化 |
| qualitychange |
{ index, item } |
清晰度切换 |
| loopchange |
{ loop } |
循环播放开关变化 |
| fullscreenchange |
{ fullScreen, direction } |
全屏状态变化 |
| longpressstart |
{ rate } |
进入长按倍速 |
| longpressend |
{ rate } |
退出长按倍速 |
| back |
- |
点击返回按钮 |
| retry |
- |
点击错误重试 |
| error |
错误对象 |
播放出错 |
方法 Methods
通过 ref 调用:
| 方法 |
说明 |
| play() |
播放 |
| pause() |
暂停 |
| togglePlay() |
切换播放/暂停 |
| seekTo(seconds) |
跳转到指定秒数 |
| seekBy(delta) |
相对当前进度跳转(正数快进,负数快退) |
| setVolume(value) |
设置音量 0~1 |
| toggleLoop() |
切换循环播放开关 |
| switchQuality(index) |
切换到指定清晰度索引 |
交互说明
- 单击:显示 / 隐藏控制层(若已打开菜单则关闭菜单)
- 双击左半屏:快退
seekStep 秒
- 双击右半屏:快进
seekStep 秒
- 长按:进入
longPressRate 倍速播放,松手恢复
- 左右滑动:调节播放进度,松手生效
- 左半屏上下滑动:调节亮度
- 右半屏上下滑动:调节音量
- 进度条:点击或拖动可直接跳转进度(H5 端支持鼠标)
电脑鼠标操作(H5 / PC)
组件同时支持鼠标操作:按下左键后拖动可触发滑动类手势(进度 / 亮度 / 音量),双击快进/快退、单击切换控制层均可用;进度条可直接用鼠标点击或拖动。未按下左键时的鼠标移动不会触发任何手势。
平台支持与差异
| 能力 |
App |
H5 |
微信小程序 |
| 播放控制 / 进度 / 倍速 |
y |
y |
y |
| 自定义控制层覆盖 |
y(renderjs) |
y |
y(同层渲染) |
| 滑动调进度 |
y |
y |
y |
| 双击快进/快退 |
y |
y |
y |
| 长按倍速 |
y |
y |
y |
| 亮度调节 |
y(系统 API) |
遮罩模拟 |
y(系统 API) |
| 音量调节 |
y |
y |
降级(静音开关) |
| 清晰度切换 |
y |
y |
y |
| 全屏(控制层可操作) |
y(CSS 全屏) |
y(CSS 全屏) |
y(原生全屏) |
| 鼠标拖动 / 滚轮(桌面端) |
- |
y |
- |
| 键盘快捷键(桌面端) |
- |
y |
- |
说明:微信小程序 video 组件没有提供音量控制 API,因此音量滑动在微信小程序会降级为静音切换。
注意事项
- App 端使用 renderjs 渲染 HTML5
video,请在 App(vue 页面) 中使用,不支持 nvue 页面。
- 亮度调节在 App / 微信小程序调用系统屏幕亮度 API,组件销毁时会尽量恢复初始亮度;H5 等不支持的平台使用黑色遮罩模拟,仅改变视觉明暗。
- App 端与 H5 端全屏通过 CSS 全屏实现(App 额外锁定横竖屏方向),可保证自定义控制层在全屏下依然可操作;微信小程序走
VideoContext.requestFullScreen。
- 清晰度切换会重新加载视频资源,组件会尽量保持当前播放进度与播放状态。
- 自动播放受各平台策略限制(如 H5 需要静音或用户交互后才可自动播放),请结合
muted 使用。
- 倍速 / 清晰度菜单选项较多时,菜单内部可上下滑动;菜单高度自适应播放器高度,不会溢出播放器区域。