当前位置: 首页 > article >正文

【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()
})

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

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

  • 视频播放过程中
  • 用户暂停视频时
  • 用户离开页面时

http://www.kler.cn/a/508961.html

相关文章:

  • 【postgres】sqlite格式如何导入postgres数据库
  • Android渲染Latex公式的开源框架比较
  • 【论文阅读】基于空间相关性与Stacking集成学习的风电功率预测方法
  • 算法面试准备 - 手撕系列第七期 - MLP(利用FashionMNIST数据集)
  • Html5 video标签学习
  • 如何在谷歌浏览器中设置自定义安全警告
  • Linux的几个基本指令
  • 【华为战报】2024年12月 HCIP考试战报!
  • PHP版接口调试工具(自定义GET|POST|COOKIE|HEADER|User Agent|来路Referer)
  • 【20】Word:小许-质量管理-论文❗
  • 免费送源码:Java+ssm+MySQL 图书借阅管理系统的设计与实现 计算机毕业设计原创定制
  • 云部署服务器
  • 【青海省乡镇界】面图层+shp格式arcgis数据+乡镇名称和编码+wgs84坐标无偏移下载内容测评
  • 【React】class组件extends继承原理
  • Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普
  • 使用Python爬虫获取1688网站item_get_company API接口的公司档案信息
  • 自学SpringBoot笔记
  • AIGC与劳动力市场:技术进步与就业结构的重塑
  • LeetCode 热题 100_子集(56_78_中等_C++)(回溯)(ans.clear())
  • Linux操作命令之Nginx基本功能
  • 搜维尔科技:Haption遥操作解决方案特点和优势
  • 实在RPA研究|万字解析实在RPA:概念、原理、优势、场景及与爬虫、python区别
  • User analysis 思考,持续 几秒 如何看待自动驾驶技术的现状与未来:挑战与机遇
  • 游戏引擎学习第82天
  • 网络编程 | UDP套接字通信及编程实现经验教程
  • 利用 Composition API 与 Teleport 实现高效的动态弹窗组件