Estou convertendo FLV
filme para GIF
arquivo com ffmpeg.
ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif
Ele funciona muito bem, mas o arquivo gif de saída tem uma qualidade muito baixa.
Alguma idéia de como posso melhorar a qualidade do gif convertido?
Saída do 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%
Obrigado.
Respostas:
ffmpeg
exemplo183k
ffmpeg
pode gerar GIF de alta qualidade. É sempre recomendável usar uma versão recente: baixar ou compilar .-ss 30
) da entrada e criará uma saída de 3 segundos (-t 3
).-loop
opção de saída. Um valor de0
é um loop infinito.Consulte GIF de alta qualidade com FFmpeg para muitos mais exemplos e opções.
convert
Exemplo Imagemagick227k
Outro método de linha de comando é canalizar de
ffmpeg
paraconvert
(oumagick
) no ImageMagick.Definir taxa de quadros
Defina a taxa de quadros com uma combinação do
fps
filtro para dentroffmpeg
e para-delay
dentroconvert
. Isso pode ser complicado porqueconvert
apenas obtém um fluxo bruto de imagens para que nenhum fps seja preservado. Em segundo lugar, o-delay
valor emconvert
está em ticks (existem 100 ticks por segundo), não em quadros por segundo. Por exemplo, comfps=12.5
= 100 / 12,5 = 8 =-delay 8
.convert
arredonda o-delay
valor para um número inteiro, de modo que 8.4 resulta em 8 e 8.5 em 9. Isso efetivamente significa que apenas algumas taxas de quadros são suportadas ao definir um atraso uniforme em todos os quadros (um atraso específico pode ser definido por quadro, mas isso está além esta resposta).-delay
parece ser ignorado se usado como uma opção de saída, portanto, ele deve ser usado antes,-
como mostrado no exemplo.Por fim, navegadores e visualizadores de imagens podem implementar um atraso mínimo; portanto, você
-delay
pode ser ignorado.Vídeo cortesia do Centro Nacional de Treinamento em Conservação do Serviço de Pesca e Vida Selvagem dos EUA.
fonte
-vf scale=320:-1,format=rgb8,format=rgb24
convert
comando para converter a partir dos quadros de PNG acabei usandoconvert -delay 5 -loop 0 -dither None -colors 80 "frames/ffout*.png" -fuzz "40%" -layers OptimizeFrame "output.gif"
, o que reduz o tamanho total do arquivo um poucoscale=0:-1
, então quando você define a escala0
, ela pega a escala do vídeo.Se você preferir evitar arquivos de imagem intermediários, os comandos fornecidos pelo LordNeckBeard podem ser canalizados entre os
ffmpeg
ImageMagick e os deconvert
modo que nenhum arquivo intermediário seja necessário:O
-f image2pipe
comando diz ao ffmpeg para dividir o vídeo em imagens e o torna adequado para ser canalizado e-vcodec ppm
especifica o formato de saída como ppm (por algum motivo, se o formato for png,convert
ele não lê todas as imagens do pipe ou o ffmpeg faz todos eles). O-
comando para ambos especifica que um tubo será usado para saída e entrada, respectivamente.Para otimizar o resultado sem salvar um arquivo, você pode canalizar a saída
convert
para um segundoconvert
comando:O
gif:-
instruiconvert
a canalizar sua saída como dados formatados em gif e-layers Optimize
o segundoconvert
a executaroptimize-frame
eoptimize-transparancy
métodos (consulte a Introdução ao ImageMagick à Otimização da animação ). Observe que a saída do-layers Optimize
arquivo nem sempre fornece um tamanho de arquivo menor; portanto, convém tentar converter para um gif sem otimização primeiro.Lembre-se de que durante todo esse processo tudo está na memória; portanto, você pode precisar de memória suficiente se as imagens forem muito grandes.
fonte
avconv
convert -delay 5 -loop 0 -layers Optimize - output.gif
split
filtro em ffmpeg. Não é necessário 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 do ffmpeg 2.6, podemos fazer ainda melhor:
HT
fonte
Eu fiz minha própria versão do script, que também parametriza a resolução de saída e a taxa de quadros.
A execução
./gifenc.sh input.mov output.gif 720 10
produzirá um GIF de 10fps a 720p de largura do filme que você deu. Talvez você precise fazerchmod +x gifenc.sh
o arquivo.Você pode ler os detalhes no meu Github
Pressupostos: o ffmpeg está instalado e o script está na mesma pasta que os outros arquivos.
fonte
A resposta de @Stephane é muito boa. Mas ele receberá um aviso, como
Buffer queue overflow, dropping.
em alguns vídeos, e o geradogif
tem algum quadro descartado.Aqui está uma versão melhor com
fifo
filtro para evitarBuffer queue overflow
ao usar opaletteuse
filtro. Usando osplit
filtro para evitar a criação do arquivo PNG da paleta intermediária.fonte
fifo
operação de filtro entreo2
eo3
? Para evitar oBuffer queue overflow
aviso.fez um script, testado e funciona.
uso:
TEM PHUN :)
vim avi2gif.sh
btw: vokoscreen é uma EXCELENTE ferramenta ScreenCapturing para Linux :)
MUITO OBRIGADO Michael Kohaupt :) Rock constante.
algumas estatísticas de tamanho de arquivo:
5.3M = vokoscreen-2015-04-28_15-43-17.avi -> vokoscreen-2015-05-28_12-41-56.avi.gif = 1013K
veja os resultados aqui.
fonte
O método
ffmpeg
with palette pode ser executado em um único comando, sem arquivo intermediário ..png
Isso pode ser feito graças ao
split
filtro.fonte
Linux / Unix / macOS
Seguindo a abordagem @LordNeckbeard com o
ffmpeg
comando, encontre a seguinte função Bash útil que pode ser adicionada ao seu~/.bash_profile
arquivo:Depois que a função é carregada (manualmente ou de
. ~/.bash_profile
), você deve ter um novovideo2gif
comando.Exemplo de uso:
ou:
Escale para 320 de largura com 10 quadros por segundo.
Você também pode especificar um formato de vídeo diferente (como mp4).
Mac OS
Você pode experimentar o aplicativo GIF Brewery, que pode criar GIFs a partir de arquivos de vídeo.
Como alternativa, existem vários sites que estão fazendo a conversão online gratuitamente.
fonte
A resposta selecionada pressupõe que você deseja dimensionar o vídeo de origem e alterar seus fps no gif produzido. Se você não precisar fazer isso, o seguinte funciona:
Isso foi útil quando eu queria um gif que recriasse fielmente o vídeo fonte que eu estava usando.
fonte
Para usuários do Windows:
crie um
video2gif.bat
arquivo no diretório windows com este conteúdo:E então, em qualquer lugar que você possa usá-lo, fique como este exemplo:
Então você tem
myvideo.gif
no diretório atual.Se
myvideo.gif
houver, faça uma pergunta sua para substituí-la.EDITAR:
Sugiro usar este script em lote: https://github.com/NabiKAZ/video2gif
fonte
fps=10
escale=-1:-1
). A resposta da Sun já nos forneceu um arquivo em lotes, e aquele (como os scripts de shell na resposta do pje e na resposta doangelist ) tem a vantagem de atribuir a lista de filtros a uma variável ( uma vez ),… (continua)fps=10,scale=-1:-1
)? (Veja a resposta do notável para obter um exemplo de explicação de partes de um comando.) #Abaixo está o arquivo em lotes para usuários do Windows:
gifenc.bat:
Fonte: GIF de alta qualidade com FFmpeg: extraindo apenas uma amostra
Se você deseja apenas usar uma variável de entrada e o nome da saída possuir apenas a extensão GIF (pronuncia-se JIF), use-a em seu lugar:
fonte
Como adicionar uma entrada do menu de contexto do Windows 7/10 "clique com o botão direito do mouse" para converter seu arquivo de vídeo em gif
Algumas das outras respostas mencionaram o script video2gif , que eu usei. Mas você pode usar qualquer script.
Para criar a opção do menu de contexto, você precisa editar seu registro. Abra um prompt de comando do PowerShell, executando w / admin privs. Execute estes comandos:
Agora, quando você clicar com o botão direito do mouse em um arquivo, terá a opção "Executar Video2Gif"!
btw eu instalei o ffmpeg
C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\
e coloquei ovideo2gif.bat
script no diretório bin ao lado deffmpeg.exe
. Eu também adicioneiC:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin
às minhas janelasPATH
, mas acho que você não precisa.Se você deseja a opção de fornecer alguns sinalizadores / argumentos de linha de comando extras para o script, crie um novo arquivo chamado
video2gif-prompt.bat
e faça com que o registro faça referência a ele em vez devideo2gif.bat
:Você ainda pode pressionar Enter para obter rapidamente os padrões.
fonte