uni-app plus.io.FileReader读取视频文件会直接卡死(40S以上,120M大小)

uni-app plus.io.FileReader读取视频文件会直接卡死(40S以上,120M大小)

开发环境 版本号 项目创建方式
vue

产品分类

uni小程序SDK

手机系统

iOS

手机系统版本号

iOS 16

手机厂商

苹果

手机机型

iphone 13 pro, iphone 13 mini

页面类型

vue

SDK版本号

4.36

示例代码

plus.io.resolveLocalFileSystemURL(  
  resApp.videoPath,  
  function (entry) {  
    entry.file(  
      function (file) {  
        _this.fileData2 = JSON.stringify(file)  
        var reader = new plus.io.FileReader()  
        reader.readAsDataURL(file)  
        reader.onload = function (e) {  
          _this.fileData1 = e.target.result  
          setTimeout(() => {  
            Toast(`onLoad视频读取文件成功1222:` + _this.fileData1)  
          }, 3000)  
        }  
        reader.onloadend = function (e) {  
          return  
        }  

        reader.onerror = function (e) {  
          Toast(`readeronerror文件失败::${e.target.result}`)  
        }  
      },  
      function (e) {  
        Toast(`读取文件出错2:${JSON.stringify(e)}`)  
        reject(index)  
      }  
    )  
  },  
  function (e) {  
    Toast(`读取文件出错222`)  
  }  
)

操作步骤

选择原生给我的视频文件,然后通过

预期结果

可以读取bas64进行视频文件路径,然后通过plus.io.resolveLocalFileSystemURL方法进行转成base64进行上传

实际结果

无法读取,直接崩了

bug描述

在12promax 可以,在iphone 13 mini 中必现 ,40S以上,120M大小


更多关于uni-app plus.io.FileReader读取视频文件会直接卡死(40S以上,120M大小)的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

感觉就是转成base64太大导致的,请问这种有什么方案吗

更多关于uni-app plus.io.FileReader读取视频文件会直接卡死(40S以上,120M大小)的实战教程也可以访问 https://www.itying.com/category-93-b0.html


顶一手

有解决方案吗

关于uni-app中plus.io.FileReader读取大视频文件卡死的问题分析

这个问题主要是由于iOS设备上使用FileReader读取大文件时性能限制导致的。对于120MB的视频文件,转换为base64会消耗大量内存和CPU资源,特别是在性能较低的设备上(如iPhone 13 mini)更容易出现卡死。

问题原因

  1. 内存压力:将大文件转换为base64会导致内存占用激增,iOS设备可能会强制终止应用
  2. 同步处理:FileReader的readAsDataURL是同步操作,会阻塞主线程
  3. 设备性能差异:iPhone 12 Pro Max有6GB内存,而13 mini只有4GB

解决方案建议

  1. 避免转换大文件为base64

    • 直接上传文件路径而不是base64
    • 使用分片上传方式处理大文件
  2. 使用更高效的文件处理方式

// 使用plus.uploader直接上传文件
plus.uploader.createUpload(url, {
    method: "POST"
}, function(t, status) {
    // 上传回调
}).addFile(filePath, {
    key: "file"
}).start();
回到顶部