vue3使用video.js播放m3u8格式视频的操作指南

 更新时间:2024年07月08日 08:51:57   作者:抹茶san  
有时候我们需要播放 m3u8 格式的视频,或者实现视频播放器更多定制化需求,HTML 的 video 元素无法实现这些需求,这时候可以考虑使用 Video.js,本文给大家介绍了vue3使用video.js播放m3u8格式视频的操作指南,需要的朋友可以参考下

有时候我们需要播放 m3u8 格式的视频,或者实现视频播放器更多定制化需求,HTML 的 video 元素无法实现这些需求,这时候可以考虑使用 Video.js。

video.js是为HTML5世界从零开始构建的网络视频播放器。它支持HTML5视频和现代流媒体格式,以及YouTube和Vimeo。

videojs官网:videojs.com/guides/

videojs 中文文档:https://gitcode.gitcode.host/docs-cn/video.js-docs-cn/index.html

实现一个Videojs播放器组件

视频封面图片来自unsplash

安装依赖

npm i video.js

M3U8 是一种基于 HTTP Live Streaming (HLS) 技术的媒体播放列表格式,所以我们还需要安装依赖。

npm i videojs-contrib-hls

播放器组件代码

<template>
  <div v-bind="$attrs" class="videoPlayer">
    <video
      class="video-js"
      :id="id"
      style="width: 100%; height: 100%"
      :poster="poster"
    >
      <source v-if="src" :src="src" />
    </video>
  </div>
</template>

<script setup lang="ts">
import { onMounted, onBeforeUnmount, watch, ref } from 'vue'
import 'video.js/dist/video-js.css'
import videojs from 'video.js'

const overrideNative = ref(false)
const props = defineProps({
  id: { type: String, default: 'vd' },
  src: { type: String, default: '' },
  poster: { type: String, default: '' }
})

const emit = defineEmits([
  'videoCanplaythrough',
  'videoPlay',
  'videoPlaying',
  'videoPause'
])

// VideoJs更多选项配置可以参考中文文档:
// https://gitcode.gitcode.host/docs-cn/video.js-docs-cn/docs/guides/options.html
function options() {
  return {
    html5: {
      hls: {
        overrideNative: overrideNative
      },
      nativeVideoTracks: !overrideNative,
      nativeAudioTracks: !overrideNative,
      nativeTextTracks: !overrideNative
    },
    autoplay: true, // true,浏览器准备好时开始播放。
    muted: false, // 默认情况下将会消除音频。
    loop: false, // 导致视频一结束就重新开始。
    controls: true,
    preload: 'auto', // auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
    fluid: true, // 当true时,将按比例缩放以适应其容器。
    type: 'application/x-mpegURl',
    notSupportedMessage: '此视频暂无法播放,请稍后再试', // 无法播放媒体源时显示的默认信息。
    textTrackDisplay: false
  }
}

let player: any

onMounted(() => {
  try {
    player = videojs(props.id, options(), () => {
      videojs.log('播放器已经准备好了!')
      player.pause()
      player.on('canplaythrough', function (event: any) {
        emit('videoCanplaythrough', event.target.player.cache_?.duration)
      })
      player.on('play', function () {
        videojs.log('视频准备播放')
        emit('videoPlay')
      })
      player.on('playing', function () {
        videojs.log('视频已开始播放')
        emit('videoPlaying')
      })
      player.on('pause', function (event: any) {
        emit('videoPause', event.target.player.cache_?.currentTime)
      })
    })
  } catch (error) {
    console.log('catch--->', error)
  }
})

onBeforeUnmount(() => {
  if (player) {
    player.dispose()
  }
})
</script>

<style scoped>
.videoPlayer {
  width: 100%;
  max-width: 640px;
  height: 360px;
  position: relative;
  overflow: hidden;
}

.video-js {
  padding-top: 0 !important;
}
</style>

组件使用

<template>
  <div>  
      <VideoPlayer
        :src="src"
        id="videoPlayer"
        :poster="require('~/assets/images/photo-1622208489373-1fe93e2c6720.avif')"
      />   
  </div>
</template>

<script setup>
import { ref } from 'vue'

const src = ref(
  'https://xxx.m3u8' 
)


</script>

设置语言为中文

基础的播放器已经写好了,但是现在播放器自带的语言还是英文,我们需要设置为中文。 VideoJS自带了很多语言包,按需设置即可。

import video_zhCN from 'video.js/dist/lang/zh-CN.json'
videojs.addLanguage('zh-CN', video_zhCN)

// ...
function options() {
  return {
    // ...
    language: 'zh-CN'
  }
}

OK,VideoJs 播放器的文字已经变成中文了。

如何同时使用多个VideoJs播放器组件

如果我们直接复制一样的组件代码,发现只有第一个可以正常播放,第二个播放器不能使用

这个问题也很好解决,上面的组件props提供了id属性,我们只需给两个组件设置不同的id即可

 <VideoPlayer
        :src="src"
        id="vd1"
        :poster="require('~/assets/images/photo-1622208489373-1fe93e2c6720.avif')"
      />

你可能还会遇到切换视频没有变化的的问题,通过为每次播放的视频设置独一无二的id即可,类似:id=uuid()

指定播放时间点

通过设置currentTime,可以让视频从某个时间点开始播放

watch(
  () => props.currentTime,
  () => {
    player.currentTime(Number(props.currentTime))
  }
)

onMounted(() => {
  try {
    player = videojs(props.id, options(), () => {
      // ...
      player.on('timeupdate', function (event: any) {
        emit('videoTimeupdate', event.target.player.cache_?.currentTime)
      })
      // ...
    })
  }
})

以上就是vue3使用video.js播放m3u8格式视频的操作指南的详细内容,更多关于vue3 video.js播放m3u8视频的资料请关注脚本之家其它相关文章!

相关文章

  • vue--vuex详解

    vue--vuex详解

    这篇文章主要介绍了vue--vuex的详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue实现样式之间的切换及vue动态样式的实现方法

    vue实现样式之间的切换及vue动态样式的实现方法

    这篇文章主要介绍了vue中如何实现样式之间的切换及vue动态样式的实现方法,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • 详解Vue串联过滤器的使用场景

    详解Vue串联过滤器的使用场景

    这篇文章主要介绍了详解Vue串联过滤器的使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Vue组件封装上传图片和视频的示例代码

    Vue组件封装上传图片和视频的示例代码

    这篇文章主要介绍了Vue封装上传图片和视频的组件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 使用Vue实现简易的车牌输入键盘

    使用Vue实现简易的车牌输入键盘

    这篇文章主要为大家详细介绍了如何使用Vue实现简易的车牌输入键盘效果,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-11-11
  • 实现一个Vue自定义指令懒加载的方法示例

    实现一个Vue自定义指令懒加载的方法示例

    这篇文章主要介绍了实现一个Vue自定义指令懒加载的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 详解vue-router2.0动态路由获取参数

    详解vue-router2.0动态路由获取参数

    本篇文章主要介绍了详解vue-router2.0动态路由获取参数,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Vue实战记录之登陆页面的实现

    Vue实战记录之登陆页面的实现

    最近学习过程中常碰到让用户登录注册这种,这篇文章主要给大家介绍了关于Vue实战记录之登陆页面实现的相关资料,需要的朋友可以参考下
    2021-06-06
  • 使用element-ui +Vue 解决 table 里包含表单验证的问题

    使用element-ui +Vue 解决 table 里包含表单验证的问题

    这篇文章主要介绍了使用element-ui +Vue 解决 table 里包含表单验证的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue+scss+element-ui实现表格表头斜杠一分为三方式

    vue+scss+element-ui实现表格表头斜杠一分为三方式

    这篇文章主要介绍了vue+scss+element-ui实现表格表头斜杠一分为三方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论