当前位置:   article > 正文

vue videojs视频播放插件 动态资源

vue videojs视频播放插件 动态资源

概览:使用vediojs第三方视频播放插件,视频加载有两种方式,第一种是html方式,类似于img标签的src,写在video标签内的<source src=''>;第二种方式是js方式,实例化一个videojs对象并且赋值src。

一、定义

videojs官网

videojs中文文档

videojs英文文档

gitlab源码

videojs的option的所有的配置参数

二、操作步骤

1.1 安装

pnpm i video.js

pnpm i @types/video.js -D

或者

yarn add ...

或者

npm install --save-dev video.js

1.2 引入挂载

1.全局引入main.js

import VideoPlayer from '@videojs-player/vue'

import 'video.js/dist/video-js.css'

const app = createApp(App)

app.use(VideoPlayer)

2.局部引入

import videojs from 'video.js'

import type { VideoJsPlayerOptions } from 'video.js'  //ts写法需要

import 'video.js/dist/video-js.min.css'

1.3 核心代码

// 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.4 整体代码

1.封装成一个带ts的页面组件

  1. <script setup lang="ts">
  2. import { computed, CSSProperties, onMounted, ref, watch } from 'vue'
  3. import videojs from 'video.js'
  4. import type { VideoJsPlayerOptions } from 'video.js'
  5. import 'video.js/dist/video-js.min.css'
  6. type MyVideoProps = {
  7. /** 视频地址 */
  8. src: string
  9. width?: string
  10. height?: string
  11. }
  12. const props = withDefaults(defineProps<MyVideoProps>(), {})
  13. // video标签
  14. const videoRef = ref<HTMLElement | null>(null)
  15. // video实例对象
  16. let videoPlayer: videojs.Player | null = null
  17. const videoWrapStyles = computed<CSSProperties>(() => {
  18. return {
  19. width: props.width || '100%',
  20. height: props.height || '100%'
  21. }
  22. })
  23. // 初始化videojs
  24. const initVideo = () => {
  25. // https://gitcode.gitcode.host/docs-cn/video.js-docs-cn/docs/guides/options.html
  26. const options: VideoJsPlayerOptions = {
  27. language: 'zh-CN', // 设置语言
  28. controls: true, // 是否显示控制条
  29. preload: 'auto', // 预加载
  30. autoplay: true, // 是否自动播放
  31. fluid: false, // 自适应宽高
  32. src: props.src, // 要嵌入的视频源的源 URL
  33. objectFit: 'cover', // 同css object-fit,作用于video标签
  34. }
  35. if (videoRef.value) {
  36. // 创建 video 实例
  37. videoPlayer = videojs(videoRef.value, options, onPlayerReady)
  38. }
  39. }
  40. // video初始化完成的回调函数
  41. const onPlayerReady = () => {}
  42. onMounted(() => {
  43. initVideo()
  44. })
  45. watch(() => props.src, (now) => {
  46. if (now) {
  47. videoPlayer.reset()
  48. setTimeout(() => {
  49. videoPlayer.src([
  50. {
  51. src: props.src,
  52. type: "application/x-mpegURL"
  53. }
  54. ])
  55. videoPlayer.load()
  56. videoPlayer.play()
  57. }, 10)
  58. }
  59. })
  60. </script>
  61. <template>
  62. <div :style="videoWrapStyles">
  63. <video id="my-player" ref="videoRef" class="video-js w-full h-full">
  64. <source :src="src" />
  65. </video>
  66. </div>
  67. </template>
  68. <style lang="scss" scoped>
  69. .w-full {
  70. width: 100%;
  71. }
  72. .h-full {
  73. height: 100%;
  74. }
  75. </style>

2.不封装,直接使用,分为<template><script><style> 三部分

 

  1. <video-player
  2. :src="options.src"
  3. :poster="options.poster"
  4. class="video-player "
  5. crossorigin="anonymous"
  6. :preload="options.preload"
  7. playsinline
  8. controls
  9. :loop="true"
  10. :volume="0.6"
  11. :options="options"
  12. @mounted="handleMounted"
  13. @ended="ended($event)"
  14. @play="play($event)"
  15. @pause="pause($event)"
  16. >
  17. </video-player>
  1. /* videoplayer */
  2. const player = shallowRef(null)
  3. const options = reactive({
  4. width: '100vw', // 播放器宽度,默认100vw
  5. height: '200px', // 播放器高度,默认100vh
  6. src: '', // 视频地址
  7. poster: '', // 视频海报
  8. type: 'm3u8', // 视频类型
  9. muted: false, // 视频静音
  10. autoplay: true, // 自动播放
  11. loop: false, // 循环播放
  12. volume: 1, // 音量大小 0-1
  13. preload: 'auto', // 预加载
  14. objectFit: 'cover', // 同css object-fit,作用于video标签
  15. currentTime: 0, // 当前播放时间
  16. showCurrentTime: false, // 是否在拖动进度条时toast当前时间文字
  17. errorText: '播放出错', // 视频error时,toast提示
  18. control: true,
  19. preferFullWindow: true, //将此设置为true将更改不支持 HTML5 全屏 API 但支持视频元素全屏的设备(即 iPhone)上的全屏行为。播放器将被拉伸以填充浏览器窗口,而不是全屏播放视频
  20. })
  21. // 当我们需要给视频增加流体模式时,也可以在mounted阶段
  22. const handleMounted = (payload) => {
  23. player.value = payload.player
  24. player.value.fluid(true)
  25. player.value.aspectRatio('16:9')
  26. }
  27. // 我们还可在播放、暂停、结束进行一些操作,或者当这些操作发生时我们需要做什么
  28. const play = (log) => {
  29. // 播放之前做验证,需要验证的则暂停播放
  30. if (nowPlayUrlIndex.value !== 0 && !nowVideoIdCheck.value[nowgood_id].code) {
  31. player.value.pause()
  32. show.value = true
  33. } else {
  34. show.value = false
  35. }
  36. }
  37. const pause = (log) => {
  38. // 暂停的时候我们可以跳出广告弹窗
  39. }
  40. // 视频播放完 =》 跳转下一个
  41. const ended = (log) => {
  42. player.value.src(nextPlayUrl.value)
  43. player.value.poster(videoList.value[index].resCover)
  44. player.value.load(nextPlayUrl.value)
  45. player.value.play(nextPlayUrl.value)
  46. }
  1. .video-js {
  2. width: 100%;
  3. /*不给高度是因为开启了流体模式自适应*/
  4. }
  5. :deep(.vjs-poster img) {
  6. object-fit: fill ; /*让封面图片也铺开*/
  7. }
  8. /*对原生的播放按钮进行样式修改*/
  9. :deep(.video-js .vjs-big-play-button) {
  10. display: none;
  11. height: 3em;
  12. line-height: 3em;
  13. border: none;
  14. border-radius: 50%;
  15. margin-top: -1.31666em;
  16. margin-left: -1.5em;
  17. }

 

 

三、代码实现

1.页面组件使用 封装的组件

  1. <script setup lang="ts">
  2. import MyVideo from './components/MyVideo/index.vue'
  3. </script>
  4. <template>
  5. <div>
  6. <div class="video-container">
  7. <MyVideo src="https://media.w3.org/2010/05/sintel/trailer.mp4" />
  8. </div>
  9. </div>
  10. </template>
  11. <style scoped>
  12. .video-container {
  13. width: 800px;
  14. height: 600px;
  15. }
  16. </style>

vediojs中文文档的 案例 

四、效果展示

五、其它

1.常用配置

 2.常用方法和事件

 六、动态跟换数据

概览:在vue前端框架里面,跟换数据对应的页面会重新渲染。那么,如果我更改了视频播放的video标签绑定的数据,更改了数据页面会播放其它的资源吗?

1.实现思路:

通过监听,数据发生变化,video组件重新渲染。

我们知道视频加载有两种方式,一是html的标签,二是js赋值。

 

 

2.核心代码:

封装的页面组件里面添加监听。把声明的实例重置,并且重新赋值src。

视频资源跟换:

  1. watch(() => props.src, (now) => {
  2. if (now) {
  3. videoPlayer.reset()
  4. setTimeout(() => {
  5. videoPlayer.src([
  6. {
  7. src: props.src,
  8. type: "application/x-mpegURL"
  9. }
  10. ])
  11. videoPlayer.load()
  12. videoPlayer.play()
  13. }, 10)
  14. }
  15. })

 video组件销毁:核心方法:dispose()

dispose()从播放器中删除所有事件侦听器。删除播放器的DOM元素,所以再次初始化的时候需要我们重新创建标签

 source标签src属性赋值成功,但浏览器未去获得相应的视频。
动态插入source标签,触发浏览器进行重排

v-html 指令 可以输出HTML

load() 方法重新加载音频/视频元素。
load() 方法用于在更改来源或其他设置后对音频/视频元素进行更新。

  1. var myVideoDiv = document.getElementById("myVideoDiv")
  2. myVideoDiv.innerHTML = "
  3. <video
  4. id='myvideo'
  5. class='video-js vjs-default-skin vjs-big-play-centered'
  6. controls
  7. preload='auto'
  8. style='width: 100%;height: 100%'
  9. controlBar='true'
  10. >
  11. <source
  12. src="+ this.firstSrc +" style='width: 100%;height: 100%'
  13. type='application/x-mpegURL'>
  14. </video>"

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/607977
推荐阅读
相关标签
  

闽ICP备14008679号