Convierte WebM con fondo transparente a cualquier formato de sticker
Por el equipo de Charmotion · Actualizado el

Pon -c:v libvpx-vp9 antes de -i para que ffmpeg decodifique el canal alfa del WebM y luego elige el codificador según el destino: libvpx-vp9 con yuva420p para Telegram, libwebp_anim con -loop 0 para WhatsApp, palettegen y paletteuse para un GIF, y el muxer APNG para Discord o iMessage.
Puntos clave
- El decodificador VP9 integrado de ffmpeg ignora el canal alfa del WebM; fuerza libvpx con
-c:v libvpx-vp9antes de-i. - ffprobe suele indicar
yuv420paunque haya canal alfa; buscaALPHA_MODE=1. - El WebP animado necesita
-loop 0, porque libwebp_anim lo reproduce una sola vez de forma predeterminada. - El GIF solo conserva transparencia de todo o nada; APNG y WebP conservan los bordes suaves.
- Los cinco comandos de esta guía se ejecutaron en ffmpeg 7.1.1 sobre un WebM transparente de 1080×1080 con el canal alfa conservado.
¿Ya tienes un personaje o logo? Mira tu personaje en pantallas reales de una app: pantallas de splash, onboarding, carga y estado vacío. Es gratis, funciona en tu navegador y no sube nada.
¿Por qué ffmpeg elimina la transparencia de mi WebM?
Un WebM VP9 transparente guarda el canal alfa como un flujo de datos separado junto a los fotogramas de color. El decodificador VP9 nativo de ffmpeg lee los fotogramas de color e ignora el alfa, así que los fotogramas salen opacos. Es un comportamiento conocido desde hace tiempo y documentado por la comunidad, y se reprodujo en pruebas locales con ffmpeg 7.1.1.
La solución es elegir el decodificador libvpx para la entrada colocando la opción de códec antes de -i:
ffmpeg -c:v libvpx-vp9 -i character.webm ...
Si la colocas después de -i, la misma opción selecciona en cambio el codificador de la salida, y por eso muchos comandos la incluyen dos veces. Con la decodificación de libvpx, la prueba local devolvió fotogramas RGBA en los que el 75 % de los píxeles eran transparentes, como se espera de un personaje sobre un fondo vacío.
Para comprobar si un archivo tiene canal alfa, no te fíes de la línea del formato de píxel. ffprobe suele indicar pix_fmt=yuv420p en los WebM con alfa; la señal fiable es la etiqueta de flujo ALPHA_MODE=1:
ffprobe -v error -show_streams character.webm | grep -i alpha

¿Qué comando de ffmpeg crea un sticker de video para Telegram?
Telegram pide un .WEBM con VP9, con un lado de exactamente 512 px, de 3 segundos como máximo, hasta 30 fps, 256 KB como máximo y sin pista de audio:
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
En la prueba local, esto produjo un archivo de 512×512, de exactamente 3 segundos y 27 KB, con ALPHA_MODE=1. -pix_fmt yuva420p es lo que conserva el alfa en la salida; -an elimina el audio. Para un 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
Después, revisa el número 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
Si el archivo supera los 262 144 bytes, sube el CRF a 45 o 50, o baja a fps=24. Mantén -deadline good para lograr una mejor relación entre peso y calidad que con el ajuste realtime. El corte -t 3 se aplica a la salida, así que una fuente más larga simplemente se recorta; asegúrate de que el punto de corte no interrumpa un movimiento. Los pasos completos de carga están en Stickers de video para Telegram a partir de una animación de personaje.
¿Qué comando crea un WebP animado para WhatsApp?
WhatsApp necesita un WebP animado de exactamente 512×512, de 500 KB o menos, con fotogramas de al menos 8 ms y una duración total de 10 segundos o menos:
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
- El filtro
padcentra el personaje escalado en un lienzo transparente de 512×512, así que las fuentes que no son cuadradas también cumplen el tamaño exacto. -lossless 0 -quality 60es WebP con pérdida y con alfa. La documentación de FFmpeg dice: "El alfa es compatible con cualquiera de los dos modos".-loop 0es obligatorio. El valor predeterminado de loop del codificador libwebp_anim es 1, que reproduce la animación una sola vez.
Salida local: 512×512, animado, con alfa y conteo de loop 0, según webpinfo. Si el archivo supera los 500 KB, baja la calidad hacia 45 o los fps hacia 12. Más información en Stickers animados de WhatsApp: especificaciones y conversión.
¿Cómo hago un GIF transparente sin halos?
Genera la paleta a partir de los fotogramas reales y reserva una entrada para la transparencia, todo en un solo grafo de filtros:
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]envía los fotogramas a dos ramas.palettegen=reserve_transparent=1crea "una paleta de 255 colores como máximo" y reserva el último para la transparencia, que es el comportamiento predeterminado.paletteuse=alpha_threshold=128vuelve totalmente transparentes los píxeles por debajo del umbral; 128 es el valor predeterminado.-loop 0repite en loop indefinidamente, el valor predeterminado del muxer de GIF (-1desactiva el loop).
Salida local: 128×128 con transparencia. Los halos suelen aparecer en GIF creados sobre un fondo sólido; trabajar a partir de un alfa real lo evita. Aun así, los bordes se umbralizan, porque en un GIF la transparencia es todo o nada. Si la plataforma acepta APNG o WebP, úsalos para obtener bordes suaves. Los retrasos entre fotogramas de un GIF no pueden ser menores a una centésima de segundo.
¿Cómo hago un APNG para Discord o iMessage?
El muxer de APNG de ffmpeg escribe PNG animados con 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 repite en loop indefinidamente; según la documentación de FFmpeg, "0 provoca un loop infinito; con 1 no hay loop". Salida local: 320×320 RGBA. Coincide con el tamaño de sticker de Discord de 320×320; para iMessage, cambia la escala a 300, 408 o 618 px para tamaño pequeño, normal o grande.
Los fotogramas APNG no tienen pérdida, así que el peso del archivo aumenta con la frecuencia de cuadros, la duración y las dimensiones. Los stickers de Discord admiten 512 KiB y los de iMessage 500 KB, así que baja los fps o acorta el clip si te pasas.
Discord también limita los stickers animados a 5 segundos, así que agrega -t 5 después de la entrada si la fuente es más larga. ffmpeg escribe el APNG con extensión .png, que es lo que esperan ambas plataformas; aun así, el archivo se abre como imagen fija en herramientas que ignoran los bloques de animación APNG, así que ábrelo en un navegador para confirmar que se mueve.
¿Qué conserva cada formato?
| Salida | Alfa | Ajuste de loop | Codificador o muxer de ffmpeg | Lo usa |
|---|---|---|---|---|
| VP9 WEBM | 8 bits (con yuva420p) | El reproductor lo repite | libvpx-vp9 | Stickers y emoji de Telegram |
| WebP animado | 8 bits | -loop 0 (predeterminado: 1) | libwebp_anim | |
| GIF | Todo o nada (un color) | -loop 0 (predeterminado) | Codificador GIF + palettegen/paletteuse | Slack, emoji de Discord, iMessage |
| APNG | 8 bits | -plays 0 | Muxer de APNG | Stickers de Discord, iMessage |
La fuente importa tanto como el comando. Un WebM VP9 transparente es el máster más confiable en este caso. Si partes de un GIF, quita el -c:v libvpx-vp9 inicial; heredarás sus bordes duros. Para un .mov con alfa HEVC, quita también esa opción, pero la decodificación del alfa HEVC en ffmpeg no se verificó en estas pruebas, así que convierte desde el WebM cuando tengas ambos.
¿Cómo reviso el alfa y el peso del archivo antes de subirlo?
Haz tres comprobaciones en cada archivo:
- Dimensiones y duración:
ffprobe -v error -show_entries stream=width,height:format=duration sticker.webm - Alfa: en WebM, busca
ALPHA_MODE=1o arrastra el WebM al verificador de video transparente; en WebP,webpinfomuestra un indicador de alfa; en GIF y APNG, abre el archivo sobre un fondo de color. - Bytes:
ls -ly compara con el límite en bytes: 262 144 para los 256 KB de Telegram y los emoji de 256 KiB de Discord, 524 288 para los stickers de 512 KiB de Discord.
Charmotion genera 17 animaciones a partir de un personaje, mascota o logo que subes, como archivo .riv en pocos minutos. WebM transparente (VP9 con alfa) y MOV (HEVC con alfa) a 1080×1080, MP4 y un GIF de 480 px se exportan bajo demanda, en alrededor de un minuto. No exporta packs de stickers, pero su WebM transparente (planes de pago, desde $20/mes) es el tipo de master que todos los comandos de esta página esperan como character.webm.
Cómo convertir un WebM transparente a formatos de sticker con ffmpeg
- Confirma que la fuente tiene alfa. Ejecuta ffprobe y busca la etiqueta
ALPHA_MODE=1. - Decodifica con libvpx. Empieza cada comando con
ffmpeg -c:v libvpx-vp9 -i character.webm. - Elige el codificador de destino. Usa libvpx-vp9 con yuva420p para Telegram, libwebp_anim con
-loop 0para WhatsApp, palettegen/paletteuse para GIF, o-f apng -plays 0para APNG. - Ajusta el tamaño y la duración a la plataforma. Escala a 512, 100, 320, 128 o al tamaño de iMessage, y recorta con
-tcuando haya un límite de duración. - Verifica. Revisa las dimensiones, la duración, el alfa y el número de bytes frente al límite de la plataforma antes de subir el archivo.
Preguntas frecuentes
¿Por qué ffprobe dice yuv420p para mi WebM transparente?
ffprobe suele mostrar yuv420p en WebM VP9 que sí llevan alfa, porque el alfa se guarda aparte de los fotogramas de color principales. Busca mejor la etiqueta de flujo ALPHA_MODE=1. Si está presente, decodifica con -c:v libvpx-vp9 antes de -i para obtener la transparencia.
¿El WebP con pérdida puede conservar la transparencia?
Sí. La documentación de libwebp en FFmpeg indica que el alfa es compatible tanto en modo con pérdida como sin pérdida. El modo con pérdida, con -quality entre 45 y 60, mantiene los stickers animados muy por debajo del límite de 500 KB de WhatsApp, mientras que los archivos sin pérdida de la misma animación suelen ser mucho más pesados y difíciles de ajustar.
¿Puedo convertir un MP4 en un sticker transparente?
No con transparencia real. Un MP4 H.264 estándar no tiene canal alfa, así que todos los píxeles son opacos. Tendrías que eliminar un fondo sólido con chroma key, lo que deja bordes irregulares. En su lugar, parte de un WebM VP9 con alfa, un máster ProRes 4444 o una secuencia PNG con transparencia.
Respuestas rápidas de esta guía
Fuentes
- 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