Como converter um vídeo MP4 para um GIF para publicar no README.md do seu repositório Github
Dica publicada em Linux / Multimídia
Como converter um vídeo MP4 para um GIF para publicar no README.md do seu repositório Github
Para essa dica usarei um exemplo da vida real. Eu gravei um vídeo de cerca de 35 segundos para demonstrar um projeto de código aberto que estou desenvolvendo. Gostaria de publicar esse vídeo no README.md do meu repositório Github, mas o Github não aceita vídeos MP4. Então, a solução é converter o vídeo para um GIF.
Eis o vídeo:
ls -lh ssh-copilot-bot.mp4
-rw-r--r-- 1 fabio vboxusers 15M jun 7 14:00 /home/fabio/ssh-copilot-bot.mp4
Vamos nos aprofundar nas informações do vídeo:
ffprobe ssh-copilot-bot.mp4
O objetivo principal é reduzir drasticamente o tamanho do arquivo (de 15MB para algo abaixo de 5MB, idealmente) e as dimensões, mantendo uma boa qualidade visual. Um GIF de 1080x1920 com 60fps seria gigantesco e lento para carregar.
A melhor maneira de fazer isso com ffmpeg é um processo de duas etapas que cria uma paleta de cores otimizada para o seu vídeo específico. Isso resulta em um GIF com qualidade muito superior e tamanho menor do que uma conversão direta.
ffmpeg -i ssh-copilot-bot.mp4 -vf "fps=12,scale=480:-1:flags=lanczos,palettegen" palette.png
O que este comando faz:
Verificando:
file palette.png
palette.png: PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
ffmpeg -i ssh-copilot-bot.mp4 -i palette.png -lavfi "fps=12,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" ssh-copilot-bot.gif
O que este comando faz:
Ao final, você terá um arquivo ssh-copilot-bot.gif com um tamanho muito mais adequado para o GitHub. Não se esqueça de apagar o palette.png, que não será mais necessário.
ls -lh ssh-copilot-bot.gif -rw-r--r-- 1 fabio vboxusers 25M jun 7 14:13 ssh-copilot-bot.gif
Agora, o GIF está pronto para ser adicionado ao seu README.md. Você pode fazer isso com a seguinte sintaxe Markdown:
Ah, e se quiser conferir meu projeto SSH Copilot Bot, está convidado! Trata-se de um bot que roda via Telegram que acessa e gerencia seus servidores Linux através de conexões SSH, tudo de forma segura e prática. Confira o repositório para mais detalhes e como contribuir: https://github.com/fberbert/ssh-copilot-bot.
Eis o vídeo:
ls -lh ssh-copilot-bot.mp4
-rw-r--r-- 1 fabio vboxusers 15M jun 7 14:00 /home/fabio/ssh-copilot-bot.mp4
Vamos nos aprofundar nas informações do vídeo:
ffprobe ssh-copilot-bot.mp4
ffprobe version 4.4.2-0ubuntu0.22.04.1+esm7 Copyright (c) 2007-2021 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1+esm7 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/fabio/obs/ssh-copilot-bot.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.76.100
Duration: 00:00:37.16, start: 0.000000, bitrate: 3343 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1080x1920 [SAR 1:1 DAR 9:16], 3329 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 2 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
O objetivo principal é reduzir drasticamente o tamanho do arquivo (de 15MB para algo abaixo de 5MB, idealmente) e as dimensões, mantendo uma boa qualidade visual. Um GIF de 1080x1920 com 60fps seria gigantesco e lento para carregar.
A melhor maneira de fazer isso com ffmpeg é um processo de duas etapas que cria uma paleta de cores otimizada para o seu vídeo específico. Isso resulta em um GIF com qualidade muito superior e tamanho menor do que uma conversão direta.
Passo 1: Gerar a Paleta de Cores Otimizada
Este comando primeiro analisa o vídeo, reduzindo a taxa de quadros (FPS) e a resolução, e depois gera um arquivo "palette.png" contendo as cores ideais para a criação do GIF.ffmpeg -i ssh-copilot-bot.mp4 -vf "fps=12,scale=480:-1:flags=lanczos,palettegen" palette.png
O que este comando faz:
- -i ~/obs/ssh-copilot-bot.mp4: Define o seu vídeo como entrada.
- -vf "...": Aplica uma cadeia de filtros de vídeo:
- fps=12: Reduz a taxa de quadros de 60 para 12. É um ótimo equilíbrio entre fluidez e tamanho do arquivo para um README.
- scale=480:-1: Redimensiona o vídeo para ter 480 pixels de largura. O -1 faz com que a altura seja calculada automaticamente, mantendo a proporção original (ficará 480x854).
- flags=lanczos: Usa um algoritmo de redimensionamento de alta qualidade.
- palettegen: O filtro principal que gera o arquivo palette.png.
Verificando:
file palette.png
palette.png: PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
Passo 2: Criar o GIF Final Usando a Paleta
Agora, o ffmpeg usará o vídeo original e o palette.png para construir o GIF final.ffmpeg -i ssh-copilot-bot.mp4 -i palette.png -lavfi "fps=12,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" ssh-copilot-bot.gif
O que este comando faz:
- -i ~/obs/ssh-copilot-bot.mp4: Define seu vídeo como a primeira entrada.
- -i palette.png: Define a paleta gerada como a segunda entrada.
- -lavfi "...": Usa um filtro complexo: Aplica os mesmos filtros fps e scale da etapa anterior; [x];[x][1:v]paletteuse: Pega o resultado do vídeo filtrado e aplica a paleta (paletteuse) para criar o GIF.
- ssh-copilot-bot.gif: O nome do seu arquivo de saída.
Ao final, você terá um arquivo ssh-copilot-bot.gif com um tamanho muito mais adequado para o GitHub. Não se esqueça de apagar o palette.png, que não será mais necessário.
ls -lh ssh-copilot-bot.gif -rw-r--r-- 1 fabio vboxusers 25M jun 7 14:13 ssh-copilot-bot.gif
Opções para Personalizar
- Para um GIF menor (em dimensões e tamanho): Altere o valor de scale. Por exemplo, scale=360:-1 para uma largura de 360 pixels.
- Para um GIF mais suave (e maior): Aumente o fps para 15. Não recomendo mais do que isso.
Agora, o GIF está pronto para ser adicionado ao seu README.md. Você pode fazer isso com a seguinte sintaxe Markdown:

Ah, e se quiser conferir meu projeto SSH Copilot Bot, está convidado! Trata-se de um bot que roda via Telegram que acessa e gerencia seus servidores Linux através de conexões SSH, tudo de forma segura e prática. Confira o repositório para mais detalhes e como contribuir: https://github.com/fberbert/ssh-copilot-bot.
______________________________________________________________________
Inscreva-se no meu Canal: https://www.youtube.com/@LinuxDicasPro
Repositório GitHub do Canal: https://github.com/LinuxDicasPro
Grupo do Telegram: https://t.me/LinuxDicasPro