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

63

Eu quero criar um .gif animado a partir de um vídeo .mp4 . Eu preferiria fazê-lo a partir da linha de comando, portanto, apenas liste as ferramentas de linha de comando.

    
por Maythux 15.07.2015 / 10:01

3 respostas

75

Dois passos:

  • Extrair imagens do vídeo

    Crie um diretório chamado frames no mesmo diretório com o arquivo .mp4 . 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
    

    source

  • Converta imagens para 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
    

    Documentos: opções de conversão de gif

Você vai acabar com um arquivo bastante grande, dê uma olhada no guia de magia de imagens para otimizar o gif em opções que você pode adicionar ao segundo passo para obter um arquivo menor.

    
por Maythux 15.07.2015 / 10:01
53

ffmpeg + convert one-liner sem arquivos intermediários

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

produziu a saída rapidamente e com um tamanho razoável em comparação com o arquivo de entrada.

Fonte: link

Explicação de alguns dos argumentos:

  • -r 10 : amostragem FPS. Por exemplo, se o vídeo original tiver 30 FPS, -r 10 significa que ffmpeg escolherá um quadro em cada 3. O FPS de entrada pode ser encontrado com ffprobe e o número total de quadros de entrada pode ser encontrado com mediainfo , conforme explicado em: link Um valor relativamente baixo como 10 significará menos quadros de saída e, portanto, GIFs menores. TODO alguns

  • -loop 0 : adicione o campo Contagem de loop da extensão Netscape Gif à saída. 0 significa loop infinito, conforme descrito em: link eog , firefox e cromo todo o loop infinitamente por padrão, mesmo sem ele, então não sei mais como é necessário.

  • -delay 5 : o tempo esperado antes de mostrar o próximo quadro, em centésimos de segundo, conforme descrito em: link byte 324. So 100 significa 1 FPS, 5 significa 1 / 0.5 == 20FPS .

Outros argumentos opcionais que você provavelmente deseja:

  • ffmpeg -vf scale=320:-1 : produza a saída 320 pixels de altura. Este é um caso de uso comum para GIFs para a web. Se você remover essa opção, o GIF de saída terá a mesma altura que o vídeo de entrada. A altura original pode ser encontrada, por exemplo, com ffprobe : link e a saída com identify .

  • ffmpeg -ss 00:02:26 -to 00:02:36 : converta o vídeo apenas de 2 a 26 segundos para 02 minutos e 36 segundos. Veja também: link

Mesmo que você reduza a altura e a taxa de quadros, o GIF de saída ainda pode ser maior que o vídeo, pois os formatos de vídeo não-GIF "real" são compactados nos quadros, enquanto o GIF compacta somente quadros individuais.

Um direto:

convert input.mp4 rpi2-bare-metal-blink.gif

funcionou, mas quase matou o meu computador por causa do estouro de memória, e produziu um ouptput 100x maior para o meu arquivo de entrada 2s 1Mb. Talvez um dia o ImageMagick consiga alcançá-lo.

Testado no Ubuntu 17.10.

    
6

gifify é um utilitário baseado em nó tudo-em-um que simplifica a conversão. Depende de nodejs , npm , ffmpeg e imagemagick , que estão todos disponíveis nos repositórios.

Quando tiver npm instalado, você poderá instalar gifify globalmente com:

    npm install -g gifify

Um vídeo pode ser convertido em .GIF com:

    gifify video.mp4 -o video.gif

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 vários minutos para a conversão ser concluída, mesmo com vídeos menores.

  

NOTA: ffmpeg e imagemagick talvez precisem ser compilados com algumas bibliotecas específicas (ou seja, libass e fontconfig de acordo).

    
por ccpizza 03.09.2017 / 21:44