Tengo una carpeta llena de videos que quiero convertir a un gif animado. ffmpeg / avconv hace un mal trabajo al hacerlo directamente, por lo que, en cambio, convierto el video en un gif al generar primero cada fotograma como png y luego convertirlo nuevamente a gif usando imagemagick. El problema es que esto resulta en un gran gif en términos de tamaño de archivo. Para resolver esto, quiero "soltar" cada segundo o enésimo fotograma del gif, ya sea omitiendo cada archivo de imagen al convertirlo en un gif o quitando fotogramas de un gif. ¿Cómo puedo hacer esto en Ubuntu (13.04) usando imagemagick o alguna otra utilidad de línea de comandos?
fuente
let i=0; while [[ $i -lt $(($numframes / 2)) ]]; do gifsicle $2 --delete "#$i" -o $2; let i=i+1; done
gifsicle "$1" --unoptimize $(seq -f "#%g" 0 2 $numframes) -O2 -o "$2"
lo hará en una sola llamada.chmod +x gifdrop.sh
Aquí hay una solución más simple usando gifsicle que el script de JohnB:
Este comando debería funcionar en la mayoría de los shells de Unix; Lo he probado en bash. Reemplace
input.gif
youtput.gif
con los nombres de los archivos de entrada y salida, y99
con el número de cuadros en su animación. (Está bien usar un número mayor, pero el gifsicle se quejará).Algunas notas:
El
-U
interruptor combinará fotogramas en la animación de entrada con los anteriores, de modo que cada fotograma se mantenga solo y no dependa de ningún otro. Realmente desea hacer esto antes de hacer casi cualquier cosa con animaciones, de lo contrario es probable que obtenga resultados desordenados. (Si su animación de entrada ya no está optimizada, el gifsicle puede imprimir una advertencia al respecto, pero esto también es completamente inofensivo).Por el contrario, el
-O2
conmutador vuelve a optimizar la animación de salida para minimizar el tamaño del archivo. Con la animación de muestra de JohnB, reduce el tamaño de salida en un 27%.El
seq
comando solo genera una secuencia de números del 0 al 99, contando en pasos de 2. Lo-f "#%g"
hace imprimir un#
antes de cada número, lo que hace que el gifsicle lo entienda como una selección de marco en lugar de un nombre de archivo. Los backticks (`
) alrededor del comando seq hacen que su salida se incluya como parámetros en la línea de comando gifsicle.Si no desea que el gif se acelere, puede usarlo
gifsicle -I input.gif
para obtener el retraso de fotograma actual, multiplíquelo por 2 y úselogifsicle -d ${delay} ...
.fuente
gifsicle input.gif `seq -f "#%g" 0 2 $(identify input.gif | tail -1 | cut -d "[" -f2 - | cut -d "]" -f1 -)` --unoptimize -O2 -o output.gif
useless unoptimization-related input option
. Así que lo hice en dos pasos (desde dentro de Git Bash): 1.gifsicle -U -o unoptimized.gif input.gif
2.gifsicle unoptimized.gif `seq -f "#%g" 0 2 99` -O2 -o output.gif
Usando Photoshop
Esta no es una solución de código abierto o de línea de comando, pero puede hacerlo con Photoshop:
Archivo ▸ Importar ▸ Cuadros de video a capas ...
" Limit to Every __ Frames " hará el truco por ti
fuente
Aquí está mi solución usando el procesamiento de script por lotes ...
Primero copie el gif animado original capturado en el archivo input.gif, luego inicie el intérprete de comandos y escriba:
gifsicle input.gif -I "# -1"> input.txt
mire input.txt y vea cuál es la longitud de la animación: cuántos fotogramas contiene ...
input.txt:
luego edite-cree test.bat y cambie el valor de la variable len = especifique_length_number_from_input.txt y guarde test.bat ...
test.bat:
luego finalmente inicie process1.bat y process2.bat y la animación recortada con cada cuadro impar se procesará en la entrada de archivo.gif
process1.bat:
process2.bat:
fuente
Creo que necesito una nueva explicación más sofisticada (el retraso de fotogramas también es algo importante que debe considerarse también) ... Para este nuevo proceso, deberá descargar JREPL.BAT desde este enlace: http://www.dostips.com /forum/viewtopic.php?t=6044
Primero copie el gif capturado en el archivo input.gif, luego inicie el intérprete de comandos y escriba:
gifsicle input.gif -I "# -1"> input.txt
mire input.txt y vea cuál es la longitud de la animación: cuántos cuadros contiene ... también mire el retraso del cuadro y si es 0.07s, eso significa que debe poner la opción -d14 (7msec * 2) en esta línea en process.cmd: gifsicle -b -U -d14 input.gif, después de editar guardar el proceso.cmd
luego edite test.bat y cambie el valor de la variable 166 de esta línea para que coincida con el número de cuadros de animación: para / L %% i IN (1,2,166) DO echo "# %% i" >> input.bat, después editar guardar test.bat ...
luego inicie process.cmd y la animación recortada con cada cuadro impar se procesará en la entrada de archivo.gif
PD La ventaja de este método también es que tiene control total de lo que desea eliminar del gif (cada segundo cuadro (1,2,166) o cada tercero (1,3,166)), y así sucesivamente, simplemente cambie el número del medio en línea de lote, pero tenga en cuenta que si especifica (1,3,166), debe cambiar -d14 (opción de retraso) de process.cmd para reflejar el cambio (7msec * 3/2 = 10), por lo que en lugar de (7msec * 2 / 1 = 14), la opción de retraso debería ser -d10 ...
Otros archivos (por ejemplo, eliminar cada segundo cuadro): test.bat:
proceso.cmd:
Y el archivo léame auxiliar input.txt:
fuente