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.yuv
y input_decoded.yuv
difieren. Según tengo entendido, cuando convertimos a yuv422p
desde yuv420p
- esencialmente debemos copiar los componentes existentes U
y V
para 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 yuv420p
devolución original ?
420p
a422p
y 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ón420p
a422p
que se realiza está mal, yffmpeg
hace algún tipo de interpolación de hecho. Verificará las diferencias ahora, gracias.PSNR y:inf u:51.837944 v:51.936866
así que solo el croma difiere. ¿Es posible de alguna manera dar instruccionesffmpeg
para usar los bytes simples de copiar / soltar al convertir entreyuv420p
yyuv422p
hacia 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