Come estraggo i timestamp associati agli estratti di frame ffmpeg da un video con l'opzione -r?


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

È il comando che sto usando per estrarre i frame e funziona esattamente come mi aspettavo. Tuttavia, mi piacerebbe anche guardare i timestamp dei frame. Con qualsiasi precisione. 100 millisecondi sono abbastanza buoni per me. Ffmpeg può farlo?

Fornendo ulteriori dettagli,

Quando eseguo il comando sopra ho circa 100 JPEG, suppongo che ci sia una corrispondenza da 1 a 1 (o da molti a 1) tra questi JPEG e i frame del video. Mi piacerebbe conoscere il timestamp del frame che è stato emesso come immagine JPEG 'i'.

Inoltre ho provato ffprobe ma trovo che riporta anche la durata del video in modo impreciso :(


Come cosa? AFAIK jpeg non ha tali metadati. Il timestamp EXIF ​​è per il capturetempo.
Rajib,

Sicuramente il JPEG non ha i metadati, ma il mp4 potrebbe. Posso dirigere ffmpeg per trascinarlo con i frame che successivamente codificherà come JPEG e scaricare i timestamp in un file?
Srini,

Includere l' ffmpegoutput completo della console dal comando.
Llogan,

ffprobe può darti le informazioni di data e ora dal flusso video mp4. Stai chiedendo come se i frame possano essere duplicati o eliminati, qual è la corrispondenza con i timestamp mp4 originali? In tal caso esplorerei aumentando le impostazioni di verbosità per vedere se è possibile ottenere il fotogramma per fotogramma durante l'esecuzione. Potresti espandere ciò che intendi con "timestamp associati ai frame".
dstob,

@dstob I timestamp associati ai frame sono i timestamp di presentazione del video di input, ovvero quando ogni frame deve essere mostrato, relativamente all'inizio del video.
slhck,

Risposte:


13

Quello che puoi fare è "simulare" il processo di scrittura delle immagini filtrando con il fpsfiltro, quindi usando ffprobeper mostrare i timestamp dei frame generati. Ciò significa che a 25 fps, il 50 ° fotogramma (come la tua 50 ° immagine) avrà un PTS di 2,00 secondi.

Lo fai in questo modo:

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

Uscita:

0
0.04
0.08
0.12
0.16
...

Questi sono i timestamp per ciascuna immagine di output. Puoi effettivamente combinare l'elenco dei frame e i timestamp:

-1 immagine - *. 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
incolla images.txt frames.txt> combinati.txt

Creerà un file con:

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

Si noti che ciò può comportare linee estranee se sono presenti troppi frame o troppe righe di informazioni in uscita. Sembra un po 'impreciso lì.


È questo il timestamp in relazione a un framerate costante posizionato sull'output o la corrispondenza dei jpeg emessi con i timestamp mp4 originali che potrebbero essere qualsiasi framerate e avere valori di timestamp?
dstob,

Questo timestamp si basa sul framerate di output richiesto. Si riferisce sia alle immagini in uscita che ai fotogrammi video in ingresso originali da cui provengono le immagini: esiste solo una base temporale. Questo funziona perché quando si modifica il framerate, ffmpeg (ovviamente) non riprodurrà il video più velocemente, ma "allungherà" il tempo di presentazione di ciascun fotogramma e rilascerà i fotogrammi non necessari.
slhck,

Perché deve esserci una sola base dei tempi quando si crea manualmente la base dei tempi di output? Questo non sarà sempre il caso, ma sul primo video a 60 fps che ho lanciato, ffmpeg ha appena creato la propria base dei tempi ignorando i timestamp dell'input.
dstob,

Non sono sicuro di capire esattamente a cosa stai arrivando. ffmpeg seleziona come base dei tempi di input qualunque cosa analizzi come base dei tempi del primo file di input . Ovviamente puoi anche dire a ffmpeg di eliminare i timestamp di input -vsync drop, ma ciò accade dopo il filtraggio, IIRC.
slhck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.