Dart // Flutter — как подключить изображение и аудио для рендеринга статического видео

#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

                        }
                      });