Come estrarre tutti i fotogrammi chiave da un video clip?


10

Sto cercando di estrarre i fotogrammi chiave da un video clip. Ho provato il seguente comando, ma estrae tutti i frame.

ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i 2.flv -vsync 2 -s 73x41 -r 30 -f image2 thumbnails-%%02d.jpeg

Risposte:


20

Puoi renderlo più semplice usando -skip_framesenza la necessità di selectfiltro video:

ffmpeg -skip_frame nokey -i 2.flv -vsync 0 -r 30 -f image2 thumbnails-%02d.jpeg

2
Incredibile, richiede meno di 10 secondi su un video di 20 minuti rispetto a più di 3 minuti con il filtro selezionato!
pazzo

Assicurati di utilizzare -threads 1, rispetto al valore predefinito -threads auto, crea un cropdetectgrafico del filtro ( ffmpeg -threads 1 -skip_frame nokey -i input.mkv -filter:v select='not(mod(n\,20))',cropdetect -an -f null /dev/null) 2 volte più veloce sul mio sistema (da 60 a 30 secondi)!
genpfault

Non userei skip_frame nokey. Hai mai controllato l'output? Sui miei file e build (agosto 2019) ottengo timestamp impropri, come in nokey mi dà il frame precedente prima del frame I, mentre i frame non filtrati / tutti mostrano il frame I in un momento successivo.
JasonXA,

La ragione per cui @genpfault suggerisce l'uso -threads 1è che altrimenti la sequenza dei fotogrammi chiave di output può essere emessa in modo non ordinato. Se hai una sorta di modo post-hoc per affrontare questo problema, puoi conservare il multi-threading. Inoltre, sembra che sia ancora possibile ottenere fotogrammi chiave non ordinati, anche durante l'utilizzo -threads 1 , ma ora in questo caso tutte queste occorrenze sembrano essere accompagnate / contrassegnate da un errore del decodificatore h264 illegal short term buffer state detected.
Glenn Slayden

12

Esempio usando i filtri selecte scale:

ffmpeg -i 2.flv -vf "select=eq(pict_type\,I),scale=73x41" \
-vsync vfr -qscale:v 2 thumbnails-%02d.jpeg

Alcuni consigli:

  • I filtri non dovrebbero precedere l' -iopzione, in quanto sono un'opzione di output. Non so da dove esattamente hai ricevuto il comando, ma PICT_TYPE_Inon esiste - dovrebbe essere I.

  • Nel scalefiltro è possibile sostituire 73o 41fare in modo che il filtro calcoli automaticamente la larghezza o l'altezza per preservare le proporzioni: come scale=73:-1o scale=-1:41. Ciò impedisce lo stiramento o lo schiacciamento che può derivare dal ridimensionamento "forzato".

  • La qualità dell'output può essere controllata con -qscale:v(o con l'alias -q:v). L'intervallo effettivo è una scala lineare da 2 a 31 e un valore inferiore è una qualità superiore.

  • Che tu ffmpegpermetta un filtro prima che l'input mi dica che potrebbe essere obsoleto. Scarica una build statica recente per il tuo sistema operativo o creala tu stesso secondo le guide alla compilazione se quanto sopra non funziona.


1
Se il tuo obiettivo è quello di estrarre i key frame senza perdita di dati, puoi provare quanto segue:ffmpeg -i 2.flv -vf "select=eq(pict_type\,I)" -vsync vfr frame-%02d.png
Peltier

0

se questo errore :

L'opzione vf (imposta i filtri video) non può essere applicata all'URL di input 1508.mp4: stai tentando di applicare un'opzione di input a un file di output o viceversa. Sposta questa opzione prima del file a cui appartiene. Errore durante l'analisi delle opzioni per il file di input 1508.mp4. Errore durante l'apertura dei file di input: argomento non valido

Puoi farlo:

ffmpeg -i 263.mp4 -vf select=eq(pict_type\,PICT_TYPE_I)  -vsync 2 -s 480x320 -r 24 -f image2 thumbnails-%05d.jpeg

== --------------------------------------------

"-I" Parametri in anticipo

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.