Converta WebM com fundo transparente para todos os formatos de figurinha
Por equipe Charmotion · Atualizado em

Coloque -c:v libvpx-vp9 antes de -i para que o ffmpeg decodifique o canal alfa do WebM e, depois, escolha o encoder de acordo com o destino: libvpx-vp9 com yuva420p para o Telegram, libwebp_anim com -loop 0 para o WhatsApp, palettegen e paletteuse para um GIF, e o muxer APNG para Discord ou iMessage.
Principais pontos
- O decoder VP9 nativo do ffmpeg ignora o canal alfa do WebM; force o libvpx com
-c:v libvpx-vp9antes de-i. - O ffprobe costuma indicar
yuv420pmesmo quando há canal alfa; procure porALPHA_MODE=1. - WebP animado precisa de
-loop 0, porque o libwebp_anim, por padrão, toca só uma vez. - GIF mantém apenas transparência do tipo liga/desliga; APNG e WebP preservam bordas suaves.
- Os cinco comandos desta página foram executados no ffmpeg 7.1.1 com um WebM transparente de 1080×1080, com o canal alfa preservado.
Já tem um personagem ou logo? Veja seu personagem em telas reais de app: telas de splash, onboarding, carregamento e estado vazio. É grátis, roda no navegador e não envia nada.
Por que o ffmpeg descarta a transparência do meu WebM?
Um WebM VP9 transparente armazena o canal alfa como um fluxo de dados separado, ao lado dos frames de cor. O decoder VP9 nativo do ffmpeg lê os frames de cor e ignora o alfa, então os frames saem opacos. É um comportamento antigo, documentado pela comunidade, e ele se repetiu em testes locais no ffmpeg 7.1.1.
A solução é escolher o decoder libvpx para a entrada, colocando a opção de codec antes de -i:
ffmpeg -c:v libvpx-vp9 -i character.webm ...
Colocada depois de -i, a mesma opção seleciona o encoder da saída, e é por isso que muitos comandos a incluem duas vezes. Com a decodificação pelo libvpx, o teste local retornou frames RGBA com 75% dos pixels transparentes, como esperado para um personagem sobre um fundo vazio.
Para verificar se um arquivo tem canal alfa, não confie na linha do formato de pixel. O ffprobe costuma informar pix_fmt=yuv420p para WebMs com alfa; o sinal confiável é a tag de stream ALPHA_MODE=1:
ffprobe -v error -show_streams character.webm | grep -i alpha

Qual comando ffmpeg gera uma figurinha em vídeo do Telegram?
O Telegram pede um .WEBM com VP9, um dos lados com exatamente 512 px, no máximo 3 segundos, até 30 fps, no máximo 256 KB e sem faixa de áudio:
ffmpeg -c:v libvpx-vp9 -i character.webm -t 3 -vf "fps=30,scale=512:512:force_original_aspect_ratio=decrease" -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -crf 40 -deadline good -an sticker.webm
No teste local, isso gerou um arquivo de 512×512, com 3 segundos e 27 KB, com ALPHA_MODE=1. -pix_fmt yuva420p é o que mantém o canal alfa na saída; -an remove o áudio. Para um emoji personalizado de 100×100:
ffmpeg -c:v libvpx-vp9 -i character.webm -t 3 -vf "fps=30,scale=100:100" -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -crf 40 -an emoji.webm
Depois, confira a contagem de bytes:
ls -l sticker.webm # must be <=262144 bytes for Telegram; lower -crf → bigger file, raise crf (e.g. 45-50) or fps 24 to shrink
Se o arquivo passar de 262.144 bytes, aumente o CRF para 45 ou 50, ou reduza para fps=24. Mantenha -deadline good para uma relação entre tamanho e qualidade melhor do que a da configuração realtime. O corte -t 3 se aplica à saída, então uma fonte mais longa é simplesmente aparada; garanta que o ponto de corte não interrompa um movimento. Os passos completos de upload estão em Figurinhas em vídeo do Telegram a partir de uma animação de personagem.
Qual comando gera um WebP animado para o WhatsApp?
O WhatsApp exige WebP animado com exatamente 512×512, até 500 KB, frames de pelo menos 8 ms e duração total de até 10 segundos:
ffmpeg -c:v libvpx-vp9 -i character.webm -vf "fps=15,scale=512:512:force_original_aspect_ratio=decrease,pad=512:512:-1:-1:color=0x00000000" -c:v libwebp_anim -lossless 0 -quality 60 -loop 0 -an sticker.webp
- O filtro
padcentraliza o personagem redimensionado em uma tela transparente de 512×512, então fontes que não são quadradas também atingem o tamanho exato. -lossless 0 -quality 60gera WebP com perdas e com alfa. A documentação do FFmpeg diz: "O alfa é suportado em ambos os modos."-loop 0é obrigatório. O padrão de loop do encoder libwebp_anim é 1, o que faz a animação tocar uma vez.
Saída local: 512×512, animado, com alfa, contagem de loop 0, segundo o webpinfo. Se o arquivo passar de 500 KB, reduza a qualidade para algo perto de 45 ou o fps para perto de 12. Mais detalhes em Figurinhas animadas do WhatsApp: especificações e conversão.
Como fazer um GIF com fundo transparente sem halos?
Gere a paleta a partir dos frames reais e reserve uma entrada para a transparência, em um único filter graph:
ffmpeg -c:v libvpx-vp9 -i character.webm -filter_complex "fps=15,scale=128:128:flags=lanczos,split[a][b];[a]palettegen=reserve_transparent=1[p];[b][p]paletteuse=alpha_threshold=128" -loop 0 emoji.gif
split[a][b]envia os frames para dois ramos.palettegen=reserve_transparent=1cria "uma paleta de no máximo 255 cores" e reserva a última para a transparência, que é o comportamento padrão.paletteuse=alpha_threshold=128deixa totalmente transparentes os pixels abaixo do limite; 128 é o padrão.-loop 0repete para sempre, o padrão do muxer de GIF (-1desativa o loop).
Saída local: 128×128 com transparência. Os halos geralmente aparecem em GIFs feitos sobre um fundo sólido; trabalhar a partir de um alfa real evita isso. Mesmo assim, as bordas continuam com limiar fixo, porque a transparência do GIF é só ligada ou desligada. Quando a plataforma aceitar APNG ou WebP, use esses formatos para ter bordas suaves. Os intervalos entre frames de um GIF não podem ser menores que um centésimo de segundo.
Como fazer um APNG para Discord ou iMessage?
O muxer APNG do ffmpeg grava PNG animado com alfa completo de 8 bits:
ffmpeg -c:v libvpx-vp9 -i character.webm -vf "fps=15,scale=320:320" -plays 0 -f apng sticker.png
-plays 0 repete para sempre; segundo a documentação do FFmpeg, "0 causa um loop infinito; com 1 não há loop." Saída local: 320×320 RGBA. Isso corresponde ao tamanho de sticker de 320×320 do Discord; para o iMessage, mude a escala para 300, 408 ou 618 px para pequeno, normal ou grande.
Os frames APNG não têm perdas, então o tamanho do arquivo cresce com o frame rate, a duração e as dimensões. Os stickers do Discord permitem 512 KiB e os do iMessage, 500 KB; se passar do limite, reduza o fps ou encurte o clipe.
O Discord também limita stickers animados a 5 segundos, então adicione -t 5 depois da entrada se a fonte for mais longa. O ffmpeg grava o APNG com a extensão .png, que é o que as duas plataformas esperam; o arquivo ainda abre como imagem estática em ferramentas que ignoram os blocos de animação APNG, então confira a prévia em um navegador para garantir que ele se move.
O que cada formato preserva?
| Saída | Alfa | Configuração de loop | Encoder ou muxer do ffmpeg | Usado por |
|---|---|---|---|---|
| VP9 WEBM | 8 bits (com yuva420p) | O player faz o loop | libvpx-vp9 | Figurinhas e emoji do Telegram |
| WebP animado | 8 bits | -loop 0 (padrão 1) | libwebp_anim | |
| GIF | Liga/desliga (uma cor) | -loop 0 (padrão) | Encoder GIF + palettegen/paletteuse | Slack, emoji do Discord, iMessage |
| APNG | 8 bits | -plays 0 | Muxer APNG | Stickers do Discord, iMessage |
A fonte importa tanto quanto o comando. Aqui, um WebM VP9 com fundo transparente é o master mais confiável. A partir de um GIF, remova o -c:v libvpx-vp9 do início; você herda as bordas duras dele. Para um .mov com alfa HEVC, remova também essa opção, mas a decodificação de alfa HEVC no ffmpeg não foi verificada nestes testes, então converta a partir do WebM quando tiver os dois.
Como verificar o alfa e o tamanho do arquivo antes do upload?
Faça três verificações em cada arquivo:
- Dimensões e duração:
ffprobe -v error -show_entries stream=width,height:format=duration sticker.webm - Alfa: no WebM, procure
ALPHA_MODE=1ou arraste o WebM para o verificador de vídeo com fundo transparente; no WebP, owebpinfoinforma uma flag de alfa; no GIF e no APNG, abra o arquivo sobre um fundo colorido. - Bytes: use
ls -le compare com o limite em bytes: 262.144 para os 256 KB do Telegram e os emoji de 256 KiB do Discord, 524.288 para os stickers de 512 KiB do Discord.
O Charmotion gera 17 animações a partir de um personagem, mascote ou logo enviado, como arquivo .riv em poucos minutos. WebM transparente (VP9 com alfa) e MOV (HEVC com alfa) em 1080×1080, MP4 e um GIF de 480 px são exportados sob demanda, em cerca de um minuto. Ele não exporta pacotes de figurinhas, mas seu WebM transparente (planos pagos, a partir de US$ 20/mês) é o tipo de master que todo comando desta página espera como character.webm.
Como converter um WebM com fundo transparente para formatos de figurinha com ffmpeg
- Confirme que a fonte tem alfa. Rode o ffprobe e procure a tag
ALPHA_MODE=1. - Decodifique com libvpx. Comece todos os comandos com
ffmpeg -c:v libvpx-vp9 -i character.webm. - Escolha o encoder de destino. Use libvpx-vp9 com yuva420p para o Telegram, libwebp_anim com
-loop 0para o WhatsApp, palettegen/paletteuse para GIF ou-f apng -plays 0para APNG. - Ajuste ao tamanho e à duração da plataforma. Redimensione para 512, 100, 320, 128 ou o tamanho do iMessage, e corte com
-tquando houver limite de duração. - Verifique. Confira dimensões, duração, alfa e contagem de bytes em relação ao limite da plataforma antes do upload.
Perguntas frequentes
Por que o ffprobe mostra yuv420p no meu WebM com fundo transparente?
O ffprobe costuma informar yuv420p em WebMs VP9 que têm alfa, porque o alfa é armazenado separadamente dos frames de cor principais. Procure a tag de stream ALPHA_MODE=1. Se ela estiver presente, decodifique com -c:v libvpx-vp9 antes de -i para obter a transparência.
O WebP com perdas consegue manter a transparência?
Sim. A documentação do libwebp no FFmpeg afirma que o alfa é suportado nos modos com e sem perdas. O modo com perdas, com -quality entre 45 e 60, mantém figurinhas animadas bem abaixo do limite de 500 KB do WhatsApp, enquanto arquivos sem perdas da mesma animação costumam ser bem maiores e mais difíceis de encaixar.
Dá para converter MP4 em uma figurinha com fundo transparente?
Não com transparência real. Um MP4 H.264 padrão não tem canal alfa, então todos os pixels são opacos. Você precisaria remover um fundo sólido por chroma key, o que deixa bordas irregulares. Em vez disso, comece de um WebM com alfa VP9, um master ProRes 4444 ou uma sequência PNG com transparência.
Respostas rápidas deste guia
Fontes
- FFmpeg codecs documentation (libwebp, libvpx), FFmpeg
- FFmpeg filters documentation (palettegen, paletteuse), FFmpeg
- FFmpeg formats documentation (GIF and APNG muxers), FFmpeg
- ffmpeg loses WebM alpha with the default VP9 decoder, VideoHelp Forum
- Stickers: requirements for static, animated and video stickers, Telegram
- WhatsApp stickers: Android README (sticker and pack requirements), WhatsApp on GitHub