Video.js —— 一款开源且功能丰富的web视频组件

Video.js在Vue项目中的综合使用详解(多个视频+倍速播放)

开发中,使用video标签自带的属性难以达到我们实际所需要的效果;例如视频的倍速播放功能,利用原生代码重写一个视频标签又太过于繁琐(PS:主要是懒)。在这里,向大家推荐一款很好用的组件video.js,这是一个开源的web视频组件(video.js官网),其使用基于html5的video标签,同时支持HTML和Flash视频,下面向大家详细介绍一下在Vue项目中的使用,希望能帮助大家~

第一步:npm安装video.js

如果利用npm命令安装失败,可以利用淘宝镜像安装(不知道淘宝镜像的安装及使用,可自行百度,参考文章很多),具体安装命令为cnmp install video.js,如果一次不行,多试几次(PS: 安装这些东西有时候真的看人品啊啊),我当时安装时第一次报错,第二次成功了。
如果使用npm安装失败,可以利用淘宝镜像安装,具体命令**cnmp install video.js**,如果一次不行,多试几次,人好一次成功,我当时安装时第一次报错,第二次成功

第二步:在main.js中引入video.js

将video.js注册到原型上

import Video from 'video.js'
import 'video.js/dist/video-js.css'
Vue.prototype.$video = Video

第三步:在页面中的具体使用

这边向大家分享有多个视频标签,利用video.js实现倍速播放功能。
首先先上一张效果图
带倍速的视频播放器
在data中声明ids: [] 和 myPlayer: []变量,在这里不做过多展示。

首先创建video标签
这里介绍一下动态创建video标签的方式,稍微会麻烦一点,如果是非动态创建的video标签会更简单(由于涉及到多个视频,这里对每个video标签动态生成了唯一的id值,生成的id在初始化方法中将作为参数传入)

注意:创建的video标签不能够对其进行任何属性及样式操作,否则在调用getVideo()标签初始化时会有警告提示当前的video标签已经被初始化过了,你的操作就不会生效。

上代码!

    // 插入的视频内容格式处理
    updateVideo(result) {
      // 插入内容
      const _videos = []
      result.map(item => {
        _videos.push(
          `<div class="ck-media__wrapper"><video id="myVideo${Math.random()
            .toString(36)
            .substr(2) + Date.now()}" class="video-js"><source src="${
            item.attachUrl
          }" style=" width: 100%;height: 100%; type="video/mp4"></video></div>`
        )
      })
      this.docInfo.content += _videos.join('')
    },

然后创建getVideo()的方法
实现对video标签的操作,利用循环来初始化每个video标签。

上代码!

getVideo() {
      for (let i = 0; i < this.ids.length; i++) {
        this.myPlayer[i] = this.$video(
          this.ids[i], //每个video标签对应的id
          {
            controls: true,
            autoplay: false,
            preload: false,
            fluid: true, // 自适应宽高
            controlBar: {
              // 设置控制条组件
              currentTimeDisplay: true,
              timeDivider: true,
              durationDisplay: true,
              remainingTimeDisplay: false,
              volumePanel: {
                inline: false
              },
              children: [
                { name: 'playToggle' }, // 播放/暂停按钮
                { name: 'currentTimeDisplay' }, // 视频当前已播放时间
                { name: 'progressControl' }, // 播放进度条
                { name: 'durationDisplay' }, // 视频播放总时间
                {
                  // 倍速播放
                  name: 'playbackRateMenuButton',
                  playbackRates: [0.5, 1, 1.5, 2, 2.5]
                },
                {
                  name: 'volumePanel', // 音量控制
                  inline: false // 不使用水平方式
                },
                { name: 'FullscreenToggle' } // 全屏
              ]
            }
          },
          function() {
            this.play() // 自动播放
          }
        )
      }
    }

接下来该在哪里来调用getVideo()方法呢?
这个当然要根据具体的项目开发情况而定啦,由于我现在所在项目中的video标签是根据后端返回数据进行动态渲染的,所以我用了watch监听来决定什么时候调用getVideo()方法。

上代码!

watch: {
    'docInfo.content': {
      handler(nVal, oVal) {
        let videoArr = []
        if (nVal && nVal !== oVal) {
          this.$nextTick(() => {
            // 通过window.document.querySelectorAll('video')获取所有的video标签
            videoArr = window.document.querySelectorAll('video')
            // 如果存在video标签
            if (videoArr && videoArr.length > 0) {
              this.ids = []
              // 循环遍历所有video标签
              for (let i = 0; i < videoArr.length; i++) {
                // 将每个video对应的id存入ids数组中,以便后面将id作为参数传入到初始化方法中
                this.ids.push(window.document.querySelectorAll('video')[i].getAttribute('id'))
                if (this.ids && this.ids.length > 0) {
                  // 调用初始化video方法,对video标签进行操作
                  this.getVideo()
                }
              }
            }
          })
        }
      },
      deep: true
    }
  },

这里监听的对象是docInfo.content,这个对象用于接收接口返回的数据。
当监听到内容有变化时,就获取当前内容是否含有video标签,如果有,通过循环遍历获取到每个video标签的id(为什么要获取id呢,是因为用video.js初始化video标签时传入的第一个参数必须是id),如果id存在则调用getVideo()方法对当前id的video标签进行操作。

最后,利用dispose()方法销毁已经初始化后的video标签。
不销毁会怎么样?
会出现警告VIDEOJS: WARN: Player “myVideo449olbdpe” is already initialised. Options will not be applied.
警告原因是什么?
当第一次初始化完某一个video标签,第二次再次调用getVideo()方法对这个video标签进行初始化时,出现警告,意思是id为myVideo449olbdpe这个video标签已经被初始化了,其他操作将不会被应用,也就是说你第二次对这个标签初始化会不生效。

上代码!

for (let i = 0; i < this.ids.length; i++) {
        this.myPlayer[i].dispose()
      }

写在最后

网上关于video.js在vue项目中使用的介绍不太多,使用过程中很容易遇坑,尤其是对于利用video.js对多个视频进行操作的技术博客更少,因此给大家总结了自己在项目开发中遇到的一些问题及解决经验,其中需要注意的点都已经在文章中注明了,希望能够帮助到大家,如有不足请多多指教。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐