Extractos FFMPEG intra-cuadros I, P, B cuadros

4

¿Hay alguna forma de extraer los intra-cuadros y preservarlos tal como están desde FFMPEG o un programa similar? Sé que puedes extraer cuadros a una secuencia de imágenes JPEG usando -f image2. Pero esas son imágenes completas de cada uno de los cuadros. Me gustaría exportar solo la imagen del cambio en movimiento, para que los cuadros P y B solo muestren el cambio en movimiento excluyendo o enmascarando el área no cambiada de las imágenes.

es posible?

El comando básico de exportación de cuadros que estoy usando. Esto me da imágenes enmarcadas completas de cada cuadro, en el FPS especificado.

ffmpeg -i input.mp4 -r 12 -an -b 1024k -y -f image2 frame%4d.jpg

Espero exportar los cuadros para tener una carpeta de cuadros donde el primer cuadro sería una imagen completa, el siguiente cuadro sería solo los datos de la imagen donde la imagen necesita ser redibujada. Exponer la redundancia temporal entre los dos cuadros (¿no es esto lo que hacen los cuadros I, P, B?)

ndmweb
fuente

Respuestas:

5

Para extraer un tipo de marco certin use el filtro select:

select=eq(pict_type\,<x>)

donde <x>es uno de los siguientes:pict_type (video only) the type of the filtered frame, can assume one of the following values: I, P, B, S, SI, SP, BI

Así por ejemplo:

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4

Para comprender más sobre el resultado, agregue el showinfofiltro:

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B),showinfo[out]' b.frames.mp4

P.EJ
fuente
1
El [in]y [out]no es necesario en el primer ejemplo.
slhck
Buena respuesta, pero recomiendo proporcionar enlaces a la documentación oficial para cada filtro mencionado: selecty showinfo.
llogan
Si bien esto funciona, esperaba una solución que exportara todos los tipos de fotogramas, pero conservara los fotogramas tal como están (algunos son solo el área de la imagen que debe volver a dibujarse y otros son
redibujos
1
@ndmweb No puede exportar un marco no intra "tal como está". No hay información de imagen válida: un macrobloque / cuadro P o B, dicho simplemente, solo almacena las diferencias entre la siguiente imagen. Me temo que para hacer lo que quieras, deberías buscar codificarlo con MATLAB o herramientas similares. Al menos no conozco ninguna solución existente.
slhck
4

Los marcos P y B generalmente no contienen datos de imágenes nuevas para cada una de las áreas que han cambiado. Más bien, la imagen se divide en macrobloques de diferentes tipos. Algunos tipos de macrobloques contienen nuevos datos de imagen, pero la mayoría calcula el contenido en base a otras imágenes de referencia y vectores de movimiento.

No es exactamente lo que estaba pidiendo, pero usará el color para mostrarle el tipo de cada macrobloque:

ffmpeg -debug vis_mb_type -i input.mp4 output.mp4

o

ffplay -debug vis_mb_type input.mp4

Esto también le mostrará los vectores de movimiento:

ffplay -debug vis_mb_type -vismv 7 input.mp4

Consulte el enlace para obtener más información sobre los colores de cada MB:

Depuración de documentación de Macroblocks y Motionsvectors FFMpeg

mark4o
fuente
Buena información para tener, aunque solo sea para comprender que un marco completo no solo tiene que consistir en macrobloques intracodificados.
slhck