当前位置: 首页 > news >正文

videojs增加视频源选择框小工具

一、前言

在使用 video.js 开发视频播放功能时,我们经常需要根据不同网络环境或视频源,提供“多清晰度切换”功能(例如:720P、1080P、4K 等)。

虽然 video.js 提供了插件机制,但它本身没有自带清晰度切换逻辑,因此我们可以 通过继承组件的方式自定义一个清晰度下拉按钮,实现动态切换视频源的能力。

本文将结合完整源码,讲解实现思路与关键细节。


二、核心思路

整个功能的实现分为三个主要部分:

  1. 初始化播放器:创建 video.js 实例并配置视频源;

  2. 自定义组件 QualityDropdown:继承 video.js 的 Button,实现一个带下拉菜单的按钮;

  3. 事件与逻辑控制:处理点击、菜单显示/隐藏、视频源切换等逻辑。

三、源码

const initVideo = () => {const url = result.value.videoUrl;// 初始化播放器player.value = videojs(videoPlayer.value,{controls: true,autoplay: false,preload: 'auto',fluid: false,responsive: true,width: '100%',height: '100%',sources: [{ src: url, type: getVideoType(url) }],},() => {const videoPlayerInstance = player.value;// ---------- 添加清晰度切换按钮 ----------const Button = videojs.getComponent('Button');class QualityDropdown extends Button {constructor(player, options) {super(player, options);this.controlText('清晰度');this.sources = options.sources || [];this.current = 0;this.el().classList.add('vjs-quality-button');this.el().innerText = this.sources[this.current]?.label || '清晰度';// 创建下拉菜单this.menu = document.createElement('div');this.menu.className = 'vjs-quality-menu';this.menu.style.display = 'none';this.menu.style.position = 'absolute';this.menu.style.background = 'rgba(0,0,0,0.8)';this.menu.style.color = '#fff';this.menu.style.padding = '5px 0';this.menu.style.borderRadius = '4px';this.menu.style.top = '-70px';this.menu.style.left = '0';this.menu.style.zIndex = '1000';this.el().appendChild(this.menu);this.sources.forEach((source, index) => {const item = document.createElement('div');item.innerText = source.label;item.style.padding = '5px 10px';item.style.cursor = 'pointer';item.onmouseenter = () => (item.style.background = 'rgba(255,255,255,0.2)');item.onmouseleave = () => (item.style.background = 'transparent');item.onclick = () => {this.current = index;this.player().src(source);this.player().play();this.el().firstChild.nodeValue = source.label;this.menu.style.display = 'none';};this.menu.appendChild(item);});// 点击按钮显示/隐藏菜单this.el().onclick = (e) => {e.stopPropagation();this.menu.style.display = this.menu.style.display === 'none' ? 'block' : 'none';};// 点击页面其他地方隐藏菜单document.addEventListener('click', () => {this.menu.style.display = 'none';});}}// ---------- 添加清晰度切换按钮 ----------videojs.registerComponent('QualityDropdown', QualityDropdown);const qualityBtn = videoPlayerInstance.addChild('QualityDropdown', { sources: result.value.videoSources });// 插入到控制条末尾(进度条后面)const controlBarChildren = videoPlayerInstance.controlBar.children();videoPlayerInstance.controlBar.addChild(qualityBtn, {}, controlBarChildren.length - 1);// ---------- 原有事件监听 ----------videoPlayerInstance.on('timeupdate', () => {const currentTimeInSeconds = Math.floor(videoPlayerInstance.currentTime());updatePositionByTime(currentTimeInSeconds);console.log(`当前时间: ${videoPlayerInstance.currentTime().toFixed(2)}秒 / 总时长: ${videoPlayerInstance.duration().toFixed(2)}秒`);});videoPlayerInstance.on('pause', () => console.log('视频已暂停'));videoPlayerInstance.on('seeking', () => console.log('正在跳转到新位置...'));videoPlayerInstance.on('seeked', () => console.log('跳转完成,当前时间:', videoPlayerInstance.currentTime()));videoPlayerInstance.on('loadedmetadata', () => {console.log('视频元数据加载完成');videoPlayerInstance.dimensions(videoPlayerInstance.width(), videoPlayerInstance.height());});window.addEventListener('resize', () => {videoPlayerInstance.dimensions(videoPlayerInstance.width(), videoPlayerInstance.height());});});
};

四、关键实现解析

1️⃣ 继承 video.js 组件系统

video.js 的组件化体系允许我们继承基础组件(如 Button),从而快速扩展功能。

const Button = videojs.getComponent('Button');
class QualityDropdown extends Button { ... }
videojs.registerComponent('QualityDropdown', QualityDropdown);

这段代码的核心在于:

  • 保留原有按钮行为;

  • 增加自定义下拉菜单;

  • controlBar 中动态注册。

  • 2️⃣ 动态生成菜单项

    我们通过遍历 sources 数组,为每种清晰度创建一个 <div> 选项:

  • this.sources.forEach((source, index) => {const item = document.createElement('div');item.innerText = source.label;...
    });
    

    切换清晰度的核心逻辑

    点击选项后,调用:

  • this.player().src(source);
    this.player().play();
    

    重新设置视频源,并立即播放。
    由于 video.js 会自动重新加载元数据,这种切换方式简单直接,兼容性很好。

http://www.dtcms.com/a/546387.html

相关文章:

  • 锚文本外链查询网站vue做网站好吗
  • 做网站后台要做些什么国内it外包龙头企业
  • 企业商场网站建设谷歌浏览器手机版免费官方下载
  • IDEA报错:前言中不允许有内容
  • 案例分享--热负荷下的印刷电路板(PCB)测量--研索仪器VIC-3D非接触全场测量系统应用于电子消费领域
  • 仓颉语言中的内联函数优化策略探析
  • 网站后台管理系统怎么上传国外的调查网站上做问卷
  • 企业微信私域运营代运营:微盛AI・企微管家以四级分层服务助力企业私域落地与增长
  • 国内团购网站做的最好的是个人网站模板html5
  • Cell 与 RefCell:Rust 内部可变性的双生子解析
  • 东莞企业网站建设开发网站留言板带后台模板
  • Qt5 MSVC代码编译问题
  • Rust内存对齐与缓存友好设计深度解析
  • vue 做的pc端网站大同市网站建设
  • 黄仁勋GTC华盛顿主题演讲:加速计算与AI的下一个“阿波罗时刻”
  • 儿童早教网站模板做网站从哪方面入门
  • 微信小程序开发
  • seo如何网站正常更新传媒公司经营范围有哪些
  • 青岛网站制作计划三星网上商城app下载
  • 【UE5.3】自定义角色动画教程
  • 面签拍照 网站备案平台代运营
  • 网页制作与网站建设教程视频用手机如何制作网页链接
  • 太原cms模板建站建设工程施工合同条例
  • Excel(WPS表格)中多列去重就用Tocol+Unique组合函数
  • 做盗版小说网站赚钱嘛腾讯微信小程序官网
  • 做网站被攻击谁的责任建站用什么平台好
  • 建设上海网站培训课程表
  • 山东网站开发公司梅州市网站建设
  • 虚拟机ping不通百度的解决方法
  • sourcefare零基础学习,安装与配置