Como criar um GIF animado a partir de vídeo MP4 via linha de comando?

119

Quero fazer uma animação .gifde um .mp4vídeo. Eu preferiria fazê-lo na linha de comando, portanto, liste apenas as ferramentas de linha de comando.

Maythux
fonte
Você pode usar este script no Github que usa FFMPEG e gera paleta de cores intermediária para obter melhor qualidade de imagem.
troyane 24/04

Respostas:

128

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 512pixels 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 15significa que ffmpegescolherá 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 ffprobee o número total de quadros de entrada, mediainfoconforme 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+ convertuma linha sem arquivos intermediários

ffmpegnã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:

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.

Ciro Santilli adicionou uma nova foto
fonte
1
Downvoters explique ;-)
Ciro Santilli新疆改造中心法轮功六四事件
1
Seu atraso não corresponde ao seu valor -r (o gif resultante é de velocidade 2x). Além disso, você adicionou um argumento de escala sem motivo aparente (torna o gif muito pequeno).
asmeurer
2
Concordo. Gifs de tamanho pequeno são melhores para a web. Obrigado por scale=320:-1
zombic
2
Para quem está se perguntando: a remoção -r 10trará o GIF de volta à velocidade normal.
Mitch
2
Eu tenho um gif 20% maior que o mp4: O
Adam Goldman
113

Dois passos:

  • Extrair imagens do vídeo

    Crie um diretório chamado frames no mesmo diretório do seu .mp4arquivo. 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
    

    fonte

  • Converter imagens em gif

    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.

Maythux
fonte
1
grande Resposta-alguma informação adicional: ffmpeg pode ser instalado usando direções aqui
chepyle
3
Lembre-se de que a framespasta deve existir para que o primeiro comando funcione.
totymedli
3
Para aqueles que desejam uma maneira rápida de otimizar, que geralmente funciona e são muito preguiçosos para ler o link, basta adicionar -layers Optimizeo último convertcomando 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 :)
cpury
Graças a isso foi um processo interessante, um mp4 de 5,6 MB terminou com um gif de 236 MB, não tenho certeza se vou colocar esse no meu site;) Possivelmente, um gif precisa ser limitado a segundos em vez de um minuto.
cardamomo
2
Em vez de usar o formato de arquivo JPG, com muito prejuízo nas configurações padrão, recomendo usar o PNG para a exportação inicial do arquivo. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F
12

O gifify é um utilitário baseado em nó tudo-em-um que simplifica a conversão. Ele depende nodejs, npm, ffmpeg, e imagemagickque estão disponíveis nos repositórios.

Depois de npminstalar, você pode instalar gififyglobalmente 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: ffmpege imagemagickpode precisar ser compilado com algumas bibliotecas específicas (por exemplo, libass e fontconfig de acordo).

ccpizza
fonte
Não controla aproximadamente> 40 clips seg: github.com/vvo/gifify/issues/99
oligofren
19.04: Outro pacote necessário é 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 installe se executá-lo como root ou não? Obrigado!
Nicolas Raoul