Exportar cuadros de archivo de video de 10 BPC con ffmpeg

Tengo varios cientos de archivos de video codificados AVC-Intra Class 100 MXF de 1080p, 59,94 fps, 10 bits por canal (bpc). Me gustaría extraer los cuadros de este archivo de video y exportarlos al disco en un formato de imagen sin pérdida de 16 bits. Recientemente me encontré con esta pregunta: convertir video a imágenes de 10 bits

Así que probé esto:

ffmpeg -i "testinput.mxf" -pix_fmt rgb48 _Frames/out%05d.tiff

Pero me encontré con un problema bastante desafortunado que no estoy seguro de cómo resolver. Aunque técnicamente funcionó y exportó todos los cuadros de video a un formato de 16 bpc, el color de estos cuadros aparece descolorido. Esto es lo que quiero decir:

El primer cuadro del archivo de video original (MXF):

ingrese la descripción de la imagen aquí

El primer cuadro exportado con ffmpeg:ingrese la descripción de la imagen aquí

Como puede ver, el color parece desvanecerse y no coincide perfectamente con el cuadro del video original. No sé a qué se debe esto, pero es un problema grave que necesita una solución lo antes posible. Tal vez no estoy usando ffmpeg correctamente, o tal vez sea un error en ffmpeg. ¿Qué debo hacer para extraer correctamente los fotogramas de este códec en particular? Por favor ayuda.

He incluido el archivo MXF original aquí, para sus propios fines de prueba: https://drive.google.com/open?id=1HtCmPGkIZMMMEOAVKMlLksov7QyKzqRE Aquí hay un enlace al resultado de ejecutar el comando que especifiqué anteriormente. Estoy en la última versión de ffmpeg para Windows, versión de ffmpeg N-94150-g231d0c819f Copyright (c) 2000-2019. https://pastebin.com/8UrxJJpY

¿Qué usas para mostrar video y tiff? Preguntando porque aquí mpv lo muestra casi exacto. Por otro lado, podría usar el filtro zscale para hacer la conversión del espacio de color en lugar del filtro de escala. ¿También reduce la escala al convertir a tiff? Si es así, eso podría explicar los colores desteñidos.
@PaulB.Mahol Ya sea en Windows Photo Viewer, VLC media player, Adobe After Effects o Adobe Premiere Pro, los marcos son notablemente diferentes. No rebajé nada.
Entonces, le recomiendo que pruebe el filtro zscale para la conversión de píxeles en FFmpeg.

Respuestas (1)

Intenta usar:

ffmpeg -i "testinput.mxf" -vf scale=in_range=limited:out_range=full -pix_fmt rgba64 path/to/output/out%05d.tiff

en cambio.

Por una razón que va un poco más allá de mi comprensión de la ciencia del color (o tal vez algo extraño con ffmpeg), el resultado del comando inicial fue crear archivos .tiff en el formato "limitado" (15-235) en lugar de "completo" (0 -255) Gama de colores RGB. Usé los osciloscopios en Premiere Pro y DaVinci Resolve to AB entre el primer cuadro de la secuencia .tiff creada y el .mxf original y las diferencias quedaron claras.

Si no está decidido a usar ffmpeg, también pude lograr un resultado comparable al importar el .mxf a una línea de tiempo de Resolve (versión 15 en mi caso) y luego usar el espacio de trabajo "Entregar", seleccionando el 16 Bit, Opciones RGB y .tiff como salida y usando la configuración de rango 'Auto' o 'Full'. Si sigue la ruta Resolver, puede poner en cola cada archivo .mxf y dejar que se exporten hasta que todo esté completo.

Existen ligeras variaciones entre ffmpeg .tiff, Resolve .tiff y el .mxf original pero, a mi entender, el proceso de convertir YUV (el .mxf original) a RGB (la secuencia .tiff) generalmente no es matemáticamente perfecto. Sin embargo, los archivos pasan la prueba del "globo ocular" y deberían funcionar bien a menos que las personas para las que trabaja tengan requisitos de entrega muy estrictos.

Si realmente quieres profundizar en esto, la gente amable (¡e inteligente!) de los foros de Doom9 puede llevarte a AVISynth (que es realmente genial y poderoso pero también bastante complicado) para conversiones muy avanzadas.

¡Espero que esto ayude!

La entrada es YUV de rango de color completo (yuv422p10le (pc, bt709, progresivo)), mientras que el comando que proporcionó obliga a interpretarlo como limitado/tv.
@PaulB.Mahol Agradezco sus comentarios. En teoría tienes toda la razón. En la práctica ese no fue el caso. ¿Quizás algo es extraño con la información del encabezado en el .mxf original? También probé scale=in_range=full y escale solo con el parámetro out_range=full (omitiendo in_range) y la combinación anterior fue la única que funcionó correctamente. Además, di una segunda opción para realizar la tarea. ¡Gracias!
Su código ffmpeg no es una solución; el resultado no es diferente al anterior. Es imperativo que esto se haga con ffmpeg por motivos de velocidad. Todavía no entiendo cómo decodificar correctamente este archivo de video.
De acuerdo. La mejor de las suertes para ti