Estoy convirtiendo FLV
película a GIF
archivo con ffmpeg.
ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
Funciona muy bien, pero el archivo gif de salida tiene una calidad muy baja.
¿Alguna idea de cómo puedo mejorar la calidad de los gif convertidos?
Salida de comando:
ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
ffmpeg version 0.8.5-6:0.8.5-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers
built on Jan 24 2013 14:52:53 with gcc 4.7.2
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release. Please use avconv instead.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.flv':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2013-02-14 04:00:07
Duration: 00:00:18.85, start: 0.000000, bitrate: 3098 kb/s
Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 2905 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 192 kb/s
Metadata:
creation_time : 2013-02-14 04:00:07
[buffer @ 0x92a8ea0] w:1280 h:720 pixfmt:yuv420p
[scale @ 0x9215100] w:1280 h:720 fmt:yuv420p -> w:320 h:240 fmt:rgb24 flags:0x4
Output #0, gif, to 'output.gif':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: isommp42
creation_time : 2013-02-14 04:00:07
encoder : Lavf53.21.1
Stream #0.0(und): Video: rawvideo, rgb24, 320x240, q=2-31, 200 kb/s, 90k tbn, 10 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream mapping:
Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
frame= 101 fps= 32 q=0.0 Lsize= 8686kB time=10.10 bitrate=7045.0kbits/s dup=0 drop=149
video:22725kB audio:0kB global headers:0kB muxing overhead -61.778676%
Gracias.
Respuestas:
ffmpeg
ejemplo183k
ffmpeg
puede generar GIF de alta calidad. Siempre se recomienda usar una versión reciente: descargar o compilar .-ss 30
) de la entrada y creará una salida de 3 segundos (-t 3
).-loop
opción de salida. Un valor de0
es bucle infinito.Ver GIF de alta calidad con FFmpeg para muchos más ejemplos y opciones.
convert
Ejemplo de Imagemagick227k
Otro método de línea de comandos es a la tubería de
ffmpeg
aconvert
(omagick
) de ImageMagick.Establecer velocidad de fotogramas
Establezca la velocidad de fotogramas con una combinación del
fps
filtro hacia adentroffmpeg
y hacia-delay
adentroconvert
. Esto puede complicarse porqueconvert
solo obtiene una secuencia cruda de imágenes para que no se conserven fps. En segundo lugar, el-delay
valor enconvert
está en ticks (hay 100 ticks por segundo), no en cuadros por segundo. Por ejemplo, confps=12.5
= 100 / 12.5 = 8 =-delay 8
.convert
redondea el-delay
valor a un número entero, por lo que 8.4 da como resultado 8 y 8.5 da como resultado 9. Esto efectivamente significa que solo se admiten algunas velocidades de cuadros cuando se establece un retraso uniforme en todos los cuadros (se puede establecer un retraso específico por cuadro, pero eso está más allá esta respuesta)-delay
parece ignorarse si se usa como una opción de salida, por lo que debe usarse antes-
como se muestra en el ejemplo.Por último, los navegadores y los visores de imágenes pueden implementar un retraso mínimo, por lo que
-delay
puede ser ignorado de todos modos.Video cortesía del Centro Nacional de Capacitación para la Conservación del Servicio de Pesca y Vida Silvestre de EE. UU.
fuente
-vf scale=320:-1,format=rgb8,format=rgb24
convert
comando para convertir de los marcos PNG que terminé usandoconvert -delay 5 -loop 0 -dither None -colors 80 "frames/ffout*.png" -fuzz "40%" -layers OptimizeFrame "output.gif"
, lo que reduce bastante el tamaño general del archivoscale=0:-1
, así que cuando configuras la escala0
, tomará la escala del video.Si prefiere evitar archivos de imagen intermedios, los comandos proporcionados por LordNeckBeard se pueden canalizar entre los de
ffmpeg
ImageMagickconvert
para que no se requieran archivos intermedios:El
-f image2pipe
le dice a ffmpeg que divida el video en imágenes y lo haga adecuado para ser canalizado, y-vcodec ppm
especifica que el formato de salida sea ppm (por alguna razón si el formato es png, oconvert
no lee todas las imágenes de la tubería, o ffmpeg sí lo hace) no sacarlos todos). El-
para ambos comandos especifica que se utilizará una tubería para la salida y la entrada, respectivamente.Para optimizar el resultado sin guardar un archivo, puede canalizar la salida desde
convert
un segundoconvert
comando:El
gif:-
le diceconvert
que canalice su salida como datos con formato gif y-layers Optimize
le dice al segundoconvert
que realiceoptimize-frame
y losoptimize-transparancy
métodos (vea la Introducción de ImageMagick a la optimización de la animación ). Tenga en cuenta que es posible que la salida del-layers Optimize
archivo no siempre proporcione un tamaño de archivo más pequeño, por lo que puede intentar convertir a un gif sin optimización primero para asegurarse.Recuerde que durante todo este proceso todo está en la memoria, por lo que puede necesitar suficiente memoria si las imágenes son bastante grandes.
fuente
avconv
convert -delay 5 -loop 0 -layers Optimize - output.gif
split
filtro en ffmpeg. No hay necesidad de canalizar nada:ffmpeg -ss 30 -t 3 -i "input.flv fps=10,scale=320:-1:flags=lanczos,split[x][z];[z]palettegen[y];[x][y]paletteuse" output.gif
A partir de ffmpeg 2.6, podemos hacerlo aún mejor:
HT
fuente
Hice mi propia versión del script, que también parametriza la resolución de salida y la velocidad de fotogramas.
La ejecución
./gifenc.sh input.mov output.gif 720 10
generará 720p de ancho 10fps GIF de la película que le diste Es posible que deba hacerchmod +x gifenc.sh
por el archivo.Puedes leer los detalles en mi Github
Suposiciones: ffmpeg está instalado y el script está en la misma carpeta que los otros archivos.
fuente
La respuesta de @Stephane es muy buena. Pero recibirá una advertencia como
Buffer queue overflow, dropping.
para algunos videos, y el generadogif
tiene algún marco caído.Aquí hay una mejor versión con
fifo
filtro para evitarBuffer queue overflow
al usar elpaletteuse
filtro. Mediante el uso desplit
filtro para evitar la creación de un archivo PNG de paleta intermedia.fuente
fifo
operación de filtro entreo2
yo3
? Para evitar laBuffer queue overflow
advertencia.hizo un guión, probó y funciona.
uso:
TENGO PHUN :)
vim avi2gif.sh
por cierto: vokoscreen es una EXCELENTE herramienta de captura de pantalla para Linux :)
MUCHAS GRACIAS Michael Kohaupt :) Rock constante.
algunas estadísticas de tamaño de archivo:
5.3M = vokoscreen-2015-04-28_15-43-17.avi -> vokoscreen-2015-05-28_12-41-56.avi.gif = 1013K
Vea los resultados aquí.
fuente
El método
ffmpeg
con paleta se puede ejecutar en un solo comando, sin archivo intermediario ..png
Esto se puede hacer gracias al
split
filtro.fuente
Linux / Unix / macOS
Siguiendo el enfoque de @LordNeckbeard con el
ffmpeg
comando, encuentre la siguiente función Bash útil que se puede agregar a su~/.bash_profile
archivo:Una vez que se carga la función (manualmente o desde
. ~/.bash_profile
), debe tener un nuevovideo2gif
comando.Ejemplo de uso:
o:
Escale a 320 de ancho con 10 cuadros por segundo.
También puede especificar un formato de video diferente (como mp4).
Mac OS
Puede probar la aplicación GIF Brewery que puede crear GIF a partir de archivos de video.
Alternativamente, hay varios sitios web que realizan conversiones en línea de forma gratuita.
fuente
La respuesta seleccionada asume que desea escalar el video fuente y cambiar sus fps en el gif producido. Si no necesita hacer esto, lo siguiente funciona:
Esto fue útil cuando quería un gif que recreara fielmente el video fuente que estaba usando.
fuente
Para usuarios de Windows:
cree un
video2gif.bat
archivo en el directorio de Windows con este contenido:Y luego, en cualquier lugar donde pueda usarlo, sea como este ejemplo:
Entonces tienes
myvideo.gif
en el directorio actual.Si
myvideo.gif
existe, pregunta de usted para sobrescribirlo.EDITAR:
Sugiero usar este script por lotes: https://github.com/NabiKAZ/video2gif
fuente
fps=10
yscale=-1:-1
). La respuesta de Sun ya nos dio un archivo por lotes, y ese (como los scripts de shell en la respuesta de pje y la respuesta de vangelist ) tiene la ventaja de que asigna la lista de filtros a una variable ( una vez ), ... (Continúa)fps=10,scale=-1:-1
)? (Consulte la respuesta de notable para ver un ejemplo de una explicación de las partes de un comando.)A continuación se muestra el archivo por lotes para usuarios de Windows:
gifenc.bat:
Fuente: GIF de alta calidad con FFmpeg: extracción de solo una muestra
Si solo desea usar una variable de entrada y el nombre de salida tiene solo la extensión GIF (pronunciado JIF), use esto en su lugar:
fuente
Cómo agregar una entrada de menú contextual "clic derecho" de Windows 7/10 para convertir su archivo de video a gif
Algunas de las otras respuestas mencionaron el script video2gif , que utilicé. Pero, podrías usar cualquier script.
Para crear la opción del menú contextual, debe editar su registro. Abra un símbolo del sistema de PowerShell, ejecutando w / admin privs. Ejecute estos comandos:
¡Ahora, cuando hace clic derecho en un archivo, tendrá la opción "Ejecutar Video2Gif"!
Por cierto, instalé ffmpeg
C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\
y puse elvideo2gif.bat
script en el directorio bin justo al ladoffmpeg.exe
. También agreguéC:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin
a mis ventanasPATH
, pero no creo que sea necesario.Si desea la opción de poder proporcionar algunos indicadores / argumentos adicionales de la línea de comandos al script,
video2gif-prompt.bat
cree un nuevo archivo llamado y haga que el registro lo consulte en lugar devideo2gif.bat
:Todavía puede presionar enter para obtener rápidamente los valores predeterminados.
fuente