You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用Photo Manager读取大视频转Uint8List致应用崩溃求助

解决photo_manager加载大视频OOM崩溃问题

问题根源很明确:originBytes会一次性把整个视频文件读取到内存并转为Uint8List,95MB以上的视频会直接耗尽应用可用内存,触发OutOfMemoryError——哪怕开了largeHeap,也只是延缓崩溃,没法彻底解决大文件的内存占用问题。

以下是可行的解决方案:

1. 改用文件路径替代全量内存加载

photo_manager的AssetEntity提供了获取本地文件路径的方法,直接通过路径操作文件,避免把整个文件塞进内存:

// 获取AssetEntity的本地路径
String? filePath = await selectedFile.file;
if (filePath != null) {
  File videoFile = File(filePath);
  // 后续操作直接基于File对象,而非全量Uint8List
}

2. 分块读取文件流(替代originBytes)

如果确实需要处理字节数据,不要用originBytes,而是通过File的流来分块读取:

if (filePath != null) {
  Stream<List<int>> fileStream = File(filePath).openRead();
  await for (var chunk in fileStream) {
    // 处理每一块字节数据,比如分块上传、写入本地缓存等
    processChunk(chunk);
  }
}

3. 根据业务场景针对性优化

  • 视频上传:直接用文件路径创建MultipartFile,比如Dio的上传代码:
    FormData formData = FormData.fromMap({
      'video': await MultipartFile.fromFile(filePath, filename: 'video.mp4'),
    });
    await dio.post('/upload', data: formData);
    
  • 视频帧处理:使用专门的视频处理库(如video_player或ffmpeg_kit_flutter)提取帧,这些库会按需加载视频数据,不会把整个视频读进内存。

4. 彻底放弃全量加载思路

任何把百MB级文件全量加载到内存的操作都是不合理的,不管是图片还是视频,都应该用流或文件路径的方式处理,这是移动端开发的基本内存优化原则。

内容的提问来源于stack exchange,提问作者Jadov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:57:44