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.