flutter_ffmpeg - как получить доступ к пути вывода? - PullRequest
1 голос
/ 20 марта 2020

Мне нужно объединить (объединить) два аудиофайла в приложении Flutter.

Я пытаюсь использовать пакет Flutter_ffmpeg.

https://pub.dev/packages/flutter_ffmpeg

Ffmpeg - мощный инструмент для аудио и видео.

пакет flutter_cache_manager для хранения файлов, пришедших с https

https://pub.dev/packages/flutter_cache_manager

И предоставленный путь для работы с путями

https://pub.dev/packages/path_provider

Для части кэширования, которую я уже сделал некоторые успешные тесты,

Но мне нужна ваша помощь, чтобы понять, как я могу использовать пакет ffmpeg.
Согласно readme мне нужно сделать что-то вроде

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"));

Как я могу есть доступ к output.wav для воспроизведения? Как я могу использовать path_provider?

Мне очень нужна ваша помощь. :) Существует мало информации о flutter_ffmpeg. Этот вопрос может быть полезен для других.

Заранее спасибо, Рикардо

1 Ответ

1 голос
/ 20 марта 2020

Пакет path_provider позволяет получить доступ к каталогу appDir & temp вашего приложения, скажем, вы хотите получить доступ к каталогу документов приложения:

Directory appDocumentDir = await getApplicationDocumentsDirectory();
String rawDocumentPath = appDocumentDir.path;

и, если ваш файл вывода имя «output.wav»

String outputPath = Strings.concatAll([rawDocumentPath, "/output.wav"]);

сейчас outputPath содержит путь к выходному файлу, который будет создан FFMPEG , и вы сможете использовать его позже, когда вы хотите воспроизвести / скопировать / загрузить или все, что вы хотите.

, но в части FFMPEG командная строка для входного файла concat two:

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

Если вы хотите иметь 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"));

в идеале мы хотим использовать 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]);

и ваш последний оператор для выполнения процесса будет:

_flutterFFmpeg.execute(commandToExecute).then((rc) => print("FFmpeg process exited with rc $rc"));

после выполнения вы можете проверить выходные данные выполнения , Ноль представляет успешное выполнение, ненулевые значения представляют сбой:

final FlutterFFmpegConfig _flutterFFmpegConfig = new FlutterFFmpegConfig();

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

_flutterFFmpegConfig.getLastCommandOutput().then((output) => print("Last command output: $output"));

, поэтому в случае сбоя или получения ошибки вы можете проверить выходные данные команды для исправления ошибок

вы можете найти больше информации о flutter_ffmpeg здесь:

https://pub.dev/packages/flutter_ffmpeg

также для использования ffmpeg и узнать больше о фильтрах вы можете проверить это:

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

...