
Quiero codificar este video WEBM:
He notado el hecho de que FFmpeg se ha destacado en lo que respecta a la calidad.
Estoy haciendo WEBM a GIF, si eso ayuda. Y casi todos los convertidores en línea usan FFmpeg internamente, lo que resulta en la misma pérdida de calidad.
Observe que el primer cuadro de la codificación FFmpeg está muy pixelado:
Aquí está el comando que he estado usando para la codificación.
ffmpeg -i connecting.webm -vf "fps=40,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
Incluso si convierto la fuente WEBM a MP4 en lugar de GIF, la pérdida de calidad persiste.
Y tuve que agregar la -vf
opción para corregir la velocidad de fotogramas con errores. La conversión con errores se encuentra a continuación.
¿Por qué está pasando esto?
Respuesta1
El archivo de entrada WebM original tiene un canal alfa (transparencia).
Una posible solución es superponer el vídeo semitransparente sobre un fondo negro:
ffmpeg -y -c:v libvpx-vp9 -i connecting.webm -vf "[v:0]fps=40[v0];color=black:rate=40[b];[b][v0]scale2ref[b][v0];[b]setsar=1[b];[b][v0]overlay=shortest=1,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
Al ignorar el alfa, los vídeos se pixelan, porque la suavidad se crea mediante el cambio gradual de la transparencia alrededor del objeto.
-c:v libvpx-vp9
- Utilizarlibvpx-vp9
decodificador. Lo necesitamos porque el decodificador predeterminado ignora el canal alfa (transparencia).color=black:rate=40[b]
- Crea un video en negro a 40 fps con una resolución nominal.[b][v0]scale2ref[b][v0]
- Escala el video en negro a la resolución del video de entrada.[b]setsar=1[b]
- Establece la relación de aspecto del vídeo negro en 1:1.[b][v0]overlay=shortest=1
- superpone el vídeo de entrada sobre el vídeo negro.scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse"
- Escala, genera paleta y úsala, como en la pregunta.
Comentarios sobre el canal alfa (transparencia) de la entrada:
Al ejecutar ffprobe connecting.webm
muestra:
Stream #0:0: Video: vp9 (Profile 0), yuv420p(tv, progressive), 400x400, SAR 1:1 DAR 1:1, 60 fps, 60 tbr, 1k tbn (default)
Metadata:
alpha_mode : 1
ENCODER : Lavc58.134.100 libvpx-vp9
DURATION : 00:00:01.067000000
Los alpha_mode : 1
Metadatos marcan que hay un canal alfa (transparencia).
Creo que es algún tipo de configuración "especial" (normalmente esperaría que el formato de píxeles fuera yuva420p y no yuv420p cuando hay un canal alfa).
Existe alguna documentación sobre elalpha_mode : 1
relacionado conCodificación VP8.