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 ?

420pa422py 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ón420pa422pque se realiza está mal, yffmpeghace algún tipo de interpolación de hecho. Verificará las diferencias ahora, gracias.PSNR y:inf u:51.837944 v:51.936866así que solo el croma difiere. ¿Es posible de alguna manera dar instruccionesffmpegpara usar los bytes simples de copiar / soltar al convertir entreyuv420pyyuv422phacia adelante / hacia atrás?Respuestas:
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.
fuente