¿Por qué obtengo videos pixelados en FFmpeg al convertirlos a GIF?

¿Por qué obtengo videos pixelados en FFmpeg al convertirlos a GIF?

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:

ingrese la descripción de la imagen aquí

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 -vfopción para corregir la velocidad de fotogramas con errores. La conversión con errores se encuentra a continuación.

ingrese la descripción de la imagen aquí

¿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- Utilizar libvpx-vp9decodificador. 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.

Producción:
ingrese la descripción de la imagen aquí


Comentarios sobre el canal alfa (transparencia) de la entrada:

Al ejecutar ffprobe connecting.webmmuestra:

  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 : 1Metadatos 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.

información relacionada