Quero fazer uma animação .gif
de um .mp4
vídeo. Eu preferiria fazê-lo na linha de comando, portanto, liste apenas as ferramentas de linha de comando.
command-line
mp4
gif
Maythux
fonte
fonte
Respostas:
ffmpeg
3.4.4 pode fazê-lo diretamente no Ubuntu 18.04Você provavelmente deseja usar algo como:
Procedimento de geração de dados de teste descrito nesta postagem .
Um mais direto:
também funciona, mas o GIF de saída seria muito maior que o vídeo de entrada, porque os formatos de vídeo são compactados de maneira inteligente nos quadros.
Divisão do argumento:
ulimit -Sv 1000000
: defina um tamanho máximo de memória de 1 GB para o programa.Principalmente eu garantindo que o comando não esteja usando memória ilimitada, como certas tentativas anteriores.
500Mb faz com que o ffmpeg falhe ao carregar bibliotecas compartilhadas ... tempo para atualizar sua RAM?
-ss 00:00:03 -to 00:00:06
: hora de início e término para cortar o vídeo.Não, os GIFs não são a melhor maneira de
pirateardistribuir vídeos online.Consulte também: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg
-vf scale=512:-1
: crie os512
pixels de saída em altura e ajuste a largura para manter a proporção.Esse é um caso de uso comum para imagens para a Web, que tendem a ter uma resolução muito menor que o vídeo.
Se você remover esta opção, o GIF de saída terá a mesma altura do vídeo de entrada.
A altura do vídeo original pode ser encontrada, por exemplo, em
ffprobe
: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 e é 1024 x 1024 no nosso caso.-r 15
: amostragem de FPS.Por exemplo, o vídeo original tinha 30 FPS, o que
-r 15
significa queffmpeg
escolherá um quadro a cada 2 (= 30 / 15
).No entanto, o FPS da saída percebida é ajustado para corresponder à entrada, para que você não note uma aceleração, apenas uma granularidade maior.
O FPS de entrada pode ser encontrado
ffprobe
e o número total de quadros de entrada,mediainfo
conforme explicado em: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-em-um-vídeo-na-linha-de-linux / 1044894 # 1044894Eu recomendo esta opção porque os formatos de vídeo geralmente têm uma taxa de quadros mais alta devido à maior resolução. Com GIFs menores, a taxa de quadros inferior é menos perceptível e, portanto, podemos pular alguns quadros e criar GIFs menores.
Antes de 18.04:
ffmpeg
+convert
uma linha sem arquivos intermediáriosffmpeg
não conseguiu lidar com GIF anteriormente. O melhor que tive foi algo junto:Explicação de alguns dos argumentos:
-loop 0
: adicione o campo Contagem de loop da extensão Gif do Netscape à saída. 0 significa loop infinito, conforme descrito em: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extensioneog
,firefox
e o cromo todo loop infinitamente por padrão, mesmo sem ele, portanto, não tenho certeza do quanto necessário. é mais.-delay 5
: o tempo aguardou antes de mostrar o próximo quadro, em centenas de segundos, conforme descrito em: https://en.wikipedia.org/wiki/GIF#Animated_GIF byte 324. Isso100
significa 1 FPS,5
significa1 / 0.5 == 20FPS
.Mesmo se você reduzir a altura e a taxa de quadros, o GIF de saída ainda poderá ser maior que o vídeo, pois os formatos de vídeo não-GIF "reais" serão compactados nos quadros, enquanto o GIF comprime apenas os quadros individuais.
Um direto:
funcionou, mas quase matou meu computador por causa do estouro de memória e produziu uma saída 100x maior para o meu arquivo de entrada 2s 1Mb. Talvez um dia o ImageMagick o atualize.
Consulte também: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality
Testado no Ubuntu 17.10.
fonte
scale=320:-1
-r 10
trará o GIF de volta à velocidade normal.Dois passos:
Extrair imagens do vídeo
Crie um diretório chamado frames no mesmo diretório do seu
.mp4
arquivo. Use o comando:fonte
Converter imagens em gif
Docs: converter opções de gif
Você terminará com um arquivo bastante grande, consulte o guia de imagens mágicas para otimizar o gif nas opções que você pode adicionar ao comando da segunda etapa para obter um arquivo menor.
fonte
frames
pasta deve existir para que o primeiro comando funcione.-layers Optimize
o últimoconvert
comando antes*.jpg
. Verifique a saída, porém, ela pode ser afetada. Para mim, reduziu o tamanho gif partir de 5 MB a 700 KB, sem qualquer perda perceptível de qualidade :)ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
.O gifify é um utilitário baseado em nó tudo-em-um que simplifica a conversão. Ele depende
nodejs
,npm
,ffmpeg
, eimagemagick
que estão disponíveis nos repositórios.Depois de
npm
instalar, você pode instalargifify
globalmente com:Um vídeo pode ser convertido em um .GIF com:
Opcionalmente, você também pode definir uma posição inicial e final no vídeo e adicionar uma legenda:
❗️ Pode levar alguns minutos para que a conversão seja concluída, mesmo com vídeos menores.
fonte
gifsicle
, mas ocorre outro problema: github.com/vvo/gifify/issues/95 Além disso, você se importaria em nos dizer aos novatos do npm em qual diretório executarnpm install
e se executá-lo como root ou não? Obrigado!