vue中使用vue-video-player插件播放视频 以及 audio播放音频

news2024/9/21 16:50:31

一、使用vue-video-player插件播放视频

安装

  npm install vue-video-player --save

在main.js中引用

//引入视频播放插件
// main.js
import VueVideoPlayer from 'vue-video-player'
import 'video.js/dist/video-js.css'
import 'vue-video-player/src/custom-theme.css'

Vue.use(VueVideoPlayer)

在组件中使用

<template>
  <div class="playerBOx">
    <video-player ref="videoPlayer" class="player-video vjs-custom-skin" :playsinline="false" :options="playOptions"
      @play="onPlayerPlay($event)"  @ended="onPlayerEnd($event)"
      @waiting="onPlayerWaiting($event)" @timeupdate="onPlayerTimeupdate($event)"
      @statechanged="playerStateChanged($event)" />

  </div>
</template>
 
<script>
import { videoPlayer } from 'vue-video-player'
import 'video.js/dist/video-js.css'

export default {
  components: {
    videoPlayer
  },
  props: {
    path: {  // 传入的地址
      type: String,
      default: "",
    },
    lastTime: {  // 传入的上次播放位置
      type: Number,
      default: 0,
    },
    videoType: {
      type: String,
      default: "",
    }
  },
  data() {
    return {
      playedTime: this.lastTime,
      currentTime: 0,
      maxTime: 0,
      playOptions: {
        playbackRates: [0.5, 1.0, 1.5, 2.0], // 可选的播放速度
        autoplay: false, // 如果为true,浏览器准备好时开始回放
        muted: false, // 默认情况下静音播放
        loop: false, // 是否视频一结束就重新开始
        preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据,auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
        language: "zh-CN",
        aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值,值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
        fluid: true, // 当true时,Video.js player将拥有流体大小,换句话说,它将按比例缩放以适应其容器
        sources: [
          {
            type: `video/${this.videoType}`, // 类型
            src: this.path, // url地址,在使用本地的资源时,需要用require()引入,否则控制台会报错
          },
        ],
        poster: '', // 设置封面地址
        notSupportedMessage: "此视频暂无法播放,请稍后再试", // 允许覆盖Video.js无法播放媒体源时显示的默认信
        width: 1900,
        controlBar: {
          currentTimeDisplay: true,
          progressControl: true,  // 是否显示进度条
          playbackRateMenuButton: true, // 是否显示调整播放倍速按钮
          timeDivider: true, // 当前时间和持续时间的分隔符
          durationDisplay: true, // 显示持续时间
          remainingTimeDisplay: true, // 是否显示剩余时间功能
          fullscreenToggle: true, // 是否显示全屏按钮
          // volumeControl:true,
        },
      },
    }
  },
  computed: {
  },
  mounted() {
   
  },
  methods: {
    // 视频暂停的
    onPlayerPause(player) {
      // this.$refs.videoPlayer.player.pause() // 暂停
    },
    // 视频播放回调
    onPlayerPlay(player) {
      // this.$refs.videoPlayer.player.play() // 播放

    },
    // 视频播放完
    onPlayerEnd(player) {
      // this.$refs.videoPlayer.player.src(this.path) // 重置进度条复制代码
      console.log(player);
    },
    // DOM元素上的readyState更改导致播放停止
    onPlayerWaiting(player) {
      console.log("播放停止中");
    },
    // 视频已开始播放
    onPlayerPlaying(player) {
      // console.log("开始播放了");
      // console.log(player);
    },
    // 当播放器在当前播放位置下载数据时触发
    onPlayerLoadeddata(player) {
      console.log("开始下载数据");
    },
    // 当前播放位置发生变化时触发
    onPlayerTimeupdate(player) {
      this.currentTime = player.currentTime();
      this.maxTime = this.currentTime > this.maxTime ? this.currentTime : this.maxTime;
    },
    //播放状态改变
    playerStateChanged(playerCurrentState) {
      console.log("播放状态变化了");
    },
  },
  mounted() {
  },
};
</script>
 
<style lang="scss">
.playerBOx {
  width: 100%;
  height: 100%;
  margin: 0 auto;
  position: relative;
}

.vjs-custom-skin>.video-js {
  width: 100% !important;
  height: 100% !important;
}

.video-player {
  width: 100% !important;
  height: 100% !important;
}

.vjs-fluid {
  padding-top: 0 !important;
  background-color: rgba(0, 0, 0, 0.45);
}

.video-js {
  position: static !important;
}

/*播放按钮设置成宽高一致,圆形,居中*/
.vjs-custom-skin>.video-js .vjs-big-play-button {
  background-color: rgba(0, 0, 0, 0.45);
  font-size: 3.5em;
  border-radius: 50%;
  height: 2em !important;
  line-height: 2em !important;
  margin-top: -1em !important;
  margin-left: -1em !important;
  width: 2em !important;
  outline: none;
}

.video-js .vjs-big-play-button .vjs-icon-placeholder:before {
  position: absolute;
  left: 0;
  width: 100%;
  height: 100%;
}

/*control-bar布局时flex,通过order调整剩余时间的位置到进度条右边*/
.vjs-custom-skin>.video-js .vjs-control-bar .vjs-remaining-time {
  order: 3 !important;
}

/*进度条背景轨道*/
.video-js .vjs-slider {
  border-radius: 1em;
}

/*进度条进度*/
.vjs-custom-skin>.video-js .vjs-play-progress,
.vjs-custom-skin>.video-js .vjs-volume-level {
  border-radius: 1em;
}

/*鼠标进入播放器后,播放按钮颜色会变*/
.video-js:hover .vjs-big-play-button,
.vjs-custom-skin>.video-js .vjs-big-play-button:active,
.vjs-custom-skin>.video-js .vjs-big-play-button:focus {
  background-color: rgba(0, 0, 0, 0.4) !important;
}

/*control bar*/
.video-js .vjs-control-bar {
  background-color: rgba(0, 0, 0, 0.2) !important;
}

/*点击按钮时不显示蓝色边框*/
.video-js .vjs-control-bar button {
  outline: none;
}
</style>

注意:使用vue-video-player组件播放视频,视频进度条不能点击不能拖动。点击或者拖动就会重新从头开始播放。

产生原因:

其实就是没有转成字节流,导致不能选择某个视频点

解决方案:让后端响应头添加如下

 二、audio播放音频

<template>
    <div>
        <div class="containeraudioBox">
            <div class="topAudioBox">
            <img src="../assets/close.png" alt="" @click="close">
             </div>
             <div class="audioBox">
            <audio
                class="audio"
                :src="autioPath"
                autoplay="autoplay"
                controls="controls"
                ref="audio"
            >音频</audio>
        </div>
        </div>
       
    </div>
</template>

<script>
    export default {
        props: {
            autioPath: {  // 传入的地址
                type: String,
                default: "",
            },
            },
        data() {
            return {
            }
        },
        methods: {
             //点击关闭弹窗
        close(){
            //   this.playOptions.sources[0].src=''
            this.$refs.audio.pause()// 重置进度条复制代码
            this.$emit('closeVideo',false)
        }, 
            //  //播放组件
            // handlePlay(row) {
            // this.src = row.filePath;
            // this.play();
            // },
            // //播放
            // play() {
            // this.dialogVisible = true;
            // this.$refs.audio.play();
            // },
            // //音频暂停
            // stop() {
            // this.dialogVisible = false;
            // this.$refs.audio.pause();
            // this.$refs.audio.currentTime = 0;
            // }
            },
        mounted () {
            console.log(this.autioPath);;
        },    
    }
</script>

<style lang="scss">
.containeraudioBox{
    width: 100%;
    height:100vh;
}
.containeraudioBox .topAudioBox{
    height: 120px;
    width: 100%;
    position: relative;
    
 }
 .containeraudioBox .topAudioBox img{
    width: 30px;
    height: 30px;
    position: absolute;
    z-index: 9999;
    top: 60px;
    right: 180px;
    cursor: pointer;
 }
.audioBox{
    width: 100%;
    height:calc(100% - 90px);
    position: relative;
}
.audio{
    width: 60%;
    // height: 100%;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
   
}
</style>

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

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

相关文章

web3js连接测试网并完成交易

ps&#xff1a;有个需求是要等待确认交易。写这篇之后&#xff0c;我发现直接用回调函数要等好久好久好久。找到解决方案在这个链接但是有点麻烦。我已经弃用web3&#xff0c;直接使用ethersjs配合infura了&#xff0c;贼快。 本文将介绍如何使用web3js在Sepolia测试网完成一次…

应用案例|亚克力板CNC加工自动化上下料

在现代化制造领域&#xff0c;自动化和智能化已成为提升生产效率、降低成本的关键。针对当前CNC加工过程中亚克力板上下料环节的人工操作问题&#xff0c;富唯智能提出了基于AMR&#xff08;自主移动机器人&#xff09;的复合机器人解决方案。传统的人工取料、放置以及加工完成…

PSINS工具箱函数介绍——gpssimu

关于工具箱 gpssimu是生成GPS的位置和速度信息的函数&#xff0c;在psins240101\base\base1目录下 本文所述的代码需要基于PSINS工具箱&#xff0c;工具箱的讲解&#xff1a; PSINS初学指导&#xff1a;https://blog.csdn.net/callmeup/article/details/137087932 gpssimu是…

【ubuntu24.04】AX210/MT9621/USB网络共享访问无线网络

发现华硕的路由器访问网络经常有问题,比如clash 经常不能正常工作。 即使内网丢包严重? 期望能给台式机增加一个无线网卡访问外网。 我的五代网卡U12, 无法使用wap2企业版的无线网络:【ubuntu24.04】腾达U12 8812au无线网卡成功安装 普通的是没问题的。 对比了一些网卡,wifi…

认知杂谈37

今天分享 有人说的一段争议性的话 I 《别让焦虑困住自己》 嘿&#xff0c;朋友&#xff01;这大热天的&#xff0c;实在是热得让人心里发慌。 I 咱可别再给自己找不痛快啦&#xff0c;赶紧找个舒服的地儿坐下&#xff0c;泡上一杯茶&#xff0c;好好唠唠嗑&#xff0c;给咱的心…

如何克服编程学习中的挫折感:哲学与心理学的启示

在编程学习的道路上&#xff0c;挫折感几乎是每个人都会遇到的障碍。无论是新手还是资深开发者&#xff0c;都会在面对难题时感到沮丧、焦虑甚至是无助。然而&#xff0c;挫折不仅是挑战&#xff0c;更是成长的机会。在这篇博客中&#xff0c;我们将结合哲学与心理学的智慧&…

2024年8月27日(dockerfile应用,创建私有仓库,在企业中分享项目)

一、dockerfile应用 [rootdocker ~]# mkdir http0 [rootdocker ~]# cd http0/ [rootdocker http0]# vim abc.sh [rootdocker http0]# ls abc.sh [rootdocker http0]# vim abc.sh #!/bin/bashrm -rf /run/*httpd*exec /sbin/httpd -D FOREGROUND [rootdocker http0]# echo "…

【大模型理论篇】通用大模型架构分类及技术统一化

1. 背景 国内的 “百模大战” 以及开源大模型的各类评测榜单令人眼花缭乱&#xff0c;极易让人陷入迷茫。面对如此众多的大模型&#xff0c;我们该如何审视和选择呢&#xff1f;本文将从大模型架构的角度&#xff0c;对常见的开源大模型架构进行汇总与分析。资料来源于公开…

创建vue组件时高度为100vh时出现纵向滚动条

<style scoped>.loginBox{padding: 0;width: 100%;min-height: 100vh;background: #c3c4c5;} </style> 原因body自带margin属性 解决方法 在index.html中添加 margin: 0;padding: 0;属性

Spring核心概念复习IOC与DI

Spring IOC概念 控制反转&#xff08;Inversion of Control&#xff09;&#xff1a;这是一种设计原则&#xff0c;用于降低代码之间的耦合度。在传统的编程模式中&#xff0c;对象之间的依赖关系是由对象自身创建和维护的。而在控制反转模式下&#xff0c;对象的创建和依赖关系…

华为eNSP:静态路由配置、浮动路由配置

静态路由&#xff1a; 一、拓扑图 二、路由器配置 2.1&#xff1a;配置接口 R1&#xff1a; [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [r1-GigabitEthernet0/0/0]qu [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 10.1.1.1 24 [r1-GigabitEth…

汽车功能安全--TC3xx LBIST触发时机讨论

目录 1. LBIST架构 2. LBIST寄存器配置 3. LBIST触发时机 LBIST&#xff0c;全称Logic Built-in Self Test。 在TC3xx中&#xff0c;LBIST是一种硬件功能安全机制&#xff0c;目的是为了探测MCU内部逻辑电路的潜伏故障(latent faults)。 从使用者角度来看&#xff0c;只需…

celery笔记1

2 Celery介绍 2.1 Celery是什么 # 1 celery 是一个灵活且可靠的&#xff0c;处理大量消息的分布式系统&#xff0c;可以在多个节点之间处理某个任务-现在干一堆活&#xff0c;如果一个人&#xff0c;需要一件件来做-招了几个人&#xff0c;分别安排不同人干活-并发效果--》同…

如何评估超低排放除尘器的长期运行成本和维护成本?

评估超低排放除尘器的长期运行成本和维护成本涉及多个方面&#xff0c;朗观视觉小编认为&#xff0c;以下是一些关键因素&#xff1a; 初始投资成本&#xff1a;首先考虑设备的购买成本&#xff0c;包括除尘器本身及其所有必要的配件和安装费用。 能源消耗&#xff1a;评估除尘…

智能楼层导视软件:提升楼宇导航体验的技术解决方案

亲爱的技术爱好者、开发者及楼宇管理者们&#xff0c;您是否曾为大型建筑内复杂多变的楼层布局而烦恼&#xff1f;是否希望为访客和员工提供更加直观、高效的导航服务&#xff1f;今天&#xff0c;我们向您介绍我们的最新产品——楼层导视软件&#xff0c;一款专为解决现代楼宇…

全渠道营销:SaaS行业的制胜之道

1. 什么是全渠道营销 全渠道营销&#xff08;Omnichannel Marketing&#xff09;是一种综合性的营销策略&#xff0c;旨在通过整合多个线上和线下渠道&#xff0c;实现销售和品牌推广的目标。这种策略强调在不同渠道间提供一致的品牌体验和无缝的过程&#xff0c;确保消费者在…

ssm 汽车的销售平台---附源码96800

目 录 摘 要 1 绪论 1.1 研究背景与意义 1.2研究开发现状分析 1.3主要研究内容 1.4论文章节安排 2 相关技术介绍 2.1Web编程语言 2.2 MySQL数据库 2.3 SSM框架介绍 3 系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 市场可行性分析 3.1.3 操作可行性分析…

上半年首次扭亏为盈,极兔中报背后藏着超预期成长潜力

快递行业的“黑马”极兔速递&#xff0c;如今跑出了新成绩。在近日公布的2024年中期业绩中&#xff0c;其上半年收入达到48.62亿美元&#xff0c;同比增长20.6%&#xff0c;领跑整个快递行业。 更令人眼前一亮的是利润&#xff0c;极兔上半年净利润首次转正为3102.6万美元&…

打造敏捷开发环境:JNPF低代码平台的实践与探索

在数字化转型的浪潮中&#xff0c;企业对软件开发的敏捷性和效率提出了更高的要求。传统的软件开发模式通常耗时长、成本高昂&#xff0c;难以迅速适应市场变化。低代码平台的出现&#xff0c;为解决这一问题提供了新的视角。本文将探讨如何运用JNPF低代码平台构建敏捷开发环境…

Linux远程管理—SSH协议

SSH协议是远程连接的安全性协议&#xff0c;该协议可以有效防止远程管理过程中的信息泄漏&#xff0c;是西安传输数据加密&#xff0c;能够防止DNS和IP欺骗&#xff0c;传输数据压缩&#xff0c;加快传输速度。 安全验证方法有口令验证和密钥验证两种实现手段&#xff0c;该协…