ffmpeg yuv420p a yuv422p y viceversa

0

Así que tengo un video sin formato en formato yuv420p input.yuv, y sé su tamaño de cuadro. Ejecuto 2 comandos:

ffmpeg -pix_fmt yuv420p -s 352x288 -i input.yuv -pix_fmt yuv422p input_yuv422p.yuv

y entonces

ffmpeg -pix_fmt yuv422p -s 352x288 -i input_yuv422p.yuv -pix_fmt yuv420p input_decoded.yuv

El problema es que los archivos input.yuvy input_decoded.yuvdifieren. Según tengo entendido, cuando convertimos a yuv422pdesde yuv420p- esencialmente debemos copiar los componentes existentes Uy Vpara producir más muestras para completar; luego, al volver a convertir, simplemente deberíamos dejar caer estas muestras y recibir el archivo original, pero eso no es lo que veo. ¿Estoy haciendo algo mal aquí, y es posible recibir la yuv420pdevolución original ?

IvanIvanovich
fuente
1
Errores de redondeo, supongo. ¿Puedes cuantificar las diferencias en luma / croma?
Slhck
Hm, si nos limitamos a copiar bytes cuando se hace 420pa 422py la caída de bytes al convertir la espalda - no debe haber ninguna fuente de posibles errores de redondeo. Tal vez mi suposición acerca de la forma en la conversión 420pa 422pque se realiza está mal, y ffmpeghace algún tipo de interpolación de hecho. Verificará las diferencias ahora, gracias.
IvanIvanovich
Entonces obtengo este PSNR entre el original y el convertido de nuevo: PSNR y:inf u:51.837944 v:51.936866así que solo el croma difiere. ¿Es posible de alguna manera dar instrucciones ffmpegpara usar los bytes simples de copiar / soltar al convertir entre yuv420py yuv422phacia adelante / hacia atrás?
IvanIvanovich
No, no lo creo. En principio, lo que se necesitaría sería copiar los bytes, pero la imagen se decodifica y codifica de nuevo al nuevo formato, de ahí posibles errores de interpolación. Puede verificar un volcado hexadecimal de un pequeño ejemplo (o usar rawpixels.net ) para ver de dónde viene el error o qué tan grande es.
Slhck
Sí, supongo que ffmpeg realiza alguna interpolación al realizar un muestreo superior de 420 a 422 y antialiasing al reducir el muestreo de 422 a 420, al menos ese es el comportamiento predeterminado de una biblioteca Matlab similar: mathworks.com/help/vision/ref/chromaresampling.html . Y parece que esta biblioteca realmente tiene las opciones para lograr el comportamiento que quería, lo que no daría lugar a diferencias entre el yuv420p original y el "convertido de nuevo", en caso de que alguien también lo necesite. ¿Cómo cierro esta pregunta como respondida?)
IvanIvanovich

Respuestas:

0

Parece que ffmpeg realiza alguna interpolación al realizar un muestreo superior de 420 a 422 y antialiasing al reducir de 422 a 420, al menos ese es el comportamiento predeterminado de una biblioteca Matlab similar: mathworks.com/help/vision/ref/chromaresampling.html. Y parece que esta biblioteca realmente tiene las opciones para lograr el comportamiento de simplemente copiar / soltar valores de crominancia que no darían lugar a diferencias entre el yuv420p original y el "convertido de nuevo", en caso de que alguien también lo necesite.

IvanIvanovich
fuente