更新记录

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,因此音量滑动在微信小程序会降级为静音切换。

注意事项

  1. App 端使用 renderjs 渲染 HTML5 video,请在 App(vue 页面) 中使用,不支持 nvue 页面。
  2. 亮度调节在 App / 微信小程序调用系统屏幕亮度 API,组件销毁时会尽量恢复初始亮度;H5 等不支持的平台使用黑色遮罩模拟,仅改变视觉明暗。
  3. App 端与 H5 端全屏通过 CSS 全屏实现(App 额外锁定横竖屏方向),可保证自定义控制层在全屏下依然可操作;微信小程序走 VideoContext.requestFullScreen。
  4. 清晰度切换会重新加载视频资源,组件会尽量保持当前播放进度与播放状态。
  5. 自动播放受各平台策略限制(如 H5 需要静音或用户交互后才可自动播放),请结合 muted 使用。
  6. 倍速 / 清晰度菜单选项较多时,菜单内部可上下滑动;菜单高度自适应播放器高度,不会溢出播放器区域。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。