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

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

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

html 复制代码
<video
  loop
  autoplay
  controls
  :id="`video_${index}`"
  :src="getVideoSrc(video.src)"
  class="video"
  @loadedmetadata="loadVideoProgress"></video>
ts 复制代码
// ... 其他导入保持不变
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()
})

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

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

  • 视频播放过程中
  • 用户暂停视频时
  • 用户离开页面时
相关推荐
鬼手点金2 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
VidDown2 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
软件技术NINI2 小时前
美妆商城html+Css+js 4页
javascript·css·html
蛋蛋的就会顺顺的2 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday2 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室2 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
码艺-Alimjan3 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床3 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
子非鱼a4 小时前
【文件上传】一个普普通通的edu16
前端
美狐美颜SDK开放平台5 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk