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_format
y 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í yuva
en lugar de yuv
con 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 yuva420p
es más pequeño que si omito la pix_format
opción. Tiene yuva420p
aproximadamente 2/3 del tamaño del archivo de salida que usa el gbrp
modo predeterminado y desordena los colores en la reproducción del navegador.
Así que parece que pix_fmt yuva420p
es el camino a seguir. Pero como realmente no tengo idea sobre espacios de color/formatos de píxeles, mi pregunta es: ¿Qué modo/ pix_format
opció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 yuva420p
en lugar del valor predeterminado gbrp
u otra pix_format
opción?
Y para obtener puntos de bonificación;) si yuva420p
está bien, ¿por qué ffmpeg cambiaría el pix_format
valor predeterminado de yuv
a gbrp
?
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.
Cuadros por segundo