最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue2使用vue-video-player實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能

 更新時(shí)間:2025年07月16日 10:29:32   作者:奇妙智能  
斷點(diǎn)續(xù)傳是指在文件傳輸過(guò)程中,如果傳輸被中斷或者發(fā)生錯(cuò)誤,可以從上一次中斷的地方繼續(xù)傳輸,而不是從頭開(kāi)始,這對(duì)于大文件的傳輸尤為重要,本文給大家介紹了Vue2使用vue-video-player實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能,需要的朋友可以參考下

Vue2中使用vue-video-player實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能

實(shí)現(xiàn)原理

斷點(diǎn)續(xù)傳的核心在于:

  1. 監(jiān)聽(tīng)視頻播放進(jìn)度并定期保存
  2. 重新加載頁(yè)面或切換回視頻時(shí)恢復(fù)上次播放位置

具體實(shí)現(xiàn)步驟

1. 安裝依賴

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

2. 組件實(shí)現(xiàn)

<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() {
    // 初始化播放器后加載保存的進(jìn)度
    this.$nextTick(() => {
      this.loadSavedProgress()
      
      // 設(shè)置進(jìn)度保存定時(shí)器(每5秒保存一次)
      this.saveProgressInterval = setInterval(() => {
        this.saveCurrentProgress()
      }, 5000)
    })
  },
  beforeDestroy() {
    // 組件銷毀前清除定時(shí)器
    if (this.saveProgressInterval) {
      clearInterval(this.saveProgressInterval)
    }
  },
  watch: {
    // 監(jiān)聽(tīng)視頻源變化,加載新視頻的進(jìn)度
    videoSrc(newSrc) {
      this.$nextTick(() => {
        this.loadSavedProgress()
      })
    }
  },
  methods: {
    onTimeUpdate() {
      // 可選:實(shí)時(shí)更新進(jìn)度,但頻繁觸發(fā)可能影響性能
      // 實(shí)際應(yīng)用中可能不需要每次timeupdate都保存
    },
    onPlay() {
      // 視頻開(kāi)始播放時(shí)開(kāi)始保存進(jìn)度
      this.startSaveProgress()
    },
    onPause() {
      // 視頻暫停時(shí)保存當(dāng)前進(jìn)度
      this.saveCurrentProgress()
    },
    onEnded() {
      // 視頻播放結(jié)束時(shí)清除保存的進(jìn)度
      this.clearSavedProgress()
    },
    startSaveProgress() {
      // 開(kāi)始播放時(shí)啟動(dòng)定時(shí)保存
      if (!this.saveProgressInterval) {
        this.saveProgressInterval = setInterval(() => {
          this.saveCurrentProgress()
        }, 5000)
      }
    },
    saveCurrentProgress() {
      const currentTime = this.$refs.videoPlayer.player.currentTime()
      // 避免過(guò)于頻繁保存(小于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>

注意事項(xiàng)

??存儲(chǔ)介質(zhì)選擇??:

  • 使用localStorage適合單機(jī)應(yīng)用
  • 如需跨設(shè)備同步,應(yīng)考慮服務(wù)器端存儲(chǔ)

??進(jìn)度保存頻率??:

  • 不要過(guò)于頻繁保存(如每秒多次),以免影響性能
  • 建議至少間隔1秒保存一次

??不同視頻源處理??:

  • 切換視頻源時(shí)要清除舊視頻的進(jìn)度記錄
  • 使用唯一的鍵名標(biāo)識(shí)不同視頻的進(jìn)度(如video-progress-${src})

??頁(yè)面關(guān)閉前保存??:

mounted() {
  window.addEventListener('beforeunload', this.handleBeforeUnload)
},
beforeDestroy() {
  window.removeEventListener('beforeunload', this.handleBeforeUnload)
},
methods: {
  handleBeforeUnload() {
    this.saveCurrentProgress()
  }
}
  • 可以監(jiān)聽(tīng)beforeunload事件確保進(jìn)度保存

??大視頻文件處理??:

  • 對(duì)于非常大的視頻,可以考慮只保存關(guān)鍵點(diǎn)位置
  • 或增加保存間隔以減少存儲(chǔ)和處理壓力

??錯(cuò)誤處理??:

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

這種實(shí)現(xiàn)方式簡(jiǎn)單有效,適用于大多數(shù)需要斷點(diǎn)續(xù)傳功能的視頻播放場(chǎng)景。

到此這篇關(guān)于Vue2使用vue-video-player實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能的文章就介紹到這了,更多相關(guān)Vue2 vue-video-player斷點(diǎn)續(xù)傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue electron應(yīng)用調(diào)exe程序的實(shí)現(xiàn)步驟

    vue electron應(yīng)用調(diào)exe程序的實(shí)現(xiàn)步驟

    這篇文章主要介紹了vue electron應(yīng)用調(diào)exe程序的實(shí)現(xiàn)步驟,用Python寫了一個(gè)本地服務(wù)編譯成exe程序,在electron程序啟動(dòng)后,自動(dòng)執(zhí)行exe程序,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-02-02
  • vue使用canvas手寫輸入識(shí)別中文

    vue使用canvas手寫輸入識(shí)別中文

    這篇文章主要介紹了vue使用canvas手寫輸入識(shí)別中文,工作時(shí)遇到一些項(xiàng)目如:系統(tǒng)上的輸入法使用不方便,客戶要求做一個(gè)嵌入web網(wǎng)頁(yè)的手寫輸入法。下面我們來(lái)看看文章得具體描述吧
    2021-11-11
  • vue?下載文檔亂碼的解決

    vue?下載文檔亂碼的解決

    這篇文章主要介紹了vue?下載文檔亂碼的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 解決vue-element-admin中配置跨域出現(xiàn)的問(wèn)題

    解決vue-element-admin中配置跨域出現(xiàn)的問(wèn)題

    這篇文章主要介紹了解決vue-element-admin中配置跨域出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 解決ElementUI組件中el-upload上傳圖片不顯示問(wèn)題

    解決ElementUI組件中el-upload上傳圖片不顯示問(wèn)題

    這篇文章主要介紹了解決ElementUI組件中el-upload上傳圖片不顯示問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue組件三大核心概念圖文詳解

    vue組件三大核心概念圖文詳解

    本文主要介紹屬性、事件和插槽這三個(gè)vue基礎(chǔ)概念、使用方法及其容易被忽略的一些重要細(xì)節(jié),感興趣的朋友跟隨小編一起看看吧
    2019-05-05
  • Vue使用Swiper的案例詳解

    Vue使用Swiper的案例詳解

    這篇文章主要介紹了Vue使用Swiper的案例詳解,主要包括引入swiper,創(chuàng)建輪播圖組件CarouselContainer.vue的詳細(xì)代碼,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • vue+el-table點(diǎn)擊表頭實(shí)現(xiàn)改變其當(dāng)前樣式

    vue+el-table點(diǎn)擊表頭實(shí)現(xiàn)改變其當(dāng)前樣式

    這篇文章主要介紹了vue+el-table點(diǎn)擊表頭實(shí)現(xiàn)改變其當(dāng)前樣式問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 如何使用Vue3設(shè)計(jì)實(shí)現(xiàn)一個(gè)Model組件淺析

    如何使用Vue3設(shè)計(jì)實(shí)現(xiàn)一個(gè)Model組件淺析

    v-model在Vue里面是一個(gè)語(yǔ)法糖,數(shù)據(jù)的雙向綁定,本質(zhì)上還是通過(guò) 自定義標(biāo)簽的attribute傳遞和接受,下面這篇文章主要給大家介紹了關(guān)于如何使用Vue3設(shè)計(jì)實(shí)現(xiàn)一個(gè)Model組件的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • vue.js父組件使用外部對(duì)象的方法示例

    vue.js父組件使用外部對(duì)象的方法示例

    在我們?nèi)粘i_(kāi)發(fā)中經(jīng)常因?yàn)樗季S定式,我們會(huì)犯一些奇怪的錯(cuò)誤,有時(shí)候看似簡(jiǎn)單的問(wèn)題卻給出了復(fù)雜的解決方案。下面這篇文章主要介紹了vue.js父組件使用外部對(duì)象的方法,這個(gè)看似簡(jiǎn)單卻繞了一些彎路的問(wèn)題,有必要和大家分享下,需要的朋友可以參考學(xué)習(xí),下面來(lái)看看吧。
    2017-04-04

最新評(píng)論

云浮市| 临澧县| 甘孜| 京山县| 北安市| 朝阳区| 凉城县| 河源市| 七台河市| 都江堰市| 二连浩特市| 湘乡市| 务川| 左贡县| 双鸭山市| 扎赉特旗| 绥江县| 宽甸| 深泽县| 滨海县| 宁海县| 罗源县| 胶州市| 长沙县| 临沂市| 内黄县| 安仁县| 广丰县| 洛阳市| 阳东县| 陵川县| 布尔津县| 上犹县| 米脂县| 金川县| 思南县| 叙永县| 桃江县| 新绛县| 岳阳县| 皋兰县|