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

news2024/12/24 11:27:31

概览:使用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的页面组件

<script setup lang="ts">
import { computed, CSSProperties, onMounted, ref, watch } 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
    objectFit: 'cover', // 同css object-fit,作用于video标签
  }
  if (videoRef.value) {
    // 创建 video 实例
    videoPlayer = videojs(videoRef.value, options, onPlayerReady)
  }
}
// video初始化完成的回调函数
const onPlayerReady = () => {}
onMounted(() => {
  initVideo()
})
watch(() => props.src, (now) => {
    if (now) {
        videoPlayer.reset()
        setTimeout(() => {
            videoPlayer.src([
                {
                    src: props.src,
                    type: "application/x-mpegURL"
                }
            ])
            videoPlayer.load()
            videoPlayer.play()
        }, 10)
    }
})
</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>

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

 

<video-player  
    :src="options.src" 
    :poster="options.poster" 
    class="video-player "
    crossorigin="anonymous" 
    :preload="options.preload" 
    playsinline 
    controls 
    :loop="true" 
    :volume="0.6"
    :options="options" 
    @mounted="handleMounted" 
    @ended="ended($event)" 
    @play="play($event)"
    @pause="pause($event)"
    >
</video-player>

/* videoplayer */
const player = shallowRef(null)
const options = reactive({
    width: '100vw', // 播放器宽度,默认100vw
    height: '200px',  // 播放器高度,默认100vh
    src: '', // 视频地址
    poster: '', // 视频海报
    type: 'm3u8', // 视频类型
    muted: false, // 视频静音
    autoplay: true,  // 自动播放
    loop: false, // 循环播放
    volume: 1,  // 音量大小 0-1
    preload: 'auto',  // 预加载
    objectFit: 'cover', // 同css object-fit,作用于video标签
    currentTime: 0, // 当前播放时间
    showCurrentTime: false, // 是否在拖动进度条时toast当前时间文字
    errorText: '播放出错', // 视频error时,toast提示
    control: true,
    preferFullWindow: true, //将此设置为true将更改不支持 HTML5 全屏 API 但支持视频元素全屏的设备(即 iPhone)上的全屏行为。播放器将被拉伸以填充浏览器窗口,而不是全屏播放视频
})

// 当我们需要给视频增加流体模式时,也可以在mounted阶段
const handleMounted = (payload) => {
    player.value = payload.player
    player.value.fluid(true)
    player.value.aspectRatio('16:9')
}
// 我们还可在播放、暂停、结束进行一些操作,或者当这些操作发生时我们需要做什么
const play = (log) => {
   // 播放之前做验证,需要验证的则暂停播放
   if (nowPlayUrlIndex.value !== 0 && !nowVideoIdCheck.value[nowgood_id].code) {
        player.value.pause()
        show.value = true
    } else {
        show.value = false
    }
}
const pause = (log) => {
    // 暂停的时候我们可以跳出广告弹窗
    
}
// 视频播放完 =》 跳转下一个
const ended = (log) => {
        player.value.src(nextPlayUrl.value)
        player.value.poster(videoList.value[index].resCover)
        player.value.load(nextPlayUrl.value)
        player.value.play(nextPlayUrl.value)
}
.video-js {
    width: 100%;
    /*不给高度是因为开启了流体模式自适应*/
}

:deep(.vjs-poster img) {
    object-fit: fill ; /*让封面图片也铺开*/

}
/*对原生的播放按钮进行样式修改*/
:deep(.video-js .vjs-big-play-button) {
    display: none;
    height: 3em;
    line-height: 3em;
    border: none;
    border-radius: 50%;
    margin-top: -1.31666em;
    margin-left: -1.5em;
}

 

 

三、代码实现

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

<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>

vediojs中文文档的 案例 

四、效果展示

五、其它

1.常用配置

 2.常用方法和事件

 六、动态跟换数据

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

1.实现思路:

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

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

 

 

2.核心代码:

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

视频资源跟换:

watch(() => props.src, (now) => {
    if (now) {
        videoPlayer.reset()
        setTimeout(() => {
            videoPlayer.src([
                {
                    src: props.src,
                    type: "application/x-mpegURL"
                }
            ])
            videoPlayer.load()
            videoPlayer.play()
        }, 10)
    }
})

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

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

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

v-html 指令 可以输出HTML

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

var myVideoDiv = document.getElementById("myVideoDiv")
myVideoDiv.innerHTML = "
    <video 
        id='myvideo' 
        class='video-js vjs-default-skin  vjs-big-play-centered' 
        controls 
        preload='auto' 
        style='width: 100%;height: 100%' 
        controlBar='true'
    >
        <source 
            src="+ this.firstSrc +" style='width: 100%;height: 100%' 
            type='application/x-mpegURL'>
        </video>"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/832347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

anaconda创建虚拟环境在D盘

【看一看就行&#xff0c;又是挺水的一期&#xff08;每一季都掺和一点子水分也挺好&#xff09;】 一、创建&#xff1a; conda create --prefixD:\python37\py37 python3.7 这下就在D盘了&#xff1a; 二、激活刚刚那个环境&#xff1a; activate D:\pyhton37\py37​ &…

Zebec APP:构建全面、广泛的流支付应用体系

目前&#xff0c;流支付协议 Zebec Protocol 基本明确了生态的整体轮廓&#xff0c;它包括由其社区推动的模块化 Layer3 构架的公链 Nautilus Chain、流支付应用 Zebec APP 以及 流支付薪酬工具 Zebec payroll 。其中&#xff0c;Zebec APP 是原有 Zebec Protocol 的主要部分&a…

高校陆续拥抱chatgpt,人工智能会给学术带来什么变化会有什么影响

在当今信息爆炸的时代&#xff0c;人工智能在各行各业都发挥着越来越重要的作用&#xff0c;高校教育领域也不例外。最近&#xff0c;越来越多的高校开始陆续拥抱chatgpt&#xff08;Chatbot GPT&#xff09;这一人工智能技术&#xff0c;在学术领域会带来了怎样的变化与影响&a…

小研究 - 领域驱动设计DDD在IT企业内部网站开发中的运用(二)

在企业内部网站的建设过程中&#xff0c;网站后端最初采用传统的表模式的开发方式。这种方式极易导致站点的核心业务逻辑和业务规则分布在架构的各个层和对象中&#xff0c;这使得系统业务逻辑的复用性不高。为了解决这个问题&#xff0c;作者在后期的开发过程中引入了领域驱动…

电缆故障检测仪技术参数

一、电缆故障测试仪的技术参数 1.采样方法&#xff1a;低压脉冲法、冲击闪络法、速度测量法 2.电缆长度&#xff1a;50m、300m、1km、2km、5km、10km、30km、60km 3.波速设置&#xff1a;交联乙烯、聚氯乙烯、油浸纸、不滴油和未知类型自设定 4.冲击高压&#xff1a;35kV及以下…

linux基本功系列之cd命令实战

文章目录 前言一. cd命令的介绍二. 语法格式及常用选项三. 参考案例总结 前言 居然发现了落下了CD命令&#xff0c;也不算落下把&#xff0c;主要是cd命令内容太少&#xff0c;撑不起一篇文章&#xff0c;今天也写一写&#xff0c;就当记个笔记吧 &#x1f3e0;个人主页&#…

业务逻辑漏洞之支付逻辑漏洞

业务逻辑漏洞之支付逻辑漏洞 一、漏洞挖掘介绍二、Web漏洞产生的原因三、业务逻辑简述四、 常见业务逻辑漏洞的功能点五、支付逻辑漏洞5.1、漏洞背景5.2、产生原因5.3、测试方法 六、挖到这些漏洞有什么用&#xff1f; 一、漏洞挖掘介绍 漏洞定义&#xff1a; 官方定义&#…

策略模式——算法的封装与切换

1、简介 1.1、概述 在软件开发中&#xff0c;常常会遇到这种情况&#xff0c;实现某一个功能有多条途径。每一条途径对应一种算法&#xff0c;此时可以使用一种设计模式来实现灵活地选择解决途径&#xff0c;也能够方便地增加新的解决途径。为了适应算法灵活性而产生的设计模…

opencv35-形态学操作-腐蚀cv2.erode()

形态学&#xff0c;即数学形态学&#xff08;Mathematical Morphology&#xff09;&#xff0c;是图像处理过程中一个非常重要的研 究方向。形态学主要从图像内提取分量信息&#xff0c;该分量信息通常对于表达和描绘图像的形状具有 重要意义&#xff0c;通常是图像理解时所使用…

【零基础学Rust | 基础系列 | 函数,语句和表达式】函数的定义,使用和特性

文章标题 简介一&#xff0c;函数1&#xff0c;函数的定义2&#xff0c;函数的调用3&#xff0c;函数的参数4&#xff0c;函数的返回值 二&#xff0c;语句和表达式1&#xff0c;语句2&#xff0c;表达式 总结&#xff1a; 简介 在Rust编程中&#xff0c;函数&#xff0c;语句…

MySQL数据库安装(二)

夕阳留恋的不是黄昏&#xff0c;而是朝阳 上一章简单介绍了MySQL数据库概述(一), 如果没有看过, 请观看上一章 一. MySQL 卸载 一.一 停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话…

类的多态性(JAVA)

目录 多态 重写 向上转型 类的多态性例子&#xff1a; 多态的优缺点 多态 所有的OOP语言都会有三个特征&#xff1a; 封装&#xff08;点击可跳转&#xff09;继承&#xff08;点击可跳转&#xff09;多态 多态体现&#xff1a;在代码运行时&#xff0c;当传递不同类对…

8.3day04git+数据结构

文章目录 git版本控制学习高性能的单机管理主机的心跳服务算法题 git版本控制学习 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用&#xff1a;记录代码内容&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 安装g…

GROW模型及其应用

一、作用 提供一套可操作的流程来理清现状&#xff0c;创造专注&#xff0c;减少干扰&#xff0c;使执行人从内心找到下阶段目标与达成目标的实施办法。是一套主要用于沟通、绩效辅导中的方法。 二、是什么 GROW模型由确定目标&#xff08;Goal&#xff09;、了解现状&…

神经网络的搭建与各层分析

为什么去西藏的人都会感觉很治愈 拉萨的老中医是这么说的 缺氧脑子短路&#xff0c;很多事想不起来&#xff0c;就会感觉很幸福 一、卷积层 解释&#xff1a;卷积层通过卷积操作对输入数据进行处理。它使用一组可学习的滤波器&#xff08;也称为卷积核或特征检测器&#xff09…

hive通过外表整合es,超详细过程。

参考官网 Apache Hive integration | Elasticsearch for Apache Hadoop [7.17] | Elastic 官网的介绍很简单&#xff0c;我看了很多博客&#xff0c;写的也很简单&#xff0c;但是我搞了半天才勉强成功&#xff0c;分享下&#xff0c;免得各位多走弯路。 环境准备 官网也很…

论文研读|生成式文本隐写发展综述

前言&#xff1a;最近接触了文本隐写这一研究领域&#xff0c;大概率以后深入这个方向开展研究&#xff0c;以下是本人近日对该领域研究现状的调研总结&#xff0c;以及生成式文本隐写代表性工作的相关介绍&#xff0c;便于厘清生成式文本隐写的发展脉络以及探寻未来研究空间。…

Go学习第三天

map的三种声明定义方式 声明map后&#xff0c;一定要make开辟空间&#xff0c;否则会报越界且不能使用 package mainimport "fmt"func main() {// 第一种声明方式// 声明myMap1是一种map类型 key是string value是stringvar myMap1 map[string]string// 判断一下map在…

接口请求(get、post、head等)详解

一&#xff0e;接口请求的六种常见方式&#xff1a; 1、Get 向特定资源发出请求&#xff08;请求指定页面信息&#xff0c;并返回实体主体&#xff09; 2、Post 向指定资源提交数据进行处理请求&#xff08;提交表单、上传文件&#xff09;&#xff0c;又可能导致新的资源的建…

【高光谱图像的去噪算法】通过全变异最小化对受激拉曼光谱图像进行去噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…