uniapp缓存音视频(安卓&IOS)

使用场景/需求:

在App中,有时候需要缓存一些数据,比如启动页启动视频,启动图片等,这些数据在每次启动App时加载比较耗时,体验不好,如果缓存起来,下次启动App时可以直接读取缓存数据,提高启动速度。

解决方案:

Html5+提供了plus中的Io模块,可以用来实现缓存,可以将数据存储在本地,在下次进入App时,可以直接读取缓存数据。

注意事项:

  • 缓存数据在App卸载、清除App数据、在终端文件管理器删除缓存文件后,需要重新判断是否进行获取。
  • 也可以仅在WIFI下,或其他场景下进行操作。
  • 本文不对plus.io模块进行深入介绍,具体使用方法请参考文末官方文档链接。

步骤:

1. 在App.vue中,判断是否进行缓存操作,如果需要缓存,则进行如下操作:

先下载视频数据到终端,后进行缓存操作

javascript 复制代码
onLaunch: function () {
    // #ifdef APP-PLUS
    // 获取视频下载地址
    let videoUrl = 'http://www.xxx.com/xxx.mp4'

    // 缓存数据存放目录
     let saveStartPageFilePath = "startPageFileCache"

    // 创建下载任务(含缓存步骤)
    let downloadTak = plus.downloader.createDownload(videoUrl, {}, function(d, status){
        // 下载完成
        if(status == 200){
        console.log("Download success: " + d.filename);
        // 将下载的视频数据转换为本地文件路径
        fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename);

        // 执行缓存
        // plus.io.PRIVATE_DOC:为本App私有文件夹
        plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) {
            // 可通过fs操作PRIVATE_DOC文件系统
            // 没有saveStartPageFilePath路径,则创建
            fs.root.getFile(saveStartPageFilePath, {create: true}, function( fileEntry ) {
            // 可通过fileEntry操作文件
            fileEntry.createWriter( function( fileWriter ) {
                // 开始写入到saveStartPageFilePath
                fileWriter.write(fileSaveUrl);
                // 可通过fileWriter操作文件
                // 写入完成事件
                fileWriter.onwrite = function( e ) {
                    console.log( 'Write completed.' );
                    // 存入Strorage,当前视频名称和上次视频名称(如果有上次)
                    uni.setStorageSync('startPageFileCache', {name: saveStartPageFilePath, oldName: cacheStatus.name})
                };
                // 写入失败事件
                fileWriter.onerror = function( e ) {
                    console.log( 'Write failed:'+ e.toString() );
                }
            })
            })
        }, function ( e ) {
            console.log( "Request file system failed: " + e.message)
        } );
        }else{
        console.log("Download failed: " + status);
        }
    });


    // 执行下载任务
    downloadTak.setRequestHeader('response-type', 'bolb')
    downloadTak.start();
  // #endif

2. 在启动视频页面中: 读取缓存数据,进行播放

判断是否已经存在当前启动视频的缓存,如果存在,则直接读取缓存数据进行播放、展示,如果不存在,则进直接进入App首页

javascript 复制代码
// #ifdef APP-PLUS
// 获取缓存数据
    readCache(item) {
      let that = this
      let cacheStatus = uni.getStorageSync('startPageFileCache')
      if (!cacheStatus) {
        // 直接跳转会跳不过去
        setTimeout(() => {
          uni.switchTab({url: '/pages/index/index'})
        }, 50)
      } else {
        // 读取App私有文件夹
        plus.io.requestFileSystem(plus.io.PRIVATE_DOC, function (fs) {
          // 获取缓存时候存储的名称
          fs.root.getFile(cacheStatus.name, {create: false}, function (fileEntry) {
            fileEntry.file(function (file) {
              var fileReader = new plus.io.FileReader();
              fileReader.readAsText(file, "UTF-8");
              fileReader.onloadend = function () {
                // 缓存视频文件路径,可以直接拿到video中播放
                console.log(fileReader.result)
                that.playUrl = fileReader.result
              }
            })
          })
        }, function (e) {
          console.log("Request file system failed: " + e.message)
        });
      }
    }
// #endif

3. 删除旧的缓存视频数据

在后台进行启动视频替换后,删除旧的缓存视频数据,防止缓存数据过多占用空间。 在首页进行删除操作, 已在第一步缓存步骤中记录了新旧视频名称,再和接口对比可放心删除指定文件。

javascript 复制代码
// #ifdef APP-PLUS
    removeCache() {
      let cacheStatus = uni.getStorageSync('startPageFileCache')
      console.log(cacheStatus)
      if (cacheStatus && cacheStatus.oldName) {
        if (cacheStatus.oldName === cacheStatus.name) {
          console.log('新旧视频一致, 不删除')
          return
        }
        console.log('执行删除缓存..')
        plus.io.requestFileSystem( plus.io.PRIVATE_DOC, function( fs ) {
          let name = cacheStatus.oldName.split('/')
          let dirPath = fs.root.toURL() + '/' + name[0] + '/' + name[1]
          console.log(dirPath, "<<<dir")
          plus.io.resolveLocalFileSystemURL(dirPath, function(entry) {
            console.log(entry)
            //读取这个目录对象
            var directoryReader = entry.createReader();
            //读取这个目录下的所有文件
            directoryReader.readEntries(function(entries) {
              console.log("entries", entries)
              if (entries.length > 0) {
                entry.removeRecursively(function (entry) {
                      console.log("删除成功")
                    },
                    function (e) {
                      console.log("删除失败")
                    })
              } else {
                console.log('缓存不存在')
              }
            })
          })
        })
      }
    }
// #endif

以上,基本是Uniapp执行缓存,读取使用缓存,删除缓存的代码; 可以根据此笔记,进行相关的开发。

如有其它疑问,需要作者的帮助,随时联系(有偿)

联系邮箱:zhanghaoran@zhanghaoran.ren

html5+地址:www.html5plus.org/doc/zh_cn/i...

相关推荐
寻找沙漠的人26 分钟前
前端知识补充—CSS
前端·css
GISer_Jing37 分钟前
2025前端面试热门题目——计算机网络篇
前端·计算机网络·面试
m0_7482455239 分钟前
吉利前端、AI面试
前端·面试·职场和发展
理想不理想v1 小时前
webpack最基础的配置
前端·webpack·node.js
pubuzhixing1 小时前
开源白板新方案:Plait 同时支持 Angular 和 React 啦!
前端·开源·github
带电的小王1 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
2401_857600951 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js
2401_857600951 小时前
数字时代的医疗挂号变革:SSM+Vue 系统设计与实现之道
前端·javascript·vue.js
GDAL1 小时前
vue入门教程:组件透传 Attributes
前端·javascript·vue.js
梦想平凡1 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle