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.
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.
Risposte:
È 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.png
o simili come output. Il %0xd
bit viene convertito in un numero intero con spaziatura zero x
cifre 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 -formats
per 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 n
opzione 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.1
e così via.
Quindi, per mettere tutto insieme, è come apparirebbe per salvare un fotogramma input.mov
ogni quattro secondi output_0000.png
, output_0001.png
ecc .:
ffmpeg -i input.mov -r 0.25 output_%04d.png
Si noti che l' -r 0.25
opzione va dopo la -i input.mov
parte, 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 %04d
in %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.
-r
se voglio esportare ogni frame? Se conosco l'FPS del video, suppongo di inserirlo, ma cosa succede se non lo faccio?
jpegs
per questo, a meno che tu non sia sicuro di png
quello che vuoi. Nel mio caso, jpeg
erano circa 50 kb ciascuno e png
circa 2 MB.
-q:v 1
è un'opzione molto utile qui come in superuser.com/questions/318845/…
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' -endpos
opzione. Ad esempio, per un video di 147 secondi:
mplayer -vo jpeg -sstep 5 -endpos 145 file.avi
mpv --vo=image --sstep=5 movie.mkv
funziona alla grande senza il suddetto bug ( mpv è un fork di mplayer) usando mpv 0.27.0 su Debian.
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
-ss position
flag per cercare ulteriormente nel file? -ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
-ss
prima -i
che la ricerca avvenga prima che il video in ingresso venga decodificato. questo dovrebbe accelerarlo. fonte
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 :
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
VirtualDub può farlo per te
File
-> Export
->Image sequence
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.