Vue2使用vue-video-player实现断点续传功能

 更新时间:2025年07月16日 10:29:32   作者:奇妙智能  
断点续传是指在文件传输过程中,如果传输被中断或者发生错误,可以从上一次中断的地方继续传输,而不是从头开始,这对于大文件的传输尤为重要,本文给大家介绍了Vue2使用vue-video-player实现断点续传功能,需要的朋友可以参考下

Vue2中使用vue-video-player实现断点续传功能

实现原理

断点续传的核心在于:

  1. 监听视频播放进度并定期保存
  2. 重新加载页面或切换回视频时恢复上次播放位置

具体实现步骤

1. 安装依赖

npm install vue-video-player --save
# 或使用yarn
yarn add vue-video-player

2. 组件实现

<template>
  <div class="video-container">
    <video-player
      ref="videoPlayer"
      class="video-player"
      :options="playerOptions"
      @timeupdate="onTimeUpdate"
      @play="onPlay"
      @pause="onPause"
      @ended="onEnded"
    ></video-player>
  </div>
</template>

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

export default {
  components: {
    videoPlayer
  },
  data() {
    return {
      playerOptions: {
        autoplay: false,
        controls: true,
        sources: [{
          type: 'video/mp4',
          src: 'https://example.com/video.mp4'
        }],
        // 其他配置...
      },
      saveProgressInterval: null,
      lastSaveTime: 0
    }
  },
  computed: {
    videoSrc() {
      return this.playerOptions.sources[0].src
    }
  },
  mounted() {
    // 初始化播放器后加载保存的进度
    this.$nextTick(() => {
      this.loadSavedProgress()
      
      // 设置进度保存定时器(每5秒保存一次)
      this.saveProgressInterval = setInterval(() => {
        this.saveCurrentProgress()
      }, 5000)
    })
  },
  beforeDestroy() {
    // 组件销毁前清除定时器
    if (this.saveProgressInterval) {
      clearInterval(this.saveProgressInterval)
    }
  },
  watch: {
    // 监听视频源变化,加载新视频的进度
    videoSrc(newSrc) {
      this.$nextTick(() => {
        this.loadSavedProgress()
      })
    }
  },
  methods: {
    onTimeUpdate() {
      // 可选:实时更新进度,但频繁触发可能影响性能
      // 实际应用中可能不需要每次timeupdate都保存
    },
    onPlay() {
      // 视频开始播放时开始保存进度
      this.startSaveProgress()
    },
    onPause() {
      // 视频暂停时保存当前进度
      this.saveCurrentProgress()
    },
    onEnded() {
      // 视频播放结束时清除保存的进度
      this.clearSavedProgress()
    },
    startSaveProgress() {
      // 开始播放时启动定时保存
      if (!this.saveProgressInterval) {
        this.saveProgressInterval = setInterval(() => {
          this.saveCurrentProgress()
        }, 5000)
      }
    },
    saveCurrentProgress() {
      const currentTime = this.$refs.videoPlayer.player.currentTime()
      // 避免过于频繁保存(小于1秒的播放不保存)
      if (currentTime - this.lastSaveTime >= 1) {
        localStorage.setItem(`video-progress-${this.videoSrc}`, currentTime.toString())
        this.lastSaveTime = currentTime
      }
    },
    loadSavedProgress() {
      const savedTime = localStorage.getItem(`video-progress-${this.videoSrc}`)
      if (savedTime) {
        this.$nextTick(() => {
          this.$refs.videoPlayer.player.currentTime(parseFloat(savedTime))
        })
      }
    },
    clearSavedProgress() {
      localStorage.removeItem(`video-progress-${this.videoSrc}`)
    }
  }
}
</script>

<style scoped>
.video-container {
  width: 100%;
  max-width: 800px;
  margin: 0 auto;
}
.video-player {
  width: 100%;
  height: 0;
  padding-top: 56.25%; /* 16:9比例 */
  position: relative;
}
</style>

注意事项

​存储介质选择​​:

  • 使用localStorage适合单机应用
  • 如需跨设备同步,应考虑服务器端存储

​进度保存频率​​:

  • 不要过于频繁保存(如每秒多次),以免影响性能
  • 建议至少间隔1秒保存一次

​不同视频源处理​​:

  • 切换视频源时要清除旧视频的进度记录
  • 使用唯一的键名标识不同视频的进度(如video-progress-${src})

​页面关闭前保存​​:

mounted() {
  window.addEventListener('beforeunload', this.handleBeforeUnload)
},
beforeDestroy() {
  window.removeEventListener('beforeunload', this.handleBeforeUnload)
},
methods: {
  handleBeforeUnload() {
    this.saveCurrentProgress()
  }
}
  • 可以监听beforeunload事件确保进度保存

​大视频文件处理​​:

  • 对于非常大的视频,可以考虑只保存关键点位置
  • 或增加保存间隔以减少存储和处理压力

​错误处理​​:

  • 添加try-catch处理localStorage可能的异常
  • 考虑localStorage容量限制(通常5MB左右)

这种实现方式简单有效,适用于大多数需要断点续传功能的视频播放场景。

到此这篇关于Vue2使用vue-video-player实现断点续传功能的文章就介绍到这了,更多相关Vue2 vue-video-player断点续传内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vscode vue 文件模板的配置方法

    vscode vue 文件模板的配置方法

    这篇文章主要介绍了vscode vue 文件模板的配置方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Element el-tag标签图文实例详解

    Element el-tag标签图文实例详解

    现在好多应用场景里会有一些需要给文章打标签等类似的操作,下面这篇文章主要给大家介绍了关于Element el-tag标签的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • vue实现拖拽小图标

    vue实现拖拽小图标

    这篇文章主要为大家详细介绍了vue实现拖拽小图标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 详解在不使用ssr的情况下解决Vue单页面SEO问题

    详解在不使用ssr的情况下解决Vue单页面SEO问题

    这篇文章主要介绍了在不使用ssr的情况下解决Vue单页面SEO问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • vue点击标签切换选中及互相排斥操作

    vue点击标签切换选中及互相排斥操作

    这篇文章主要介绍了vue点击标签切换选中及互相排斥操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue中关于click.stop的用法

    vue中关于click.stop的用法

    这篇文章主要介绍了vue中关于click.stop的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Vue插件之滑动验证码用法详解

    Vue插件之滑动验证码用法详解

    这篇文章主要介绍了Vue插件之滑动验证码用法,结合实例形式详细分析了Vue滑动验证码插件相关使用方法与操作注意事项,需要的朋友可以参考下
    2020-04-04
  • 如何在vue3中使用jsx语法

    如何在vue3中使用jsx语法

    这篇文章主要介绍了在vue3中使用jsx语法,下面主要通过对比jsx和template不同语法,来实现同样的功能,需要的朋友可以参考下
    2023-03-03
  • 基于Vue3实现列表虚拟滚动效果

    基于Vue3实现列表虚拟滚动效果

    这篇文章主要为大家介绍了如何利用Vue3实现列表虚拟滚动效果,文中的示例代码讲解详细,对我们学习或工作有一定价值,需要的可以参考一下
    2022-04-04
  • Vue 3 中使用 vue-router 进行导航与监听路由变化的操作

    Vue 3 中使用 vue-router 进行导航与监听路由变化的操作

    在Vue3中,通过useRouter和useRoute可以方便地实现页面导航和路由变化监听,useRouter允许进行页面跳转,而useRoute结合watch可以根据路由变化更新组件状态,这些功能为Vue3应用增加了灵活性和响应性,使得路由管理更加高效
    2024-09-09

最新评论