2010-04-27 10:05:36 +0000 2010-04-27 10:05:36 +0000
72
72

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

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

Risposte (8)

73
73
73
2014-03-15 09:47:20 +0000

È molto semplice con ffmpeg, e può produrre un fotogramma ogni N secondi senza script extra. Per esportare come sequenza di immagini basta usare myimage_%04d.png o simili come output. Il bit %0xd è convertito in un intero con zero cifre lunghe x - l'esempio che ho dato ottiene un output come

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

Si possono usare molti formati di immagini fisse, png, jpeg, tga, qualsiasi cosa (vedi ffmpeg -formats per una lista completa).

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

Il trucco è semplicemente cambiare il frame rate dell'output a quello che vogliamo usando l'opzione -r n dove n è il numero di fotogrammi al secondo. 1 frame al secondo sarebbe -r 1, un frame ogni quattro secondi sarebbe -r 0.25, un frame ogni dieci secondi sarebbe -r 0.1 e così via.

Quindi, per mettere tutto insieme, ecco come sarebbe salvare un fotogramma di input.mov ogni quattro secondi a output_0000.png, output_0001.png ecc.:

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

Nota che l'opzione -r 0.25 va dopo la parte -i input.mov, perché sta controllando il frame rate dell’output. Se la metti prima dell'input, tratterebbe il file di input come se avesse il frame rate specificato.

Cambia il %xd in quante cifre ti servono, ad esempio se il comando creerà più di 10.000 fotogrammi cambia lo %04d in %05d. Questo funziona anche per i file di input che sono sequenze di immagini. Leggi di più qui .

Utenti Windows : Sulla linea di comando usa %

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

Negli script CMD e BAT usa %%

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

Quindi doppio %% negli script, e singolo % sulla linea di comando interattiva. Sbagliare in entrambe le situazioni genererà un errore.

28
28
28
2010-04-28 10:08:07 +0000
mplayer -vo jpeg -sstep 5 file.avi

salverà un fotogramma come file jpeg ogni 5 secondi.

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

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

e cerca una linea come “ID\LENGTH=147.00”.

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

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
11
11
11
2010-04-27 11:41:07 +0000

Con ffmpeg , potete fare quanto segue:

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. Mettetelo in uno script che cambi l'ora e il nome del file e il gioco è fatto.

Maggiori informazioni: Crea una miniatura ogni X secondi del video

8
8
8
2013-06-04 08:15:55 +0000

Se cercate una specie di foglio di contatto e se state lavorando con un sistema operativo Unix-like, potete usare questo elaborato script, chiamato al punto Video Contact Sheet *NIX , short vcs .

In background usa anche ffmpeg (di default) o mplayer, quindi può gestire molti formati video. Automatizza il processo di cattura di immagini fisse dal filmato e le compone in un'immagine con qualche intestazione e piè di pagina. Potete scegliere ad esempio quante catture volete o in alternativa le differenze di tempo tra di esse.

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

vcs -i 10m input.avi

Controlla la lista completa delle opzioni della riga di comando per alcune altre modifiche.

Ecco un esempio di foglio contatti, preso dalla homepage :

7
7
7
2012-09-11 03:17:14 +0000

Con VLC 1.1.0 e superiori, puoi usare il filtro scene video:

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

Il precedente salva 1 ogni 24 fotogrammi (–scene-ratio=24), iniziando da 00:00:10 e finendo 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 plugin video o software aggiuntivi).

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

2
2
2
2010-04-27 10:13:07 +0000

VirtualDub può fare questo per te

File -> Export -> Image sequence

1
1
1
2010-04-27 16:22:46 +0000

Potresti anche provare questo

dalla riga di comando di VLC…

vlc “C:\YOUR\file\path\file.avi” -V image –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 1 immagine su 60 viene catturata) Puoi aggiungere altri comandi, per esempio –image-out-format jpeg salverà le tue capsule come jpeg invece che come png, –snapshot-path ti permette di scegliere dove salvare le tue capsule. Fonte di quanto sopra

1
1
1
2011-11-30 22:06:24 +0000

Puoi saltare i fotogrammi in VirtualDub. Basta usare l'opzione “Decimate By” situata nel menu Video -> Frame Rate. Per esempio, se imposti “Decimate By 100” e poi usi File -> Export -> Image sequence, salverà solo ogni 100° fotogramma.