Come estrarre un fotogramma di un video ogni N secondi su un'immagine?


71

Come posso convertire un file video in una sequenza di immagini, ad esempio un fotogramma ogni N secondi. Mplayer o ffmpeg possono farlo? Ho usato MPlayer per catturare schermate manualmente, ma vorrei automatizzare questo per un lungo video.


Vedi questa domanda correlata sulla scelta della qualità delle immagini: stackoverflow.com/questions/10225403/…
Pierz,

Risposte:


70

È molto semplice con ffmpeg e può produrre un frame ogni N secondi senza script aggiuntivi. Per esportare come sequenza di immagini basta usare myimage_%04d.pngo simili come output. Il %0xdbit viene convertito in un numero intero con spaziatura zero xcifre lunghe - l'esempio che ho dato viene emesso come

  • myimage_0000.png,
  • myimage_0001.png,
  • myimage_0002.png

    eccetera..

Puoi usare molti formati di immagini fisse, png, jpeg, tga, qualunque cosa (vedi ffmpeg -formatsper un elenco completo).

Ok, ora sappiamo come esportare il film come una sequenza di immagini, ma diciamo che non vogliamo esportare ogni singolo fotogramma?

Il trucco è semplicemente cambiare la frequenza dei fotogrammi dell'output in quello che vogliamo usando l' -r nopzione dove nè il numero di fotogrammi al secondo. 1 fotogramma al secondo sarebbe -r 1, un fotogramma ogni quattro secondi sarebbe -r 0.25, un fotogramma ogni dieci secondi sarebbe -r 0.1e così via.

Quindi, per mettere tutto insieme, è come apparirebbe per salvare un fotogramma input.movogni quattro secondi output_0000.png, output_0001.pngecc .:

ffmpeg -i input.mov -r 0.25 output_%04d.png

Si noti che l' -r 0.25opzione va dopo la -i input.movparte, perché controlla la frequenza dei fotogrammi dell'output . Se lo metti prima dell'input, il file di input verrà trattato come se avesse il frame rate specificato.

Modificare% xd in qualsiasi numero di cifre sia necessario, ad esempio se il comando crea più di 10.000 fotogrammi, modificare %04din %05d. Questo funziona anche con file di input che sono sequenze di immagini. Leggi di più qui .

Utenti Windows : utilizzare dalla riga di comando%

esempio: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

Negli script CMD e BAT utilizzare %%

esempio: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

Quindi raddoppia %%negli script e singolo %nella riga di comando interattiva. Sbagliare in entrambe le situazioni genererà un errore.


Cosa devo inserire -rse voglio esportare ogni frame? Se conosco l'FPS del video, suppongo di inserirlo, ma cosa succede se non lo faccio?
Tomáš Zato,

4
Non usare affatto il flag -r. Quindi FFMPEG utilizzerà la frequenza dei fotogrammi del file di input.
Stib

2
Nota che vorrai davvero usarlo jpegsper questo, a meno che tu non sia sicuro di pngquello che vuoi. Nel mio caso, jpegerano circa 50 kb ciascuno e pngcirca 2 MB.
mlissner,

5
il vantaggio di pngs è la compressione senza perdita, quindi se stai usando la sequenza di immagini come un intermedio e non ti dispiace le dimensioni extra, allora è quando potresti usare png.
stib,

Vale la pena aggiungere che -q:v 1è un'opzione molto utile qui come in superuser.com/questions/318845/…
Nikolay Shmyrev,

27
mplayer -vo jpeg -sstep 5 file.avi

salverà un frame come file jpeg ogni 5 secondi.

Tuttavia, non si fermerà alla fine del file, continuerà a produrre copie dell'ultimo fotogramma. Per evitare ciò, trova la durata del video in secondi, usando un altro giocatore o con mplayer:

mplayer -vo null -ao null -frames 0 -identify file.avi

e cerca una riga come "ID_LENGTH = 147,00".

Sottrai 2 dalla lunghezza e usa questo valore per l' -endposopzione. Ad esempio, per un video di 147 secondi:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi

sembra un bug di mplayer. bella soluzione.
Quack Quixote

Potresti almeno menzionare su quale sistema operativo stai usando questo comando?
Tomáš Zato,

È stato 5 anni fa, ma all'epoca era probabilmente l'ultimo Ubuntu Desktop, Ubuntu 10.4.
Liam,

Come posso scegliere passaggi più brevi di 1 secondo. Accetta solo numeri interi.
fcpenha

Oggi mpv --vo=image --sstep=5 movie.mkvfunziona alla grande senza il suddetto bug ( mpv è un fork di mplayer) usando mpv 0.27.0 su Debian.
Adam Katz,

11

Con ffmpeg, è possibile effettuare le seguenti operazioni:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

Questo comando genera una miniatura JPG di dimensioni 320 × 240 al 4 ° secondo nel video. Inseriscilo in uno script che modifica l'ora e il nome del file e il gioco è fatto.

Ulteriori informazioni: crea un'immagine in miniatura ogni X secondi del video


Questo sembra fare quello che voglio, ma con un problema. Elaborerà il file dall'inizio su ogni iterazione, diventando esponenzialmente lento.
Liam,

@Liam - Aiuta se lasci da solo il tempo di offset (impostalo su 1) e usi invece il -ss positionflag per cercare ulteriormente nel file? -ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
Nifle,

1
@liam: metti il ​​carattere -ssprima -iche la ricerca avvenga prima che il video in ingresso venga decodificato. questo dovrebbe accelerarlo. fonte
quack quixote

2
C'è un modo migliore e molto più veloce di farlo con ffmpeg. Vedi la mia risposta qui sotto.
Stib

La soluzione di stib è la migliore IMO.
Griffin,

8

Se stai cercando una specie di foglio di contatto e se stai lavorando con un sistema operativo simile a Unix, puoi usare questo elaborato script, chiamato al punto Foglio di contatto video * NIX , vcs breve .

Sullo sfondo utilizza anche ffmpeg(per impostazione predefinita) o mplayer, quindi, può gestire molti formati video. Automatizza il processo di acquisizione di immagini fisse dal filmato e le compone in un'immagine con alcune intestazioni e piè di pagina. Puoi scegliere, ad esempio, quante catture vuoi o in alternativa le differenze di tempo tra di loro.

Per un intervallo di 10 minuti, l'invocazione è così:

vcs -i 10m input.avi

Controlla l' elenco completo delle opzioni della riga di comando per altre modifiche.

Ecco un esempio di foglio di contatto, tratto dalla homepage :

inserisci qui la descrizione dell'immagine


7

Con VLC 1.1.0 e versioni successive, puoi utilizzare il filtro video di scena:

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

Quanto sopra salva 1 su ogni 24 fotogrammi (--scene-ratio = 24), a partire da 00:00:10 e termina a 00:00:11.

Ho appena testato e confermato che funziona con VLC 2.0.3 su una nuova installazione di Windows 8 (non ho plug-in video o software aggiuntivi).

Documentazione completa: http://wiki.videolan.org/How_to_create_thumbnails


2

VirtualDub può farlo per te

File-> Export->Image sequence

inserisci qui la descrizione dell'immagine


Ciò salverà ogni fotogramma come immagine?
Liam,

sì, ogni fotogramma.
Shevek,

Ho bisogno di saltare la maggior parte dei frame, la produzione di tutti i frame consumerà troppo spazio di archiviazione. Ho bisogno di un solo fotogramma ogni pochi secondi.
Liam,

1

Potresti anche provare questo

dalla riga di comando VLC ...

vlc "C: \ YOUR \ file \ path \ file.avi" -V immagine --image-out-prefix = capname --image-out-ratio = 60

file.avi è il video da cui vuoi catturare, capname è il prefisso delle immagini salvate, potresti voler giocare con il rapporto (60 significa che viene catturata 1 su 60 immagini) Puoi aggiungere più comandi, ad esempio --image-out-format jpeg salverà i tuoi tappi come jpeg invece che come png, --snapshot-path ti consente di scegliere dove salvare i tuoi tappi.

Fonte di cui sopra


Ho ricevuto questo messaggio: non è stato possibile caricare le opzioni della riga di comando, verificare che siano valide.
Liam,

Su Ubuntu ho ricevuto questo messaggio: opzione sconosciuta o argomento obbligatorio mancante `--image-out-prefix = capname '
Liam

1

Puoi saltare i frame in VirtualDub. Basta usare l'opzione "Decima per" situata nel menu Video -> Frequenza fotogrammi. Ad esempio, se si imposta "Decima per 100", utilizzare File -> Esporta -> Sequenza di immagini, verrà salvato solo ogni 100 ° fotogramma.

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.