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.
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.
Respostas:
ffmpeg
3.4.4 pode fazê-lo diretamente no Ubuntu 18.04
Você provavelmente deseja usar algo como:
sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
-i opengl-rotating-triangle.mp4 \
-r 15 \
-vf scale=512:-1 \
-ss 00:00:03 -to 00:00:06 \
opengl-rotating-triangle.gif
Procedimento de geração de dados de teste descrito nesta postagem .
Um mais direto:
sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif
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 piratear distribuir 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 os 512
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 que ffmpeg
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 # 1044894
Eu 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ários
ffmpeg
não conseguiu lidar com GIF anteriormente. O melhor que tive foi algo junto:
sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
convert -delay 5 -loop 0 - output.gif
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-extension eog
, 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. Isso 100
significa 1 FPS, 5
significa 1 / 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:
convert input.mp4 rpi2-bare-metal-blink.gif
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.
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:
ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.jpg'
-r 5 stands for FPS value
for better quality choose bigger number
adjust the value with the -delay in 2nd step
to keep the same animation speed
%03d gives sequential filename number in decimal form
cd frames
convert -delay 20 -loop 0 *.jpg myimage.gif
-delay 20 means the time between each frame is 0.2 seconds
which match 5 fps above.
When choosing this value
1 = 100 fps
2 = 50 fps
4 = 25 fps
5 = 20 fps
10 = 10 fps
20 = 5 fps
25 = 4 fps
50 = 2 fps
100 = 1 fps
in general 100/delay = fps
-loop 0 means repeat forever
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.
frames
pasta deve existir para que o primeiro comando funcione.
-layers Optimize
o último convert
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
, e imagemagick
que estão disponíveis nos repositórios.
Depois de npm
instalar, você pode instalar gifify
globalmente com:
npm install -g gifify
Um vídeo pode ser convertido em um .GIF com:
gifify video.mp4 -o video.gif
Opcionalmente, você também pode definir uma posição inicial e final no vídeo e adicionar uma legenda:
gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'
❗️ Pode levar alguns minutos para que a conversão seja concluída, mesmo com vídeos menores.
NOTA:
ffmpeg
eimagemagick
pode precisar ser compilado com algumas bibliotecas específicas (por exemplo, libass e fontconfig de acordo).
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 executar npm install
e se executá-lo como root ou não? Obrigado!