¿Cómo extraigo las marcas de tiempo asociadas con los extractos de cuadros ffmpeg de un video con la opción -r?

12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

Es el comando que estoy usando para extraer marcos y funciona como esperaba. Sin embargo, también me gustaría ver las marcas de tiempo de los cuadros. Con cualquier precisión. 100 milisegundos es lo suficientemente bueno para mí. ¿Puede ffmpeg hacer esto?

Proporcionando detalles adicionales,

Cuando ejecuto el comando anterior, obtengo alrededor de 100 JPEG, creo que hay una correspondencia de 1 a 1 (o muchos a 1) entre estos JPEG y los fotogramas del video. Me gustaría saber la marca de tiempo del marco que se emitió como una imagen JPEG 'i'.

Además, probé ffprobe pero encuentro que incluso la duración del video es incorrecta :(

Srini
fuente
¿Como que? AFAIK jpeg no tiene esos metadatos. La marca de capturetiempo EXIF es por tiempo.
Rajib
Claro, el JPEG no tiene los metadatos, pero el mp4 sí. ¿Puedo hacer que ffmpeg lo arrastre junto con los cuadros que luego codifica como JPEGS y volcar las marcas de tiempo en un archivo?
Srini
Incluya la ffmpegsalida completa de la consola desde su comando.
llogan
ffprobe puede brindarle la información de marca de tiempo de la transmisión de video mp4. ¿Está preguntando si los fotogramas pueden duplicarse o descartarse, entonces cuál es la correspondencia con las marcas de tiempo mp4 originales? En ese caso, exploraría aumentar la configuración de verbosidad para ver si puede obtener el cuadro por cuadro durante la ejecución. ¿Podría ampliar lo que quiere decir con "marcas de tiempo asociadas con marcos".
dstob
@dstob Las marcas de tiempo asociadas con los cuadros son las marcas de tiempo de presentación del video de entrada, es decir, cuándo se debe mostrar cada cuadro, en relación con el inicio del video.
slhck

Respuestas:

13

Lo que puede hacer es "simular" el proceso de escritura de imágenes al filtrar con el fpsfiltro y luego usar ffprobepara mostrar las marcas de tiempo de los cuadros generados. Esto significa que a 25 fps, el cuadro 50 (como su imagen 50) tendrá un PTS de 2.00 segundos.

Lo haces así:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0

Saldrá:

0
0.04
0.08
0.12
0.16
...

Estas son las marcas de tiempo para cada imagen de salida. En realidad, puede combinar la lista de fotogramas y las marcas de tiempo:

ls -1 image - *. jpeg> images.txt
ffprobe -f lavfi -i "movie = input.mp4, fps = fps = 25 [out0]" -show_frames -show_entries frame = pkt_pts_time -of csv = p = 0> frames.txt
pegue images.txt frames.txt> combine.txt

Creará un archivo con:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

Tenga en cuenta que esto puede dar lugar a líneas extrañas si hay demasiados cuadros o demasiadas líneas de salida de información. Parece un poco inexacto allí.

slhck
fuente
¿Es esta la marca de tiempo en relación con una velocidad de fotogramas constante colocada en la salida o la correspondencia de los jpegs emitidos a las marcas de tiempo mp4 originales que podrían ser cualquier velocidad de fotogramas y tener algún valor de marca de tiempo?
dstob
Esta marca de tiempo se basa en la velocidad de fotogramas de salida solicitada. Se relaciona tanto con las imágenes de salida como con los cuadros de video de entrada originales de los que provienen esas imágenes: solo hay una base de tiempo. Esto funciona porque al cambiar la velocidad de cuadros, ffmpeg (por supuesto) no reproducirá el video más rápido, sino que "estirará" el tiempo de presentación de cada cuadro y soltará los cuadros innecesarios.
slhck
¿Por qué tiene que haber solo una base de tiempo cuando está creando manualmente la base de tiempo de salida? Por supuesto, este no siempre será el caso, pero en el primer video de 60 fps que le lancé, ffmpeg acaba de crear su propia base de tiempo ignorando las marcas de tiempo de la entrada.
dstob
No estoy seguro de entender a qué te refieres exactamente. ffmpeg selecciona como base de tiempo de entrada lo que analiza como la base de tiempo del primer archivo de entrada . Por supuesto, también puede decirle a ffmpeg que deseche las marcas de tiempo de entrada -vsync drop, pero eso sucede después del filtrado, IIRC.
slhck