Convierte miles de .pngs en .gif animados, 'convert' usa demasiada memoria

21

Muchas de las preguntas que se hacen cómo crear < a href="https://ubuntusp.info/questions/129810/como-puedo-crear-un-gif-partir-de-una-secuencia-de-archivos" > un archivo .gif animado de un conjunto de imágenes png sugieren a utilice una variante del comando convert de ImageMagick:

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

Sin embargo, tengo unos pocos miles de imágenes y, por lo tanto, convert utiliza toda mi memoria, se intercambia y luego se cuelga. ¿Qué software alternativo existe, que es más consciente de la memoria? Podría usar otro formato abierto si .gif no es compatible, y prefiero una herramienta CLI.

    
pregunta dotancohen 14.01.2015 - 13:38

7 respuestas

28

Parece que estás intentando hacer un video. Si ese es el caso, entonces utilizaría un formato de video adecuado.

En este caso, usaría ffmpeg para convertir los archivos PNG individuales en un video H.264. Como ffmpeg está hecho para funcionar con videos que pueden durar horas, no debería tener problemas con tus miles de imágenes. Usar H.264 en lugar de gif animado dará como resultado una vasta mejora en la calidad de la imagen.

Algo así debería funcionar para ti:

 ffmpeg -framerate 1/2 -i img%04d.png -c:v libx264 -r 30 out.mp4
  • -framerate 1/2 : Esto establece la velocidad de cuadros en medio FPS, o 2 segundos por cuadro.
  • -i img%04d.png : Esto le dice a ffmpeg que lea los archivos img0000.png though img9999.png .
  • -c:v libx264 : usa el códec de video libx264.
    • Puede especificar los parámetros de compresión de video aquí, si lo desea:
    • -crf <number> : configuración de calidad. 0 a 51. 23 es el valor predeterminado. 0 es una verdadera codificación sin pérdida, que tendrá un ancho de banda bastante alto. 18 es casi visualmente sin pérdidas.
  • -r 30 : establece la tasa de cuadros por segundo a 30 FPS. Cada una de las imágenes de entrada se duplicará para hacer que la salida sea lo que especifique aquí. Puede dejar este parámetro desactivado y el archivo de salida estará en la velocidad de fotogramas de entrada, pero la película resultante no se visualizó correctamente cuando lo intenté en este momento.
  • out.mp4 : nombre de archivo de salida.

Referencias:

respondido por el David Yaw 15.01.2015 - 02:36
10

Personalmente, simplemente lo lanzaría en un número limitado de archivos en lugar de todos a la vez. Por ejemplo, algo como esto:

#!/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
    
respondido por el terdon 14.01.2015 - 14:42
7

Use -limit memory 1GiB para limitar la cantidad de memoria convert que usa.

miles de imágenes crearían un gran GIF que la mayoría de las computadoras tendrán dificultades para mostrar. Guardo mis GIF animados debajo de 200 imágenes cuando sea posible. Cuanto menos, mejor. Si numera sus imágenes, este comando eliminará las imágenes impares rm *[13579].png .

Así que aquí está mi flujo de trabajo típico para crear un GIF animado a partir de una escena de película:

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
    
respondido por el PLA 20.01.2015 - 18:59
3

Si tiene miles de png-s, el formato anigif es extraño. Lo haría de esta manera, usando avconv :

 avconv -i "%d.png" -r 25 -c:v libx264 -crf 20 -pix_fmt yuv420p animated.mov
    
respondido por el Frantique 14.01.2015 - 13:55
3
  

Podría usar otro formato abierto si .gif no es compatible

Quizás APNG te sea útil. Es compatible con algunos navegadores , incluido Firefox, pero en este momento no incluye Chrome ni IE. Como es solo una extensión PNG, es muy simple convertir PNG a APNG. La herramienta apngasm puede hacerlo. Pero el formato es tan simple que recientemente escribí un ensamblador APNG para Sage. Adaptar ese código sería una alternativa.

    
respondido por el MvG 14.01.2015 - 16:27
2

Además de otras respuestas: dado que desea producir un archivo GIF, supongo que desea mostrar la imagen en una página web. Si es así, no me molestaría en convertir tus PNG en absoluto. Simplemente busca en google "diapositivas de javascript" y utiliza uno de los millones de scripts gratuitos. O escribe lo tuyo, esto es realmente trivial.

Los beneficios de hacerlo de esta manera son:

  • solo se carga una imagen en el navegador en cualquier momento, la presentación de diapositivas se inicia rápidamente y no consume mucha RAM en la máquina del usuario.

  • la solución se adapta a millones de imágenes. O miles de millones, si eres lo suficientemente paciente como para verlos a todos:)

  • Puede agregar controles a su página para pausar, rebobinar, cambiar la demora o ir a un marco en particular.

respondido por el Sergey 20.01.2015 - 21:01
1

gifsicle es una utilidad de línea de comandos para manejar animaciones GIF. Si está dispuesto a cambiar la velocidad de la memoria, puede usar su --control de memoria de reserva.

    
respondido por el codehead 15.01.2015 - 02:13

Lea otras preguntas en las etiquetas