Come estrarre 1 screenshot per un video con ffmpeg in un dato momento?


109

Ci sono molti tutorial e cose che mostrano come estrarre più screenshot da un video usando ffmpeg. Imposta -r e puoi persino iniziare un certo importo in.

Ma voglio solo 1 screenshot a, diciamo 01:23:45 in. O 1 screenshot a 86% in.

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

Risposte:


208

Usa l' -ssopzione:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • Per l'output JPEG, utilizzare -q:vper controllare la qualità dell'output. L'intervallo completo è una scala lineare da 1 a 31 in cui un valore inferiore si traduce in una qualità superiore. 2-5 è un buon intervallo da provare.

  • Il filtro di selezione fornisce un metodo alternativo per esigenze più complesse come la selezione solo di determinati tipi di frame, o 1 per 100, ecc.

  • Il posizionamento -ssprima dell'input sarà più veloce. Vedi FFmpeg Wiki: Seeking e questo estratto dalla ffmpegdocumentazione dello strumento cli :

-ss posizione (ingresso / uscita)

Quando viene utilizzato come opzione di input (prima -i), cerca in questo file di input di posizionarsi. Nota che nella maggior parte dei formati non è possibile cercare esattamente, quindi ffmpegcercherà il punto di ricerca più vicino prima della posizione. Quando la transcodifica -accurate_seekè abilitata (impostazione predefinita), questo segmento aggiuntivo tra il punto di ricerca e la posizione verrà decodificato e scartato. Quando si esegue la copia del flusso o quando -noaccurate_seekviene utilizzato, verrà conservato.

Quando viene utilizzato come opzione di output (prima del nome di un file di output), decodifica ma scarta l'input finché i timestamp non raggiungono la posizione.

la posizione può essere in secondi o in hh:mm:ss[.xxx]forma.


2
Questo è MOLTO più veloce. Grazie mille. Mettere prima -ss fa un'enorme differenza.
Peter Bengtsson

c'è un modo per ottenere l'ennesimo fotogramma dopo il tempo specificato?
dorien

@ GuntherPiez Non vedo alcuna menzione da nessuna parte su possibili artefatti.
Stefan Reich

2
Notare che vframesè obsoleto nella (almeno) versione 4.2.2. Per manuale "[ vframes] è un alias obsoleto per" -frames:v", che dovresti usare invece."
Synexis

Funziona perfettamente e velocemente.
Smeterlink

37

FFMpeg può farlo cercando il timestamp dato ed estraendo esattamente un fotogramma come immagine, vedi 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 -ssparametro accetta un valore nella forma HH:MM:SS[.xxx]o come numero in secondi. Se hai bisogno di una percentuale, devi calcolare in anticipo la durata del video.


Sembra funzionare come previsto. Attualmente sto valutando se questa è la stessa velocità dell'uso di ffmpegthumbnailer.
Peter Bengtsson


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

1
Esiste un modo per eseguire l'output come PNG nel flusso anziché come file?
Nicke Manarin

1
@NickeManarin Sì .. ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg. Si noti che ho anche messo l' -ssopzione "seek" prima del file di input sulla riga di comando, come altri hanno consigliato.
Glenn Slayden,
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.