video.js + vue3 示例

7,128 阅读2分钟

简单使用video.js

官方文档: Home | Video.js Documentation (videojs.com)

    1. 安装依赖
pnpm i video.js
pnpm i @types/video.js -D
    1. 引入
import videojs from 'video.js'
import type { VideoJsPlayerOptions } from 'video.js'
import 'video.js/dist/video-js.min.css'
    1. 初始化video
// options简单的一些参数
const options: VideoJsPlayerOptions = {
    language: 'zh-CN', // 设置语言
    controls: true, // 是否显示控制条
    preload: 'auto', // 预加载
    autoplay: true, // 是否自动播放
    fluid: true, // 自适应宽高
    src: props.src // 要嵌入的视频源的源 URL
}
// 1. id video元素或video的id
// 2. options 参数配置
// 3. onReady 回调函数,可选
const videoPlayer = videojs(id, options, onReady)
    1. 简单封装成一个组件
<script setup lang="ts">
import { computed, CSSProperties, onMounted, ref } from 'vue'
import videojs from 'video.js'
import type { VideoJsPlayerOptions } from 'video.js'
import 'video.js/dist/video-js.min.css'
type MyVideoProps = {
  /** 视频地址 */
  src: string
  width?: string
  height?: string
}
const props = withDefaults(defineProps<MyVideoProps>(), {})
// video标签
const videoRef = ref<HTMLElement | null>(null)
// video实例对象
let videoPlayer: videojs.Player | null = null
const videoWrapStyles = computed<CSSProperties>(() => {
  return {
    width: props.width || '100%',
    height: props.height || '100%'
  }
})
// 初始化videojs
const initVideo = () => {
  // https://gitcode.gitcode.host/docs-cn/video.js-docs-cn/docs/guides/options.html
  const options: VideoJsPlayerOptions = {
    language: 'zh-CN', // 设置语言
    controls: true, // 是否显示控制条
    preload: 'auto', // 预加载
    autoplay: true, // 是否自动播放
    fluid: false, // 自适应宽高
    src: props.src // 要嵌入的视频源的源 URL
  }
  if (videoRef.value) {
    // 创建 video 实例
    videoPlayer = videojs(videoRef.value, options, onPlayerReady)
  }
}
// video初始化完成的回调函数
const onPlayerReady = () => {}
onMounted(() => {
  initVideo()
})
</script>
<template>
  <div :style="videoWrapStyles">
    <video id="my-player" ref="videoRef" class="video-js w-full h-full">
      <source :src="src" />
    </video>
  </div>
</template>
<style lang="scss" scoped>
.w-full {
  width: 100%;
}
.h-full {
  height: 100%;
}
</style>

在App.vue中使用

<script setup lang="ts">
import MyVideo from './components/MyVideo/index.vue'
</script>

<template>
  <div>
    <div class="video-container">
      <MyVideo src="https://media.w3.org/2010/05/sintel/trailer.mp4" />
    </div>
  </div>
</template>

<style scoped>
.video-container {
  width: 800px;
  height: 600px;
}
</style>

image.png 然后点击就可以播放了。

自定义控件

在实际项目开发中,我们都是使用自定义控件,而不是使用默认的控件。

1. video事件

事件名说明
loadstart视频查找,当浏览器开始加载资源时触发
durationonchange时长变化
loadedmetadata元数据加载,当指定资源的元数据已加载时触发,元数据包括时长/尺寸/文本轨道等信息值
loadeddata视频下载监听,当当前帧的数据已加载,但没有足够的数据来播放指定资源的下一帧时触发
progress浏览器下载监听,当浏览器正在下载指定资源时触发
canplay浏览器下载监听,当浏览器正在下载指定资源时触发
canplaythrough可流畅播放,当浏览器预计能够在不停下来进行缓冲的情况下持续播放指定资源时触发
play播放监听
pause暂停监听
seeking查找开始,当用户开始移动、跳跃到资源中新的位置时触发
seeked查找结束,当用户已经移动、跳跃到视频中新的位置时触发
waiting视频加载等待,当视频由于需要缓冲下一帧而停止,等待时触发
playing当视频在已经因缓冲而暂停或停止后已就绪时触发
timeUpdate目前的播放位置已更改时,播放时间更新
ended播放结束
error播放错误
volumechange音量改变时
stalled当浏览器尝试获取媒体数据,但数据不可用时
ratechange当视频的播放速度已更改时
fullscreenchange全屏状态改变

以上方法可以通过video的实例on方法进行绑定:

videoPlayer.on('play', onPlay)

2. video.js方法

方法名说明
play播放视频
pause暂停播放
paused是否已暂停播放,返回boolean值
requestFullscreen全屏
exitFullscreen退出全屏
requestPictureInPicture画中画
exitPictureInPicture退出画中画
volume设置音量 videoPlayer.volume(0.6)
playbackRate倍速播放 videoPlayer.playbackRate(1.5)
currentTime改变当前播放进度

动画.gif

gitee仓库:video.js-app: 使用video.js + vue3的简单示例 (gitee.com)