2014-12-19 11 views
42

Ci sono molti tutorial e cose che mostrano come estrarre più screenshot da un video usando ffmpeg. È possibile impostare -r e si può anche iniziare una certa quantità in.Come estrarre 1 screenshot per un video con ffmpeg in un dato momento?

ma voglio solo 1 screenshot, diciamo 01:23:45. O 1 screenshot al 86% in.

Tutto questo è possibile con ffmpegthumbnailer ma è un'altra dipendenza da cui non voglio dipendere. Voglio essere in grado di farlo con ffmpeg.

risposta

85

Utilizzare l'opzione -ss:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg 
  • Per l'uso di uscita JPEG -q:v per controllare la qualità di stampa. L'intervallo completo è una scala lineare da 1 a 31 dove un valore inferiore si traduce in una qualità superiore. 2-5 è una buona scelta da provare.

  • Il select filter fornisce un metodo alternativo per esigenze più complesse quali la selezione di alcuni tipi di frame, o 1 a 100, ecc

  • Posizionamento -ss prima dell'ingresso sarà più veloce. Vedere FFmpeg Wiki: Seeking e questo estratto dal ffmpeg cli tool documentation:

-ss posizione (input/output)

Quando viene utilizzato come opzione di input (prima -i), cerca in questo file di input per la posizione. Notare che nella maggior parte dei formati non è possibile cercare esattamente , quindi ffmpeg cercherà il punto di ricerca più vicino prima della posizione . Quando la transcodifica e sono abilitati (il valore predefinito), questo segmento aggiuntivo tra il punto di ricerca e la posizione sarà decodificato e scartato. Quando si esegue la copia in streaming o quando viene utilizzato -noaccurate_seek, verrà conservato.

Se utilizzato come opzione di output (prima di un nome file di output), decodifica ma scarta l'input fino a quando i timestamp raggiungono la posizione.

posizione può essere in secondi o nel formato hh:mm:ss[.xxx].

+0

Questo è MOLTO più veloce. Grazie mille. Mettere il -ss prima fa una grande differenza. –

+0

L'uso di -ss prima di -i può causare artefatti. Spostando il valore -ss in uscita l'ho risolto per me, ma era più lento. – hirschhornsalz

+0

c'è un modo per ottenere il n-esimo fotogramma dopo il tempo specificato? – dorien

16

FFMpeg può farlo cercando di dato timestamp e l'estrazione esattamente un fotogramma come immagine, si veda ad esempio:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg 

Spieghiamo le opzioni:

-i input file   the path to the input file 
-ss 01:23:45   seek the position to the specified timestamp 
-vframes 1    only handle one video frame 
output.jpg    output filename, should have a well-known extension 

Il parametro -ss accetta un valore nella forma HH:MM:SS[.xxx] o come un numero in secondi. Se hai bisogno di una percentuale, devi calcolare in anticipo la durata del video.

+0

Sembra funzionare come previsto. Attualmente sto facendo un benchmark se questa è la stessa velocità con l'utilizzo di ffmpegthumbnailer. –

+0

Sì, questo approccio è molto lento. Vedi http: //www.peterbe.com/plog/quick-way-to-take-screencaps-out-of-videos –

+3

prova a usare l'opzione -ss prima di -i poiché salterà la parte di decodifica della pipeline. Questo potrebbe accelerare il processo. – SirDarius

Problemi correlati