создание миниатюр GIF для видео — flutter — image

#flutter #dart #image-processing #animated-gif

#flutter #dart #обработка изображений #анимированный-gif

Вопрос:

я пытаюсь создать анимированную миниатюру для видео на устройстве. Это приложение для Android / ios flutter. поэтому мой подход заключался в том, чтобы сделать это на телефоне с помощью следующих пакетов dart:

   flutter_video_compress: ^0.3.7 8
  image: ^2.1.13
  

приведенный ниже код не является полным кодом, .convertVideoToGif (flutter_video_compress) работает хорошо. Однако сгенерированный GIF-файл большой, поэтому я использовал пакет изображений для уменьшения размера и сокращения количества кадров. Но сгенерированный GIF из пакета изображений всегда генерирует GIF-файл с красным артефактом, у кого-нибудь есть идеи, почему он это делает?

Образец сгенерированного GIF-файла: https://cdn.tracorder.com/videos/3tIbEYH_1601602948035.mp4.gif

 import 'package:image/image.dart' as pic;
import 'package:flutter_video_compress/flutter_video_compress.dart';

{
    thumb = await _flutterVideoCompress.convertVideoToGif(
            videoPath,
            startTime: 0, // default(0)
            duration: 3, // default(-1)
            endTime: -1 // default(-1)
          );
    
    
          debugPrint("Thumb : "   thumb.path);
    
    
          pic.Animation thumbTemp = pic.decodeGifAnimation(thumb.readAsBytesSync());
          int frameDividor = (thumbTemp.length/5).round();
          pic.GifEncoder gifEnc = new pic.GifEncoder(delay: 50, repeat: 0, samplingFactor: 100);
          pic.Image tmpImage;
    
          for(int t=0; t < thumbTemp.length; t  ){
    
            if((t % frameDividor) == 0){
              tmpImage = pic.copyResize(thumbTemp.frames[t], width: 250);
              gifEnc.addFrame(tmpImage, duration: 30);
    
            }
    
          }
          thumbAnime = pic.decodeGifAnimation(gifEnc.finish());
    

          thumb.writeAsBytesSync(pic.encodeGifAnimation(thumbAnime));
}
  

Редактировать:


В итоге я использовал flutter_ffmpeg, вот что я в итоге использовал:

   var arguments = ["-i", videoPath, "-ss", "00:00:01","-t","00:00:03","-vf","fps=3,scale=120:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse", "-loop","0",thumb.path];
  _flutterFFmpeg.executeWithArguments(arguments).then((rc) {
        print("FFmpeg process exited with rc $rc");
        setState(() {
          _thumbReady = true;
        });
    }
  );
  

Комментарии:

1. У меня была такая же проблема, ты сделал это?

2. эй, в конце концов, я просто использовал пакет flutter_ffmpeg для создания gif, думаю, это сделало apk немного большим, но это работает

3. ну … я видел информацию о пакете, это кажется мне довольно сложным

4. можете ли вы поделиться кодом ?? dev.silenmus@gmail.com

5. эй, я добавил выше, он просто создает GIF-файл

Ответ №1:

Я хотел собрать некоторые важные сведения, касающиеся проблем сжатия видео / gif / изображений в Flutter, не всегда понятно, что поддерживается, а что нет на Android И IOS. Не ожидайте, что старые пакеты будут хорошо стареть, поэтому помните о том, какие пакеты вы в конечном итоге используете 🙂


Пакет flutter_video_compress :

  • Не обновлялся с 3/6/2019
  • Файл теряется.расположение пути при использовании более новых инструментов выбора файлов
  • GIF-файлы не работают на IOS, а сам пакет больше не компилируется для IOS

Пакет video_compress:

  • video_compress может делать все, что может делать flutter_vide_compress, за исключением GIF-файлов (но разработка скоро появится). Поэтому я рекомендую планировать дальнейшее использование video_compress.
  • Очень быстрое сжатие
  • Видео размером 50 МБ можно сжать до 5-7 МБ с качеством 720p примерно за 4-8 секунд

Пакет flutter_image_compress

  • 0.7.0 компилируется в IOS и Android с 22.01/2021
  • Очень быстро и эффективно
  • Обновлено по состоянию на июль 2020 года
  • Не могу создавать GIF-файлы, но для любого другого сжатия изображений это здорово

Пакет flutter_ffmpeg:

  • Очень большой размер APK после импорта
  • Перебор для большинства вариантов использования
  • Начинает устаревать, если обновления не появятся в ближайшее время (последнее обновление было в сентябре 2020 года на сегодняшний день)

Как вы указали, код flutter_ffmpeg можно использовать таким образом для создания gif:

  var arguments = ["-i", videoPath, "-ss", "00:00:01","-t","00:00:03","-vf","fps=3,scale=120:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse", "-loop","0",thumb.path];
  _flutterFFmpeg.executeWithArguments(arguments).then((rc) {
        print("FFmpeg process exited with rc $rc");
        setState(() {
          _thumbReady = true;
        });
    }
  );
  

Ответ №2:

Любые новые мысли / подходы к сжатию GIF. Предпочел бы не использовать ffmpeg из-за проблем с размером пакета. Спасибо!

Комментарии:

1. Дайте мне знать, если вы когда-нибудь найдете хорошую альтернативу, подумывал, может быть, создать поддельный gif, используя миниатюры из разных позиций видео… им действительно нужно обновить video_compress для поддержки GIF-файлов. Я не могу поверить, что это еще не сделано