Pular para o conteúdo
charmotion

Converta WebM com fundo transparente para todos os formatos de figurinha

Por equipe Charmotion · Atualizado em

Ilustração de capa do guia de figurinhas e emoji: converta WebM com fundo transparente para todos os formatos de figurinha, com personagens de demonstração do Charmotion

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-vp9 antes de -i.
  • O ffprobe costuma indicar yuv420p mesmo quando há canal alfa; procure por ALPHA_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
Comparação ampliada entre uma borda suave com canal alfa e uma borda serrilhada de GIF de 1 bit sobre um gradiente

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 pad centraliza 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 60 gera 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=1 cria "uma paleta de no máximo 255 cores" e reserva a última para a transparência, que é o comportamento padrão.
  • paletteuse=alpha_threshold=128 deixa totalmente transparentes os pixels abaixo do limite; 128 é o padrão.
  • -loop 0 repete para sempre, o padrão do muxer de GIF (-1 desativa 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ídaAlfaConfiguração de loopEncoder ou muxer do ffmpegUsado por
VP9 WEBM8 bits (com yuva420p)O player faz o looplibvpx-vp9Figurinhas e emoji do Telegram
WebP animado8 bits-loop 0 (padrão 1)libwebp_animWhatsApp
GIFLiga/desliga (uma cor)-loop 0 (padrão)Encoder GIF + palettegen/paletteuseSlack, emoji do Discord, iMessage
APNG8 bits-plays 0Muxer APNGStickers 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:

  1. Dimensões e duração: ffprobe -v error -show_entries stream=width,height:format=duration sticker.webm
  2. Alfa: no WebM, procure ALPHA_MODE=1 ou arraste o WebM para o verificador de vídeo com fundo transparente; no WebP, o webpinfo informa uma flag de alfa; no GIF e no APNG, abra o arquivo sobre um fundo colorido.
  3. Bytes: use ls -l e 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

  1. Confirme que a fonte tem alfa. Rode o ffprobe e procure a tag ALPHA_MODE=1.
  2. Decodifique com libvpx. Comece todos os comandos com ffmpeg -c:v libvpx-vp9 -i character.webm.
  3. Escolha o encoder de destino. Use libvpx-vp9 com yuva420p para o Telegram, libwebp_anim com -loop 0 para o WhatsApp, palettegen/paletteuse para GIF ou -f apng -plays 0 para APNG.
  4. Ajuste ao tamanho e à duração da plataforma. Redimensione para 512, 100, 320, 128 ou o tamanho do iMessage, e corte com -t quando houver limite de duração.
  5. 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

Guias relacionados