当前位置: 代码网 > it编程>编程语言>Javascript > Vue实现视频播放vue-video-player、dplayer方式

Vue实现视频播放vue-video-player、dplayer方式

2025年04月24日 Javascript 我要评论
一、vue-video-player1、安装及引入// 安装npm install vue-video-player@5.0.1 --save// 在main.js中全局引入import videop

一、vue-video-player

1、安装及引入

// 安装
npm install vue-video-player@5.0.1 --save
// 在main.js中全局引入
import videoplayer from 'vue-video-player/src';
import 'vue-video-player/src/custom-theme.css'
import 'video.js/dist/video-js.css'

vue.use(videoplayer)

2、一些常见的属性、方法和事件

属性:

  • videowidth:返回音频/视频源文件本身的宽度。
  • videoheight:返回音频/视频源文件本身的高度。
  • audiotracks:返回表示可用音频轨道的 audiotracklist 对象。
  • autoplay:设置或返回是否在加载完成后随即播放音频/视频。
  • buffered:返回表示音频/视频已缓冲部分的 timeranges 对象。
  • controller:返回表示音频/视频当前媒体控制器的 mediacontroller 对象。
  • controls:设置或返回音频/视频是否显示控件(比如播放/暂停等)。
  • crossorigin:设置或返回音频/视频的 cors 设置。
  • currentsrc:返回当前音频/视频的url。
  • currenttime:设置或返回音频/视频中的当前播放位置(以秒计)。
  • defaultmuted:设置或返回音频/视频默认是否静音。
  • defaultplaybackrate:设置或返回音频/视频的默认播放速度。
  • duration:返回当前音频/视频的长度(以秒计)。
  • ended:返回音频/视频的播放是否已结束。
  • error:返回表示音频/视频错误状态的 mediaerror 对象。
  • loop:设置或返回音频/视频是否应在结束时重新播放。
  • mediagroup:设置或返回音频/视频所属的组合(用于连接多个音频/视频元素)。
  • muted:设置或返回音频/视频是否静音。
  • networkstate:返回音频/视频的当前网络状态。
  • paused:设置或返回音频/视频是否暂停。
  • playbackrate:设置或返回音频/视频播放的速度。
  • played:返回表示音频/视频已播放部分的 timeranges 对象。
  • preload:设置或返回音频/视频是否应该在页面加载后进行加载。
  • readystate:返回音频/视频当前的就绪状态。
  • seekable:返回表示音频/视频可寻址部分的 timeranges 对象。
  • seeking:返回用户是否正在音频/视频中进行查找。
  • src:设置或返回音频/视频元素的当前来源。
  • startdate:返回表示当前时间偏移的 date 对象。
  • texttracks:返回表示可用文本轨道的 texttracklist对象。
  • videotracks:返回表示可用视频轨道的 videotracklist 对象。
  • volume:设置或返回音频/视频的音量。

方法

  • addtexttrack():向音频/视频添加新的文本轨道。
  • canplaytype():检测浏览器是否能播放指定的音频/视频类型。
  • load():重新加载音频/视频元素。
  • play():开始播放音频/视频。
  • pause():暂停当前播放的音频/视频。

事件

  • abort:当音频/视频的加载已放弃时触发。
  • canplay:当浏览器可以开始播放音频/视频时触发。
  • canplaythrough:当浏览器可在不因缓冲而停顿的情况下进行播放时触发。
  • durationchange:当音频/视频的时长已更改时触发。
  • emptied:当目前的播放列表为空时触发。
  • ended:当目前的播放列表已结束时触发。
  • error:当在音频/视频加载期间发生错误时触发。
  • loadeddata:当浏览器已加载音频/视频的当前帧时触发。
  • loadedmetadata:当浏览器已加载音频/视频的元数据时触发。
  • loadstart:当浏览器开始查找音频/视频时触发。
  • pause:当音频/视频已暂停时触发。
  • play:当音频/视频已开始或不再暂停时触发。
  • playing:当音频/视频在因缓冲而暂停或停止后已就绪时触发。
  • progress:当浏览器正在下载音频/视频时触发。
  • ratechange:当音频/视频的播放速度已更改时触发。
  • seeked:当用户已移动/跳跃到音频/视频中的新位置时触发。
  • seeking:当用户开始移动/跳跃到音频/视频中的新位置时触发。
  • stalled:当浏览器尝试获取媒体数据,但数据不可用时触发。
  • suspend:当浏览器刻意不获取媒体数据时触发。
  • timeupdate:当目前的播放位置已更改时触发。
  • volumechange:当音量已更改时触发。
  • waiting:当视频由于需要缓冲下一帧而停止时触发。

3、关于不可快进、定位到上次播放位置的基本使用

完整代码如下:

<template>
  <div class="player">
    <video-player
      ref="videoplayer"
      class="player-video"
      :playsinline="false"
      :options="playoptions"
      @ready="onplayerready"
      @play="onplayerplay($event)"
      @pause="onplayerpause($event)"
      @ended="onplayerend($event)"
      @waiting="onplayerwaiting($event)"
      @playing="onplayerplaying($event)"
      @loadeddata="onplayerloadeddata($event)"
      @timeupdate="onplayertimeupdate($event)"
      @statechanged="playerstatechanged($event)"
    />
  </div>
</template>

<script>
export default {
  props: {
    path: {  // 传入的地址
      type: string,
      default: "",
    },
    lasttime: {  // 传入的上次播放位置
      type: number,
      default: 0,
    },
  },
  components: {},
  data() {
    return {
      playedtime: this.lasttime,
      currenttime: 0,
      maxtime: 0,
      playoptions: {
        height: "200px",
        width: "100%",
        playbackrates: [1.0], // 可选的播放速度
        autoplay: true, // 如果为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/mp4", // 类型
            src: require("./1.mp4"), // url地址,在使用本地的资源时,需要用require()引入,否则控制台会报错
          },
        ],
        poster: "./gcy-logo-200.png", // 设置封面地址
        notsupportedmessage: "此视频暂无法播放,请稍后再试", // 允许覆盖video.js无法播放媒体源时显示的默认信息
        controlbar: {
          currenttimedisplay: true,
          progresscontrol: true,  // 是否显示进度条
          playbackratemenubutton: true, // 是否显示调整播放倍速按钮
          timedivider: true, // 当前时间和持续时间的分隔符
          durationdisplay: true, // 显示持续时间
          remainingtimedisplay: true, // 是否显示剩余时间功能
          fullscreentoggle: true, // 是否显示全屏按钮
        },
      },
    };
  },
  computed: {
  },
  mounted() {
    this.getdata()  // 调用获取地址的接口,然后修改播放器配置中的src属性
  },
  methods: {
    // 准备好了
    onplayerready() {
      console.log("准备好了");
    },
    // 视频播放
    onplayerplay(player) {
      console.log('播放了');
      console.log(player);
      let playtime = 0;
        if (
          number(math.floor(this.playedtime)) ===
          number(math.floor(player.duration()))
        ) {
          this.playedtime = 0;
          playtime = 0;
        } else if (
          number(math.floor(player.currenttime())) !==
          number(math.floor(this.playedtime))
        ) {
          playtime = this.playedtime;
          player.currenttime(playtime)
        }
    },
    // 视频暂停的
    onplayerpause(player) {
      console.log('暂停中');
      console.log(player);
      this.playedtime = player.currenttime();
    },
    // 视频播放完
    onplayerend(player) {
      console.log('播放结束了');
      console.log(player);
    },
    // dom元素上的readystate更改导致播放停止
    onplayerwaiting(player) {
      console.log("播放停止中");
      console.log(player);
    },
    // 视频已开始播放
    onplayerplaying(player) {
      console.log("开始播放了");
      console.log(player);
    },
    // 当播放器在当前播放位置下载数据时触发
    onplayerloadeddata(player) {
      console.log("开始下载数据");
      console.log(player);
    },
    // 当前播放位置发生变化时触发
    onplayertimeupdate(player) {
      console.log("播放位置变化了");
      console.log(player);
      let timedisplay = player.currenttime();
        if (timedisplay - this.currenttime > 1) {
            player.currenttime(this.currenttime > this.maxtime ? this.currenttime : this.maxtime);
        }
        this.currenttime = player.currenttime();
        this.maxtime = this.currenttime > this.maxtime ? this.currenttime : this.maxtime;
    },
    //播放状态改变
    playerstatechanged(playercurrentstate) {
      console.log("播放状态变化了");
      console.log(playercurrentstate);
    },
    // 手动暂停视频的播放
    pause() {
      // 视频播放器的方法调用,要使用this.$refs.videoplayer.player这个对象去调用
      this.$refs.videoplayer.player.pause()
    }
  },
};
</script>

<style lang="scss" scoped>
</style>

注意:

vue-video-player 是基于 video.js 实现的,所以 api 地址:video.js api docs

调用的时候使用这个对象进行操作:this.$refs.videoplayer.player

二、dplayer

1、安装

// 安装
npm install dplayer --save

2、关于不可快进、定位到上次播放位置的基本使用

完整代码如下:

// 直接在组件中引入

// dplayer.vue

<template>
  <div :id="flag"></div>
</template>

<script>
import dplayer from "dplayer";

export default {
  props: {
    flag: {  // 每个dplayer的id不可以重复
      type: string,
      default: "",
    },
    lasttime: {  // 上次播放到的时间
      type: number,
      default: 0,
    },
  },
  data() {
    return {
      dp: null,
      playedtime: this.lasttime,
    };
  },
  mounted() {},
  methods: {
    async init(id) {
      let currenttime = 0;
      let maxtime = 0;
      let res = await api();  // 调用获取视频的地址
      let src = res.data.path;
      this.dp = new dplayer({
        container: document.getelementbyid(this.flag),  // 播放器容器元素
        hotkey: true,  // 开启热键,支持快进、快退、音量控制、播放暂停,默认是true
        lang: "zh-cn",  // 可选值:'en'、'zh-cn'、'zh-tw'
        screenshot: false,  // 开启截图,如果开启,视频和视频封面需要允许跨域 
        playbackspeed: [0.75, 1, 1.25, 1.5, 2, 3],  // 可选的视频播放倍速,可以设置自定义的数组
        video: {  // 视频信息,更多可以参考官网:https://dplayer.diygod.dev/zh/guide.html
          url: src,  // 视频地址
        },
      });
      // 监听视频开始播放
      this.dp.on("play", () => {
        let playtime = 0;
        if (
          number(math.floor(this.playedtime)) ===
          number(math.floor(this.dp.video.duration))
        ) {
          this.playedtime = 0;
          playtime = 0;
        } else if (
          number(math.floor(this.dp.video.currenttime)) !==
          number(math.floor(this.playedtime))
        ) {
          playtime = this.playedtime;
          this.dp.seek(playtime);
        }
      });
      // 监听视频暂停
      this.dp.on("pause", () => {
        this.playedtime = this.dp.video.currenttime;
      });
      // 设置不可以快进(timeupdate:当前播放位置更改时触发)
      this.dp.on("timeupdate", () => {
        let timedisplay = this.dp.video.currenttime;
        if (timedisplay - currenttime > 1) {
          this.dp.video.currenttime =
            currenttime > maxtime ? currenttime : maxtime;
          this.dp.notice("禁止快进", 2000);
        }
        currenttime = this.dp.video.currenttime;
        maxtime = currenttime > maxtime ? currenttime : maxtime;
      });
      // 快进的提示,在禁止快进的提醒存在时不显示
      this.dp.on("notice_show", function (e) {
        var text = e.innerhtml;
        if (
          "禁止快进" != text &&
          (text.indexof("快进") > -1 || text.indexof("快退") > -1)
        ) {
          e.style.display = "none";
        }
      });
    },
  },
};
</script>

<style lang="scss" scoped>
</style>

想要了解更多的功能可以参考dplayer的官网:dplayer

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com