H.264 añadiendo suavizado oscuro incluso en high444 yuv444p

Tengo un archivo PNG con blanco sobre rojo y sin suavizado en absoluto: cada píxel es blanco o rojo, pero cuando lo codifico en MP4 usando ffmpeg -i test.png -profile:v high444 -pix_fmt yuv444p -loop 1 -crf 0 -framerate 30 -c:v libx264 -t 15 test444.mp4la salida, se agregan píxeles oscuros y el color blanco cambia. Vea la captura de pantalla ampliada a continuación para ver antes y después. Reproduje el archivo mp4 con ffplaypor cierto.

ingrese la descripción de la imagen aquí

PNG originales a continuación:

ingrese la descripción de la imagen aquí

¿Puedes compartir el PNG original?
@Mulvya agregó PNG original - gracias
Esto parece ser un problema del escalador, no del codificador. Lo miraré.
@Mulvya, ¿hay alguna manera de deshabilitar o cambiar el escalador para ver si eso lo resuelve? Intenté usar bitexact a la luz de tu comentario, pero no lo resolvió. Gracias
¿Cómo vio y tomó la captura de pantalla de la salida?
@Mulvya Visto usando ffplay test444.mp4y captura de pantalla tomada con Greenshot (tenga en cuenta que una captura de pantalla del archivo PNG no tiene problemas, solo del archivo MP4 resultante). Gracias

Respuestas (1)

Es un artefacto de representación, no un error real.

Ver

ffplay test444.mp4 -vf scale=iw*16:-1:flags=neighbor

y

ffmpeg -i test444.mp4 roundtrip.png

No debería ver píxeles negros.

Actualización : ffplay reduce las muestras de las entradas YUV a 420 antes de la conversión final a RGB.

[swscaler @ 0000000005a82800] bicubic scaler, from yuv444p to yuv420p using MMXEXT

Puede evitar artefactos llamando directamente al filtro de formato de píxeles.

ffplay test444.mp4 -vf format=bgra
Qué extraño: me pregunto por qué el jugador posiblemente decida agregar esos píxeles oscuros.
Creo que el decodificador/pantalla usa yuv420
Así es. Ver solución.