#flutter #dart #audio #video #render
Вопрос:
Я пытаюсь подключить аудиофайл к статическому изображению и отобразить его как видео, содержащее только статическое изображение и воспроизведение звука, я просмотрел несколько библиотек пабов, подобных этой
но я не нашел никакой документации о том, как реализовать, когда я ищу, есть ли простой способ сделать это? и если нет, то возможно ли это сделать с помощью dart без написания специфичных для платформы материалов?
Комментарии:
1. Обновление: я смог, как и многие другие, понять, как это сделать с помощью библиотеки ffmpeg kit, но она очень большая и медленная, есть ли другой способ выполнить то, что я ищу?
2. Почему бы просто не отобразить статическое изображение с воспроизведением звука поверх него? Почему это должно быть видео?
3. Привет! Спасибо за ответ 🙂 @Abion47 Причина, по которой мне нужно, чтобы это было видео, заключается в том, что я хочу использовать пакет share, чтобы пользователь мог делиться видео с WhatsApp / instagram / sms / etc..
4. Обновление abit по ситуации: я нашел этот пакет: pub.dev/packages/tapioca , который позволяет некоторую форму редактирования без ffmpeg, но у него нет функции, которая помогает соединять видео со звуком, только видео с наложением изображения.
Ответ №1:
Это то, что я в итоге сделал, надеюсь, это кому-то помогло, в моем случае мне нужно было подключить изображение к аудиофайлу, чтобы создать видео, которым можно поделиться с помощью плагина share_plus
На самом деле у вас нет альтернативы ffmpeg, но вы можете настроить его так, чтобы использовать его было не так уж и плохо:
добавьте это в свои зависимости pubspec.yaml ffmpeg_kit_flutter_min_gpl: ^4.5.0-LTS
импортируйте их в файлы, которые вы хотите отобразить в видео:
import 'package:ffmpeg_kit_flutter_min_gpl/return_code.dart';
import 'package:ffmpeg_kit_flutter_min_gpl/ffmpeg_kit.dart';
а затем сам рендеринг:
await FFmpegKit.executeAsync(
'-y -i $screenshotPath -i $filePath -c:v libx264 -tune stillimage -c:a aac -b:a 192k -pix_fmt yuv420p ${applicationDocumentDirectory.path}/new.mp4',
(session) async {
final state = await session.getState();
final returnCode = await session.getReturnCode();
String output = await session.getOutput();
print(output);
if (ReturnCode.isSuccess(returnCode)) {
// SUCCESS
await Share.shareFiles(
['${applicationDocumentDirectory.path}/new.mp4'],
);
} else if (ReturnCode.isCancel(returnCode)) {
// CANCEL
} else {
// ERROR
}
});