Конвертировать тысячи .png в анимированный .gif, 'convert' использует слишком много памяти

20

Многие из вопросы, заданные способы создания < a href="https://ubuntugeeks.com/questions/93670/how-can-i-create-a-gif-out-of-a-sequence-of-png-files-without-the-previous-image" > анимированный gif из набора изображения png предлагают используйте вариант команды ImageMagick convert :

convert -delay 2 -loop 0 *.png animated.gif

Тем не менее, у меня несколько тысяч изображений , и, следовательно, convert использует всю мою память, свопирует, а затем падает. Что такое альтернативное программное обеспечение, которое более сознательное в памяти? Я мог бы использовать другой открытый формат, если .gif не поддерживается, и я предпочитаю инструмент CLI.

    
задан dotancohen 14.01.2015 в 14:38
источник

7 ответов

26

Похоже, вы пытаетесь сделать видео. Если это так, то я бы использовал правильный формат видео.

В этом случае я бы использовал ffmpeg для преобразования отдельных файлов PNG в видео H.264. Поскольку ffmpeg создан для работы с видеороликами, которые могут длиться несколько часов, у него не должно быть проблем с тысячами изображений. Использование H.264 вместо анимированного gif приведет к улучшению качества изображения vast .

Что-то вроде этого должно работать на вас:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2 : устанавливает частоту кадров в половину FPS или 2 секунды на кадр.
  • -i img%04d.png : Это говорит ffmpeg, чтобы прочитать файлы img0000.png , хотя img9999.png .
  • -c:v libx264 : Использовать видеокодек libx264.
    • Здесь вы можете указать параметры сжатия видео, если хотите:
    • -crf <number> : настройка качества. От 0 до 51. 23 по умолчанию. 0 - истинная кодировка без потерь, которая будет довольно высокой. 18 почти визуально без потерь.
  • -r 30 : Установите выходную частоту кадров до 30 FPS. Каждое из входных изображений будет дублировано, чтобы сделать вывод, который вы укажете здесь. Вы можете оставить этот параметр выключенным, и выходной файл будет на входной частоте кадров, но полученный фильм не отобразился должным образом, когда я попробовал его только сейчас.
  • out.mp4 : имя выходного файла.

Литература:

ответ дан David Yaw 15.01.2015 в 03:36
9

Лично я просто запускаю его на ограниченном количестве файлов, а не сразу. Например, что-то вроде этого:

#!/usr/bin/env bash

## Collect all png files in the files array
files=( *png )
## How many should be done at once
batch=50

## Read the array in batches of $batch
for (( i=0; $i<${#files[@]}; i+=$batch ))
do
    ## Convert this batch
    convert -delay 2 -loop 0 "${files[@]:$i:$batch}" animated.$i.gif
done

## Now, merge them into a single file
convert  animated.*.gif all.gif
    
ответ дан terdon 14.01.2015 в 15:42
7

Используйте -limit memory 1GiB , чтобы ограничить объем памяти convert .

1000 изображений будут создавать огромный GIF, который большинство компьютеров будет пытаться отобразить. Я поддерживаю анимационные GIF ниже 200 изображений, когда это возможно. Чем меньше, тем лучше. Если вы поместите свои изображения, эта команда удалит нечетные пронумерованные изображения rm *[13579].png .

Итак, вот мой типичный рабочий процесс для создания анимированного GIF из сцены фильма:

avconv -ss 00:26:00 -i someMovie.mpg %5d.png
rm  *[13579].png
convert -limit memory 1GiB -loop 0 -layers optimize -resize 400 *.png output.gif
    
ответ дан PLA 20.01.2015 в 19:59
3

Если у вас тысячи png-s, формат anigif является странным. Я бы сделал это таким образом, используя avconv :

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
    
ответ дан Frantique 14.01.2015 в 14:55
3
  

Я мог бы использовать другой открытый формат, если .gif не поддерживается

Возможно, APNG вам пригодится. Он поддерживается некоторыми браузерами , включая Firefox, но на данный момент исключает Chrome и IE. Поскольку это просто расширение PNG, просто very просто конвертировать PNG в APNG. Инструмент apngasm может это сделать. Но формат настолько прост, что я недавно написал сборщик APNG для Sage. Адаптация этого кода была бы альтернативой.

    
ответ дан MvG 14.01.2015 в 17:27
2

В дополнение к другим ответам: поскольку вы хотите создать GIF-файл, я предполагаю, что вы хотите отобразить изображение на веб-странице. Если это так, я бы вообще не стал конвертировать ваши PNG. Просто google для «javascript slideshow» и используйте один из миллионов бесплатных скриптов. Или напишите свое, это действительно тривиально.

Преимущества этого способа заключаются в следующем:

  • только одно изображение загружается в браузере в любое время, слайд-шоу начинается быстро и не потребляет много ОЗУ на компьютере пользователя.

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

  • Вы можете добавить элементы управления на свою страницу, чтобы приостановить, перемотать, изменить задержку или перейти к определенному кадру.

ответ дан Sergey 20.01.2015 в 22:01
1

gifsicle - это утилита командной строки для обработки анимации GIF. Если вы хотите обменять память на скорость, вы можете использовать ее переключатель -sonserve-memory.

    
ответ дан codehead 15.01.2015 в 03:13