Flutter中如何读取Assets下的文本文件并传入FFmpeg命令
解决Flutter中Assets目录下mylist.txt传入FFmpeg的问题
Flutter的Assets文件打包在应用安装包内,FFmpeg无法直接访问该路径,必须先将Assets中的mylist.txt复制到设备本地可读写的目录(如应用临时目录),再用本地路径作为FFmpeg的输入。以下是具体实现步骤:
1. 添加依赖
确保pubspec.yaml中包含所需依赖:
dependencies: flutter: sdk: flutter path_provider: ^2.0.15 # 用于获取本地可读写目录 flutter_ffmpeg: ^0.4.0 # Flutter FFmpeg插件(根据实际使用的插件调整版本)
同时确认pubspec.yaml中已正确声明Assets:
flutter: assets: - assets/mylist.txt
2. 复制Assets文件到本地
编写工具函数将Assets中的mylist.txt复制到应用临时目录(无需额外权限):
import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; Future<String> copyAssetMylistToLocal() async { // 读取Assets文件内容 final String assetContent = await rootBundle.loadString('assets/mylist.txt'); // 获取应用临时目录 final Directory tempDir = await getTemporaryDirectory(); final String localFilePath = '${tempDir.path}/mylist.txt'; final File localFile = File(localFilePath); // 将内容写入本地文件 await localFile.writeAsString(assetContent); return localFilePath; }
3. 构建FFmpeg命令并执行
使用本地文件路径替换原Assets路径,构建并执行FFmpeg命令:
// 获取本地mylist.txt的绝对路径 final String localMylistPath = await copyAssetMylistToLocal(); // 构建FFmpeg命令(给路径加双引号,避免路径含空格导致报错) final String commandToExecute = 'ffmpeg -framerate 2 ' '-f concat -i "$localMylistPath" -i ${AUDIO_PATH} -s 1080x1620 -y ${OUTPUT_PATH}'; // 执行FFmpeg命令(以flutter_ffmpeg插件为例) final int result = await FlutterFFmpeg().execute(commandToExecute); if (result == 0) { print('视频合成成功'); } else { print('视频合成失败,错误码:$result'); }
注意事项
- 若
mylist.txt中的图片路径指向外部存储,需确保应用已申请对应权限(如Android的READ_EXTERNAL_STORAGE,Android 13+需READ_MEDIA_IMAGES)。 - 命令执行完成后,可根据需求删除临时目录下的
mylist.txt以释放存储空间。
内容的提问来源于stack exchange,提问作者Ammara
相关产品推荐
相关产品推荐

