Video-Thumbnails mit ffmpeg

13159
Michael Lenzen

Ich suche nach einer schönen, kurzen und einfachen Möglichkeit, eine Reihe von Miniaturansichten für eine bestimmte Videodatei zu erstellen. Ich bin fast da und benutze ffmpeg. Hier ist was ich habe:

ffmpeg -i /tmp/video.avi -r 1 -ss 60 -r 1 foo-%03d.jpeg` 

Das einzige Problem ist, dass dies eine Sekunde dauert und ich es gerne jede Minute machen würde. Ich habe versucht, den -rWert auf 1/60oder .02ohne Erfolg einzustellen.

Hier ist das alte Skript, das ich verwendet habe, das nur für einige Dateien funktionierte:

#!/bin/bash # grab a screenshot every 60 seconds file=$1 orig_dir=`pwd` mins=`exiftool "$file" | grep "Duration" | awk -F : '' | grep --only-matching '[0-9]*'` dir="$file-screenshots" mkdir "$dir" cd "$dir" mplayer -vo png -vf screenshot -sstep 60 -frames $mins -ao null "../$file" cd "$orig_dir" 

Das muss nicht auf der Kommandozeile stehen, es ist nur so, dass es am einfachsten ist.

3
Sehen Sie sich diese Frage an http://superuser.com/questions/135117/how-to-convert-video-to-images/135238#135238 Vielleicht können Sie mit den dort gefundenen Informationen dies lösen. Wenn ja, beantworten Sie die andere Frage, da diese wahrscheinlich als Duplikat geschlossen wird. Nifle vor 14 Jahren 0

1 Antwort auf die Frage

3
quack quixote

Siehe die ffmpeg-Manpage . Du willst -vframes:

-vframesAnzahl
Stellen Sie die Anzahl der aufzuzeichnenden Videoframes ein.

Siehe auch dieses Beispiel, wenn jemand dasselbe tut. Die Originalnachricht -rweist darauf hin, dass sie mit weniger als einem Argument nicht richtig funktioniert. Stattdessen wird empfohlen, diese Art von Befehlszeile zu verwenden, um ein Bild zu erfassen (wobei X einige Zeit ist, um in der Datei vorwärts zu suchen):

ffmpeg -ss X -i input.movie.file -an -vframes 1 ouput.png 

Verwenden Sie dann Shell-Scripting, um das zu wiederholen, und generieren Sie X automatisch basierend auf (a) wie viele Frames Sie aufnehmen möchten und (b) wie lang das Video ist. Da Ihr altes Beispielskript bereits (b) findet, ist (a) die einzige erforderliche Eingabe:

# generate NFRAMES frames in a movie 90 minutes long  mins=$(exiftool "$file" | grep "Duration" | awk -F : '' | grep --only-matching '[0-9]*') dir="$file-screenshots" mkdir "$dir"  for i in $(seq 1 $NFRAMES); do ffmpeg -ss $(echo "$i * $mins" | bc -l) -i "$file" -an -vframes 1 "$dir/$i.png"; done