Estoy convirtiendo FLVpelícula a GIFarchivo 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:
ffmpegejemplo183k
ffmpegpuede 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).-loopopción de salida. Un valor de0es bucle infinito.Ver GIF de alta calidad con FFmpeg para muchos más ejemplos y opciones.
convertEjemplo de Imagemagick227k
Otro método de línea de comandos es a la tubería de
ffmpegaconvert(omagick) de ImageMagick.Establecer velocidad de fotogramas
Establezca la velocidad de fotogramas con una combinación del
fpsfiltro hacia adentroffmpegy hacia-delayadentroconvert. Esto puede complicarse porqueconvertsolo obtiene una secuencia cruda de imágenes para que no se conserven fps. En segundo lugar, el-delayvalor enconvertestá en ticks (hay 100 ticks por segundo), no en cuadros por segundo. Por ejemplo, confps=12.5= 100 / 12.5 = 8 =-delay 8.convertredondea el-delayvalor 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)-delayparece 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
-delaypuede 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=rgb24convertcomando 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
ffmpegImageMagickconvertpara que no se requieran archivos intermedios:El
-f image2pipele dice a ffmpeg que divida el video en imágenes y lo haga adecuado para ser canalizado, y-vcodec ppmespecifica que el formato de salida sea ppm (por alguna razón si el formato es png, oconvertno 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
convertun segundoconvertcomando:El
gif:-le diceconvertque canalice su salida como datos con formato gif y-layers Optimizele dice al segundoconvertque realiceoptimize-framey losoptimize-transparancymé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 Optimizearchivo 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
avconvconvert -delay 5 -loop 0 -layers Optimize - output.gifsplitfiltro 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.gifA 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 10generará 720p de ancho 10fps GIF de la película que le diste Es posible que deba hacerchmod +x gifenc.shpor 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 generadogiftiene algún marco caído.Aquí hay una mejor versión con
fifofiltro para evitarBuffer queue overflowal usar elpaletteusefiltro. Mediante el uso desplitfiltro para evitar la creación de un archivo PNG de paleta intermedia.fuente
fifooperación de filtro entreo2yo3? Para evitar laBuffer queue overflowadvertencia.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
ffmpegcon paleta se puede ejecutar en un solo comando, sin archivo intermediario ..pngEsto se puede hacer gracias al
splitfiltro.fuente
Linux / Unix / macOS
Siguiendo el enfoque de @LordNeckbeard con el
ffmpegcomando, encuentre la siguiente función Bash útil que se puede agregar a su~/.bash_profilearchivo:Una vez que se carga la función (manualmente o desde
. ~/.bash_profile), debe tener un nuevovideo2gifcomando.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.batarchivo en el directorio de Windows con este contenido:Y luego, en cualquier lugar donde pueda usarlo, sea como este ejemplo:
Entonces tienes
myvideo.gifen el directorio actual.Si
myvideo.gifexiste, pregunta de usted para sobrescribirlo.EDITAR:
Sugiero usar este script por lotes: https://github.com/NabiKAZ/video2gif
fuente
fps=10yscale=-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.batscript en el directorio bin justo al ladoffmpeg.exe. También agreguéC:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bina 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.batcree 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