• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 网神之王 | 发布时间: 2025-6-14 15:29| 查看数: 154| 评论数: 0|帖子模式

    一、vue-video-player


    1、安装及引入
    1. // 安装
    2. npm install vue-video-player@5.0.1 --save
    复制代码
    1. // 在main.js中全局引入
    2. import VideoPlayer from 'vue-video-player/src';
    3. import 'vue-video-player/src/custom-theme.css'
    4. import 'video.js/dist/video-js.css'

    5. Vue.use(VideoPlayer)
    复制代码
    2、一些常见的属性、方法和事件

    属性:

      1. videoWidth
      复制代码
      :返回音频/视频源文件本身的宽度。
      1. videoHeight
      复制代码
      :返回音频/视频源文件本身的高度。
      1. audioTracks
      复制代码
      :返回表示可用音频轨道的 AudioTrackList 对象。
      1. autoplay
      复制代码
      :设置或返回是否在加载完成后随即播放音频/视频。
      1. buffered
      复制代码
      :返回表示音频/视频已缓冲部分的 TimeRanges 对象。
      1. controller
      复制代码
      :返回表示音频/视频当前媒体控制器的 MediaController 对象。
      1. controls
      复制代码
      :设置或返回音频/视频是否显示控件(比如播放/暂停等)。
      1. crossOrigin
      复制代码
      :设置或返回音频/视频的 CORS 设置。
      1. currentSrc
      复制代码
      :返回当前音频/视频的URL。
      1. currentTime
      复制代码
      :设置或返回音频/视频中的当前播放位置(以秒计)。
      1. defaultMuted
      复制代码
      :设置或返回音频/视频默认是否静音。
      1. defaultPlaybackRate
      复制代码
      :设置或返回音频/视频的默认播放速度。
      1. duration
      复制代码
      :返回当前音频/视频的长度(以秒计)。
      1. ended
      复制代码
      :返回音频/视频的播放是否已结束。
      1. error
      复制代码
      :返回表示音频/视频错误状态的 MediaError 对象。
      1. loop
      复制代码
      :设置或返回音频/视频是否应在结束时重新播放。
      1. mediaGroup
      复制代码
      :设置或返回音频/视频所属的组合(用于连接多个音频/视频元素)。
      1. muted
      复制代码
      :设置或返回音频/视频是否静音。
      1. networkState
      复制代码
      :返回音频/视频的当前网络状态。
      1. paused
      复制代码
      :设置或返回音频/视频是否暂停。
      1. playbackRate
      复制代码
      :设置或返回音频/视频播放的速度。
      1. played
      复制代码
      :返回表示音频/视频已播放部分的 TimeRanges 对象。
      1. preload
      复制代码
      :设置或返回音频/视频是否应该在页面加载后进行加载。
      1. readyState
      复制代码
      :返回音频/视频当前的就绪状态。
      1. seekable
      复制代码
      :返回表示音频/视频可寻址部分的 TimeRanges 对象。
      1. seeking
      复制代码
      :返回用户是否正在音频/视频中进行查找。
      1. src
      复制代码
      :设置或返回音频/视频元素的当前来源。
      1. startDate
      复制代码
      :返回表示当前时间偏移的 Date 对象。
      1. textTracks
      复制代码
      :返回表示可用文本轨道的 TextTrackList对象。
      1. videoTracks
      复制代码
      :返回表示可用视频轨道的 VideoTrackList 对象。
      1. volume
      复制代码
      :设置或返回音频/视频的音量。

    方法


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

    事件


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

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

    完整代码如下:
    1. <template>
    2.   <div class="player">
    3.     <video-player
    4.       ref="videoPlayer"
    5.       class="player-video"
    6.       :playsinline="false"
    7.       :options="playOptions"
    8.       @ready="onPlayerReady"
    9.       @play="onPlayerPlay($event)"
    10.       @pause="onPlayerPause($event)"
    11.       @ended="onPlayerEnd($event)"
    12.       @waiting="onPlayerWaiting($event)"
    13.       @playing="onPlayerPlaying($event)"
    14.       @loadeddata="onPlayerLoadeddata($event)"
    15.       @timeupdate="onPlayerTimeupdate($event)"
    16.       @statechanged="playerStateChanged($event)"
    17.     />
    18.   </div>
    19. </template>

    20. <script>
    21. export default {
    22.   props: {
    23.     path: {  // 传入的地址
    24.       type: String,
    25.       default: "",
    26.     },
    27.     lastTime: {  // 传入的上次播放位置
    28.       type: Number,
    29.       default: 0,
    30.     },
    31.   },
    32.   components: {},
    33.   data() {
    34.     return {
    35.       playedTime: this.lastTime,
    36.       currentTime: 0,
    37.       maxTime: 0,
    38.       playOptions: {
    39.         height: "200px",
    40.         width: "100%",
    41.         playbackRates: [1.0], // 可选的播放速度
    42.         autoplay: true, // 如果为true,浏览器准备好时开始回放
    43.         muted: false, // 默认情况下静音播放
    44.         loop: false, // 是否视频一结束就重新开始
    45.         preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据,auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
    46.         language: "zh-CN",
    47.         aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值,值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
    48.         fluid: true, // 当true时,Video.js player将拥有流体大小,换句话说,它将按比例缩放以适应其容器
    49.         sources: [
    50.           {
    51.             type: "video/mp4", // 类型
    52.             src: require("./1.mp4"), // url地址,在使用本地的资源时,需要用require()引入,否则控制台会报错
    53.           },
    54.         ],
    55.         poster: "./gcy-logo-200.png", // 设置封面地址
    56.         notSupportedMessage: "此视频暂无法播放,请稍后再试", // 允许覆盖Video.js无法播放媒体源时显示的默认信息
    57.         controlBar: {
    58.           currentTimeDisplay: true,
    59.           progressControl: true,  // 是否显示进度条
    60.           playbackRateMenuButton: true, // 是否显示调整播放倍速按钮
    61.           timeDivider: true, // 当前时间和持续时间的分隔符
    62.           durationDisplay: true, // 显示持续时间
    63.           remainingTimeDisplay: true, // 是否显示剩余时间功能
    64.           fullscreenToggle: true, // 是否显示全屏按钮
    65.         },
    66.       },
    67.     };
    68.   },
    69.   computed: {
    70.   },
    71.   mounted() {
    72.     this.getData()  // 调用获取地址的接口,然后修改播放器配置中的src属性
    73.   },
    74.   methods: {
    75.     // 准备好了
    76.     onPlayerReady() {
    77.       console.log("准备好了");
    78.     },
    79.     // 视频播放
    80.     onPlayerPlay(player) {
    81.       console.log('播放了');
    82.       console.log(player);
    83.       let playTime = 0;
    84.         if (
    85.           Number(Math.floor(this.playedTime)) ===
    86.           Number(Math.floor(player.duration()))
    87.         ) {
    88.           this.playedTime = 0;
    89.           playTime = 0;
    90.         } else if (
    91.           Number(Math.floor(player.currentTime())) !==
    92.           Number(Math.floor(this.playedTime))
    93.         ) {
    94.           playTime = this.playedTime;
    95.           player.currentTime(playTime)
    96.         }
    97.     },
    98.     // 视频暂停的
    99.     onPlayerPause(player) {
    100.       console.log('暂停中');
    101.       console.log(player);
    102.       this.playedTime = player.currentTime();
    103.     },
    104.     // 视频播放完
    105.     onPlayerEnd(player) {
    106.       console.log('播放结束了');
    107.       console.log(player);
    108.     },
    109.     // DOM元素上的readyState更改导致播放停止
    110.     onPlayerWaiting(player) {
    111.       console.log("播放停止中");
    112.       console.log(player);
    113.     },
    114.     // 视频已开始播放
    115.     onPlayerPlaying(player) {
    116.       console.log("开始播放了");
    117.       console.log(player);
    118.     },
    119.     // 当播放器在当前播放位置下载数据时触发
    120.     onPlayerLoadeddata(player) {
    121.       console.log("开始下载数据");
    122.       console.log(player);
    123.     },
    124.     // 当前播放位置发生变化时触发
    125.     onPlayerTimeupdate(player) {
    126.       console.log("播放位置变化了");
    127.       console.log(player);
    128.       let timeDisplay = player.currentTime();
    129.         if (timeDisplay - this.currentTime > 1) {
    130.             player.currentTime(this.currentTime > this.maxTime ? this.currentTime : this.maxTime);
    131.         }
    132.         this.currentTime = player.currentTime();
    133.         this.maxTime = this.currentTime > this.maxTime ? this.currentTime : this.maxTime;
    134.     },
    135.     //播放状态改变
    136.     playerStateChanged(playerCurrentState) {
    137.       console.log("播放状态变化了");
    138.       console.log(playerCurrentState);
    139.     },
    140.     // 手动暂停视频的播放
    141.     pause() {
    142.       // 视频播放器的方法调用,要使用this.$refs.videoPlayer.player这个对象去调用
    143.       this.$refs.videoPlayer.player.pause()
    144.     }
    145.   },
    146. };
    147. </script>

    148. <style lang="scss" scoped>
    149. </style>
    复制代码
    注意:
    vue-video-player 是基于 video.js 实现的,所以 api 地址:Video.js API docs
    调用的时候使用这个对象进行操作:this.$refs.videoPlayer.player

    二、dplayer


    1、安装
    1. // 安装
    2. npm install dplayer --save
    复制代码
    2、关于不可快进、定位到上次播放位置的基本使用

    完整代码如下:
    1. // 直接在组件中引入

    2. // dplayer.vue

    3. <template>
    4.   <div :id="flag"></div>
    5. </template>

    6. <script>
    7. import DPlayer from "dplayer";

    8. export default {
    9.   props: {
    10.     flag: {  // 每个dplayer的id不可以重复
    11.       type: String,
    12.       default: "",
    13.     },
    14.     lastTime: {  // 上次播放到的时间
    15.       type: Number,
    16.       default: 0,
    17.     },
    18.   },
    19.   data() {
    20.     return {
    21.       dp: null,
    22.       playedTime: this.lastTime,
    23.     };
    24.   },
    25.   mounted() {},
    26.   methods: {
    27.     async init(id) {
    28.       let currentTime = 0;
    29.       let maxTime = 0;
    30.       let res = await api();  // 调用获取视频的地址
    31.       let src = res.data.path;
    32.       this.dp = new DPlayer({
    33.         container: document.getElementById(this.flag),  // 播放器容器元素
    34.         hotkey: true,  // 开启热键,支持快进、快退、音量控制、播放暂停,默认是true
    35.         lang: "zh-cn",  // 可选值:'en'、'zh-cn'、'zh-tw'
    36.         screenshot: false,  // 开启截图,如果开启,视频和视频封面需要允许跨域
    37.         playbackSpeed: [0.75, 1, 1.25, 1.5, 2, 3],  // 可选的视频播放倍速,可以设置自定义的数组
    38.         video: {  // 视频信息,更多可以参考官网:https://dplayer.diygod.dev/zh/guide.html
    39.           url: src,  // 视频地址
    40.         },
    41.       });
    42.       // 监听视频开始播放
    43.       this.dp.on("play", () => {
    44.         let playTime = 0;
    45.         if (
    46.           Number(Math.floor(this.playedTime)) ===
    47.           Number(Math.floor(this.dp.video.duration))
    48.         ) {
    49.           this.playedTime = 0;
    50.           playTime = 0;
    51.         } else if (
    52.           Number(Math.floor(this.dp.video.currentTime)) !==
    53.           Number(Math.floor(this.playedTime))
    54.         ) {
    55.           playTime = this.playedTime;
    56.           this.dp.seek(playTime);
    57.         }
    58.       });
    59.       // 监听视频暂停
    60.       this.dp.on("pause", () => {
    61.         this.playedTime = this.dp.video.currentTime;
    62.       });
    63.       // 设置不可以快进(timeupdate:当前播放位置更改时触发)
    64.       this.dp.on("timeupdate", () => {
    65.         let timeDisplay = this.dp.video.currentTime;
    66.         if (timeDisplay - currentTime > 1) {
    67.           this.dp.video.currentTime =
    68.             currentTime > maxTime ? currentTime : maxTime;
    69.           this.dp.notice("禁止快进", 2000);
    70.         }
    71.         currentTime = this.dp.video.currentTime;
    72.         maxTime = currentTime > maxTime ? currentTime : maxTime;
    73.       });
    74.       // 快进的提示,在禁止快进的提醒存在时不显示
    75.       this.dp.on("notice_show", function (e) {
    76.         var text = e.innerHTML;
    77.         if (
    78.           "禁止快进" != text &&
    79.           (text.indexOf("快进") > -1 || text.indexOf("快退") > -1)
    80.         ) {
    81.           e.style.display = "none";
    82.         }
    83.       });
    84.     },
    85.   },
    86. };
    87. </script>

    88. <style lang="scss" scoped>
    89. </style>
    复制代码
    想要了解更多的功能可以参考dplayer的官网:DPlayer

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    来源:https://www.jb51.net/javascript/3398973kr.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表