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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:57:20