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
相关产品推荐
相关产品推荐

