【Vue】vue3 video 保存视频进度,每次进入加载上次的视频进度

  1. 使用 localStorage 存储每个视频的播放进度
  2. 在组件加载时恢复上次的播放进度
  3. 在视频播放过程中实时保存进度
  4. 在组件卸载前保存最终进度
  5. 使用 timeupdate 事件来监听视频播放进度的变化

在模板中为视频元素添加事件监听:

<video
  loop
  autoplay
  controls
  :id="`video_${index}`"
  :src="getVideoSrc(video.src)"
  class="video"
  @loadedmetadata="loadVideoProgress"></video>
// ... 其他导入保持不变
import { reactive, ref, onMounted, onBeforeUnmount } from 'vue'

// ... paramsList 和 params 保持不变

// 添加视频进度保存的常量
const VIDEO_PROGRESS_KEY = 'VIDEO_PROGRESS'

const videoList = ref([
  {
    title: '大范围流场图',
    src: 'dfwlct',
    isPlaying: true,
    progress: 0, // 添加进度属性
  },
  {
    title: '工程局部流场图',
    src: 'gcjblct',
    isPlaying: true,
    progress: 0, // 添加进度属性
  },
])

// 加载保存的视频进度
const loadVideoProgress = () => {
  const savedProgress = localStorage.getItem(VIDEO_PROGRESS_KEY)
  if (savedProgress) {
    const progressData = JSON.parse(savedProgress)
    videoList.value.forEach((video, index) => {
      if (progressData[video.src]) {
        video.progress = progressData[video.src]
        const videoElement = document.getElementById(`video_${index}`) as HTMLVideoElement
        if (videoElement) {
          videoElement.currentTime = video.progress
        }
      }
    })
  }
}

// 保存视频进度
const saveVideoProgress = () => {
  const progressData = {}
  videoList.value.forEach((video, index) => {
    const videoElement = document.getElementById(`video_${index}`) as HTMLVideoElement
    if (videoElement) {
      progressData[video.src] = videoElement.currentTime
    }
  })
  localStorage.setItem(VIDEO_PROGRESS_KEY, JSON.stringify(progressData))
}

// 监听视频时间更新
const handleTimeUpdate = (index: number) => {
  const videoElement = document.getElementById(`video_${index}`) as HTMLVideoElement
  if (videoElement) {
    videoList.value[index].progress = videoElement.currentTime
    saveVideoProgress()
  }
}

// 组件挂载时加载进度
onMounted(() => {
  loadVideoProgress()
  // 为每个视频添加时间更新事件监听
  videoList.value.forEach((_, index) => {
    const videoElement = document.getElementById(`video_${index}`)
    if (videoElement) {
      videoElement.addEventListener('timeupdate', () => handleTimeUpdate(index))
    }
  })
})

// 组件卸载前移除事件监听
onBeforeUnmount(() => {
  videoList.value.forEach((_, index) => {
    const videoElement = document.getElementById(`video_${index}`)
    if (videoElement) {
      videoElement.removeEventListener('timeupdate', () => handleTimeUpdate(index))
    }
  })
  saveVideoProgress()
})

// ... 其他代码保持不变

这样,用户每次进入页面时都会自动加载上次观看的进度。进度信息会在以下情况下保存:

  • 视频播放过程中
  • 用户暂停视频时
  • 用户离开页面时
### Vue 实现视频播放进度条拖动功能 在 Vue 中实现带有进度条拖动功能的视频播放器可以借助 `vue-video-player` 插件。此插件不仅能够提供跨平台一致性的用户体验,还支持多种高级特性如倍速播放、默认全屏等[^1]。 #### 安装 vue-video-player 插件 首先,在项目中安装所需的依赖包: ```bash npm install vue-video-player --save ``` 接着按照官方文档配置 Webpack 或其他构建工具以加载必要的样式文件。 #### 创建 VideoPlayer 组件 创建一个新的组件用于封装视频播放逻辑与UI界面设计: ```html <template> <div class="video-container"> <!-- 使用 video.js 的 player --> <video-player ref="player" :options="playerOptions" @ready="onPlayerReady" @play="onPlayerPlay" @pause="onPlayerPause" @timeupdate="onTimeUpdate"/> <!-- 自定义进度条 --> <input type="range" min="0" max="1" step="0.01" v-model="progress" @change="seekToProgress()"> </div> </template> <script> export default { data() { return { progress: 0, playerOptions: { sources: [{ src: &#39;https://yourdomain.com/path/to/video.mp4&#39;, type: "video/mp4" }], autoplay: false, controls: true, // 控制栏可见性 showPlayBtn: true // 是否显示播放/暂停按钮[^2] } }; }, methods: { onPlayerReady(player) {}, onPlayerPlay(event){}, onPlayerPause(event){}, seekToProgress(){ this.$refs.player.currentTime(this.progress * this.$refs.player.duration()); }, onTimeUpdate(event){ const currentTime = event.target.currentTime; const duration = event.target.duration; if (duration > 0 && !isNaN(duration)) { this.progress = currentTime / duration; } } } }; </script> ``` 上述代码展示了如何利用 `vue-video-player` 和 HTML5 `<input>` 元素组合成一个具有基本控制面板(含播放/暂停键)及可拖拽进度条的简易版在线视频播放器。每当用户调整滑块位置时会触发 `@change` 事件并调用 `seekToProgress()` 方法更新当前播放时间;而当媒体资源的时间轴发生变化时,则通过监听 `@timeupdate` 来同步修改视图中的进度指示器状态。 对于更复杂的场景比如需要处理大量数据点的情况,可能还需要考虑性能优化措施,例如分页加载或懒加载策略来提高渲染效率[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值