#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-файлов. Я не могу поверить, что это еще не сделано