flutter_ffmpeg - 如何访问输出的路径?

Ric*_*rdd 3 android ffmpeg dart flutter android-ffmpeg

我需要在 Flutter 应用程序中合并(连接)两个音频文件。

我正在尝试使用 Flutter_ffmpeg 包。

https://pub.dev/packages/flutter_ffmpeg
Run Code Online (Sandbox Code Playgroud)

Ffmpeg 是强大的音频和视频工具。

flutter_cache_manager 包用于存储来自 https 的文件

https://pub.dev/packages/flutter_cache_manager
Run Code Online (Sandbox Code Playgroud)

并提供用于处理路径的路径

https://pub.dev/packages/path_provider
Run Code Online (Sandbox Code Playgroud)

对于缓存部分,我已经做了一些成功的测试,

但是,我需要您的帮助来了解我如何使用 ffmpeg 包。
根据自述文件,我需要做类似的事情

import 'package:flutter_ffmpeg/flutter_ffmpeg.dart';

final FlutterFFmpeg _flutterFFmpeg = new FlutterFFmpeg(); 
var fileCached1 = await DefaultCacheManager().getSingleFile(url1);
var fileCached2 = await DefaultCacheManager().getSingleFile(url2);
var arguments = ["-i", "concat:fileCached1.wav|fileCached2.wav", "-c copy", "output.way"];
_flutterFFmpeg.executeWithArguments(arguments ).then((rc) => print("FFmpeg process exited with rc $rc"));
Run Code Online (Sandbox Code Playgroud)

我如何才能访问 output.wav 来播放?如何使用 path_provider?

我真的需要你的帮助。:) 关于 flutter_ffmpeg 的信息很少。这个问题可能对其他人有用。

提前致谢,里卡多

Ras*_*ana 6

path_provider包让你访问APPDIR和应用程序的temp目录,让说,你要访问的申请文件目录:

Directory appDocumentDir = await getApplicationDocumentsDirectory();
String rawDocumentPath = appDocumentDir.path;
Run Code Online (Sandbox Code Playgroud)

如果您的输出文件名为“output.wav”

String outputPath = Strings.concatAll([rawDocumentPath, "/output.wav"]);
Run Code Online (Sandbox Code Playgroud)

现在outputPath包含将由FFMPEG生成的输出文件的路径,您可以在以后想要播放/复制/上传或任何您想要的内容时使用它。

但是在FFMPEG部分,连接两个输入文件的命令行是:

ffmpeg -i input1.wav -i input2.wav -filter_complex '[0:0][1:0]concat=n=2:v=0:a=1[out]' -map '[out]' output.wav
Run Code Online (Sandbox Code Playgroud)

如果你想有 3 个输入文件,使用 n=3 并更改命令中的其他部分。

Flutter_ffmpeg 的用法是这样的:

import 'package:flutter_ffmpeg/flutter_ffmpeg.dart';

final FlutterFFmpeg _flutterFFmpeg = new FlutterFFmpeg();

_flutterFFmpeg.execute("-i input1.wav -i input2.wav -filter_complex '[0:0][1:0]concat=n=2:v=0:a=1[out]' -map '[out]' output.wav").then((rc) => print("FFmpeg process exited with rc $rc"));
Run Code Online (Sandbox Code Playgroud)

理想情况下,我们想在这里使用outputPath所以做这样的事情:

String commandToExecute = Strings.concatAll(["-i input1.wav -i input2.wav -filter_complex '[0:0][1:0]concat=n=2:v=0:a=1[out]' -map '[out]' ", outputPath]);
Run Code Online (Sandbox Code Playgroud)

您执行该过程的最终声明将是:

_flutterFFmpeg.execute(commandToExecute).then((rc) => print("FFmpeg process exited with rc $rc"));
Run Code Online (Sandbox Code Playgroud)

执行后,您可以检查执行输出。零代表成功执行,非零值代表失败:

final FlutterFFmpegConfig _flutterFFmpegConfig = new FlutterFFmpegConfig();

_flutterFFmpegConfig.getLastReturnCode().then((rc) => print("Last rc: $rc"));

_flutterFFmpegConfig.getLastCommandOutput().then((output) => print("Last command output: $output"));
Run Code Online (Sandbox Code Playgroud)

所以在失败或出错的情况下,您可以检查命令输出以修复错误

您可以在此处找到有关 flutter_ffmpeg 的更多信息:

https://pub.dev/packages/flutter_ffmpeg

也用于使用 ffmpeg 并找到有关过滤器的更多信息,您可以查看:

https://ffmpeg.org/ffmpeg-filters.html