¿Es seguro usar la opción yuva420 pix_format con ffmpeg para codificar videos webm?

Estoy codificando secuencias de imágenes png en formatos webm y mp4 usando ffmpeg. Mi objetivo es lograr videos sin pérdida de percepción, con el tamaño de archivo más pequeño que pueda lograr razonablemente.

Los videos webm que produje funcionaron bien y se podían reproducir en muchos navegadores, hasta que cambié a una versión posterior de ffmpeg, que compilé desde la fuente. (La versión ffmpeg informada es N-91380-g46fb150, lo que sea que eso signifique).

Los videos webm de salida aún se reproducían bien en VLC, pero los navegadores como Chromium y Opera los mostraban con los colores totalmente desordenados. Parece que el azul en el video se reemplaza en su mayoría con verde; de ​​todos modos, se ve muy raro.

Verifiqué el modo de color con ffprobe en los videos producidos con versiones antiguas y nuevas de ffmpeg:

Los viejos videos ffmpeg webm que funcionaban en todas partes:
vp9 (Profile 1), yuv444p(tv)
Los nuevos videos ffmpeg webm, que funcionan en VLC, pero tienen colores desordenados en los navegadores:
vp9 (Profile 1), gbrp(pc, gbr/unknown/unknown, progressive)

El comando ffmpeg que estaba usando no especificaba ninguno pix_format, y estoy bastante seguro de que era algo así en las versiones antiguas y nuevas de ffmpeg:
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -i my_audio.flac -c:v libvpx-vp9 -b:v 0 -tile-columns 2 -crf 18 -c:a libopus -b:a 128k -r 30 -g 300 -y my_video.webm

Leí en alguna parte pix_formaty probé esto (tenga en cuenta la opción yuva420p):
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -i my_audio.flac -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -tile-columns 2 -crf 18 -c:a libopus -b:a 128k -r 30 -g 300 -y my_video.webm

Elegí yuvaen lugar de yuvcon la esperanza de habilitar el canal alfa, porque mis imágenes png de entrada tienen transparencia. Parecía funcionar... los videos ahora se reproducen bien en los navegadores, como con la versión anterior de ffmpeg. En comparación con el resultado anterior de ffmpeg con default pix_format, ffprobe muestra una ligera diferencia. informa:
vp9 (Profile 0), yuv420p(tv, progressive)yalpha_mode: 1

Curiosamente, el tamaño del archivo webm de salida que se usa yuva420pes más pequeño que si omito la pix_formatopción. Tiene yuva420paproximadamente 2/3 del tamaño del archivo de salida que usa el gbrpmodo predeterminado y desordena los colores en la reproducción del navegador.

Así que parece que pix_fmt yuva420pes el camino a seguir. Pero como realmente no tengo idea sobre espacios de color/formatos de píxeles, mi pregunta es: ¿Qué modo/ pix_formatopción de color debo elegir, dado que quiero webms de alta calidad, tamaño de archivo pequeño y compatibilidad con muchos navegadores? ¿Hay algún inconveniente con el uso yuva420pen lugar del valor predeterminado gbrpu otra pix_formatopción?

Y para obtener puntos de bonificación;) si yuva420pestá bien, ¿por qué ffmpeg cambiaría el pix_formatvalor predeterminado de yuva gbrp?

Respuestas (1)

La codificación de color YUV con submuestreo de croma 4:2:0 es el único formato de píxel ampliamente seguro para la reproducción web, aunque para ciertos códecs, es posible que se admitan otros formatos de píxel.

FFmpeg selecciona automáticamente el formato de píxel para la salida, ya que no todos los codificadores admiten todos los formatos de píxel. Seleccionará el formato de píxel que mejor conserve la profundidad de bits de origen, el esquema de muestreo de croma y el esquema de codificación de color, entre los formatos admitidos por el codificador. Los PNG tienen formato de píxeles RGB y, hasta hace dos años, ffmpeg no admitía la codificación de formatos RGB para los codificadores VPx, por lo que seleccionaría un formato YUV con croma completo (4:4:4). Dado que RGB pasó a ser compatible con FFmpeg para VPx, seleccionará una variante RGB como gbrp.

La selección automática se anula al especificar manualmente -pix_fmt.

Las transmisiones YUV se pueden comprimir de manera más eficiente que RGB.

Gracias, Gyan... sus comentarios tienen suficiente sentido, así que acepto esta respuesta, aunque considero que la opción predeterminada de submuestreo de croma de ffmpeg para la codificación de PNG a VP9 es poco útil y confusa.