Crea miniature dal video


11

Come posso fare una semplice acquisizione da un video. Preferibilmente dalla riga di comando?

Idea: scatta 9 istantanee per 9 volte anche posizionate (sulla timeline) e salvale come JPG

Esempio:

Movie length = 10 min
T1= snapshot of 1 min
T2= snapshot of 2 min
......
T9= snapshot of 9 min
   |   |
 T1| T2| T3
---+---+---
 T4| T5| T6
---+---+---
 T7| T8| T9
   |   |

Qual è il miglior programma per farlo? Ci sono programmi opensource?

Risposte:


5

ffmpeg è un eccellente strumento open source per manipolare video, inclusa l'estrazione di frame.

Per estrarre un singolo fotogramma da un timestamp specifico puoi usare il comando like

ffmpeg -i video.avi -r 1  -t 00:01:00 -f image2 image%05d.png

-r è framerate. Puoi anche usare il comando like

ffmpeg -i video.avi -r 1/1440 -f image2 image%05d.png

per ottenere un fotogramma ogni minuto (presupponendo un video a 24 FPS). % 05d indica che il numero ordinale di ciascuna immagine in miniatura deve essere formattato utilizzando 5 cifre.

Se vuoi combinare le immagini come montaggio (la tua griglia), puoi usare imagemagick dopo aver estratto i fotogrammi usando ffmpeg.



1

vcsi è uno strumento da riga di comando scritto in Python che può essere utilizzato per creare una griglia 3 per 3 di istantanee con il seguente comando:

vcsi -g 3x3 video.mkv -o output.jpg

0

Il mio caso d'uso è solo una miniatura di un video, solo un singolo file da utilizzare come <video>poster di tag. Quindi, quale sarebbe un modo rapido per farlo?

Con ffmpeg, puoi farlo:

ffmpeg -ss 123 -y -i video.mp4 -r 1 -updatefirst 1 -frames 1 poster.jpg

Questo ti darà il frame vicino al secondo 123dei video.mp4salvati come poster.jpg.

Il problema, come puoi vedere, è che dobbiamo sapere quale secondo è giusto.

Per mantenere basse le nostre dipendenze, useremo ffmpeg per questo:

# Get the time as h:m:s (non-padded)
l=$(ffmpeg -i video.mp4 2>&1 | grep Duration: | sed -r 's/\..*//;s/.*: //;s/0([0-9])/\1/g')
# Convert that into seconds
s=$((($(cut -f1 -d: <<< $l) * 60 + $(cut -f2 -d: <<< $l)) * 60 + $(cut -f3 -d: <<< $l)))
# Get frame at 25% as the thumbnail
ffmpeg -ss $((s / 4)) -y -i video.mp4 -r 1 -updatefirst 1 -frames 1 poster.jpg

Il 25% del video sembra una scelta comune, ma puoi farlo anche al 33% o al 50%.

Ecco uno script che fa questo .

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.