Flutter中获取assets目录下MP4文件的时长(秒数)
获取MP4视频时长(秒)的实现方案
在Flutter中,直接通过File访问assets目录下的文件是行不通的——assets是打包在应用包内的资源,需通过rootBundle读取。以下是基于video_player和path_provider库的落地实现:
1. 添加依赖与配置assets
在pubspec.yaml中声明依赖和assets路径:
dependencies: flutter: sdk: flutter video_player: ^2.7.0 path_provider: ^2.0.15 flutter: assets: - assets/test.mp4
2. 实现时长获取方法
import 'package:video_player/video_player.dart'; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:io'; Future<int> getLength() async { // 从assets读取视频字节数据 final assetBytes = await rootBundle.load('assets/test.mp4'); // 创建临时文件供video_player解析 final tempDir = await getTemporaryDirectory(); final tempFile = File('${tempDir.path}/temp_video.mp4'); await tempFile.writeAsBytes(assetBytes.buffer.asUint8List()); // 初始化控制器并提取时长(转成秒) final playerController = VideoPlayerController.file(tempFile); await playerController.initialize(); final durationInSeconds = playerController.value.duration.inSeconds; // 清理资源 await playerController.dispose(); await tempFile.delete(); return durationInSeconds; }
关键注意事项
- 禁止直接用
File('./assets/test.mp4')访问assets资源,必须通过rootBundle.load读取字节流 - 因为
video_player需要文件路径,所以将assets字节写入临时文件是必要步骤 - 方法改为异步返回
Future<int>,所有资源加载、初始化操作都是异步的 - 务必释放控制器并删除临时文件,避免内存泄漏和存储冗余
内容的提问来源于stack exchange,提问作者Kyrill
相关产品推荐
相关产品推荐

