FFmpeg kann Bilder aus Videos aufnehmen, die als Miniaturansichten zur Darstellung des Videos verwendet werden können. Die gebräuchlichsten Methoden dazu sind im FFmpeg-Wiki erfasst .
Aber ich möchte nicht in bestimmten Abständen zufällige Bilder auswählen. Ich habe einige Optionen gefunden, die Filter in FFmpeg verwenden, um Szenenänderungen zu erfassen:
Der Filter thumbnail
versucht, die repräsentativsten Frames im Video zu finden:
ffmpeg -i input.mp4 -vf "thumbnail,scale=640:360" -frames:v 1 thumb.png
und der folgende Befehl wählt nur Frames aus, die mehr als 40% der Änderungen im Vergleich zum vorherigen aufweisen (und daher wahrscheinlich Szenenänderungen sind), und generiert eine Sequenz von 5 PNGs.
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.4),scale=640:360" -frames:v 5 thumb%03d.png
Infogutschrift für die obigen Befehle an Fabio Sonnati . Die zweite schien besser zu sein, da ich n Bilder bekommen und die besten auswählen konnte. Ich habe es versucht und es hat das gleiche Bild 5 Mal erzeugt.
Weitere Nachforschungen führten mich zu:
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.png
-vsync vfr
stellt sicher, dass Sie verschiedene Bilder erhalten. Dies wählt immer noch das erste Bild des Videos aus. In den meisten Fällen ist das erste Bild ein Abspann / Logo und nicht aussagekräftig. Deshalb habe ich eine -ss
3 hinzugefügt , um die ersten 3 Sekunden des Videos zu verwerfen.
Mein letzter Befehl sieht so aus:
ffmpeg -ss 3 -i input.mp4 -vf "select=gt(scene\,0.5)" -frames:v 5 -vsync vfr out%02d.jpg
Das war das Beste, was ich tun konnte. Mir ist aufgefallen, dass ich nur 5 Videos auswähle, die meistens vom Anfang des Videos stammen und möglicherweise wichtige Szenen verpassen, die später im Video auftreten
Ich würde gerne Ihr Gehirn für andere bessere Optionen auswählen.
quelle
libopenjpeg
.. nicht sicher, ob das einen Unterschied macht.mjpeg
Encoder auch für mich verwendet wird, und ich habe auch überprüft , objpegoptim
undexiv2
, beide funktionieren für mich mit allen JPG-Ergebnissen Ihrer Beispielbefehle.Antworten:
Wie wäre es, wenn Sie im Idealfall nach dem ersten> 40% -Änderungs-Frame innerhalb von 5 Zeiträumen suchen, wobei die Zeiträume die ersten, zweiten, dritten, vierten und fünften 20% des Videos sind.
Sie können es auch in 6 Zeitspannen aufteilen und die erste Zeitspanne ignorieren, um Gutschriften zu vermeiden.
In der Praxis würde dies bedeuten, dass Sie die fps auf einen niedrigen Wert setzen, während Sie Ihren Szenenwechselcheck und Ihr Argument anwenden, um das erste Bit des Videos zu löschen.
...so etwas wie:
quelle
Unable to find a suitable output format for 'fps=fps=1/600'
. Die Lösung ist,-vf
vor diesem Argument hinzuzufügen (siehe stackoverflow.com/questions/28519403/ffmpeg-command-issue )Definieren sinnvoll ist hart , aber wenn Sie N Thumbnails effizient komplette Video - Datei vornehmen möchten Spanning das ist , was ich Thumbnails mit Benutzer hochgeladenen Inhalte auf die Produktion zu generieren verwenden.
Pseudocode
Wo:
ffmpeg -i <movie>
alleine gelesen wurde oderffprobe
die übrigens einen netten JSON-Ausgabe-Writer hatEinfach das obige schreibt den mittleren Keyframe jeder Partition des Films auf. Wenn der Film beispielsweise 300 Sekunden lang ist und Sie 3 Miniaturansichten möchten, wird nach 50, 150 und 250 Sekunden ein Schlüsselbild benötigt. Für 5 Thumbnails wären es 30s, 90s, 150s, 210s, 270s. Sie können N in Abhängigkeit von der Filmdauer D so einstellen, dass z. B. 5-minütige Filme 3 Miniaturansichten haben, über 1 Stunde jedoch 20 Miniaturansichten.
Performance
Jeder Aufruf des obigen
ffmpeg
Befehls benötigt einen Sekundenbruchteil (!) Für ~ 1 GB H.264. Das liegt daran, dass es sofort zur<time>
Position springt (mind-ss
before-i
) und das erste Keyframe annimmt, bei dem es sich praktisch um vollständiges JPEG handelt. Es wird keine Zeit verschwendet, um den Film an die genaue Zeitposition anzupassen.Nachbearbeitung
Sie können oben mit
scale
oder jeder anderen Größenänderungsmethode mischen . Sie können auch einfarbige Rahmen entfernen oder versuchen, sie mit anderen Filtern wie zu mischenthumbnail
.quelle
-ss N
das vorher umzieht ,-i
ist ein erstaunlicher Tipp. Dankeschön!Ich habe einmal etwas Ähnliches gemacht, aber ich habe alle Frames des Videos (in 1 fps) exportiert und sie mit einem gefundenen Perl-Dienstprogramm verglichen, das den Unterschied zwischen Bildern berechnet. Ich habe jeden Frame mit vorherigen Thumbnails verglichen. Wenn er sich von allen Thumbnails unterscheidet, habe ich ihn der Thumbnails-Sammlung hinzugefügt. Der Vorteil hierbei ist, dass ffmpeg 2 Frames von A exportiert, wenn sich Ihr Video von Szene A nach B bewegt und diese zu A zurückkehren.
quelle
Versuche dies
Mit diesem Befehl kann ich die erforderliche Anzahl von Miniaturansichten generieren, die für das gesamte Video repräsentativ sind.
quelle
fps
sein(no_of_frames_req * fps_of_vid) / total_video_frames
?Hier ist, was ich tue, um ein periodisches Vorschaubild für Live-m3u8-Streams zu generieren, das als Poster verwendet werden kann. Ich habe festgestellt, dass eine fortlaufende ffmpeg-Task zum Generieren von Thumbnails meine gesamte CPU auffrisst. Stattdessen führe ich alle 60 Sekunden einen Cronjob aus, der alle Thumbnails für meine Streams generiert.
Wenn Sie häufiger als 60 Sekunden arbeiten müssen (Beschränkung von Cronjob), können Sie eine
while
Schleife in Ihrem Skript erstellen, die für immer ausgeführt wird. Fügen Sie einfach a hinzusleep 30
, um die Frequenz auf 30 Sekunden zu ändern. Ich empfehle dies jedoch nicht mit einer großen Anzahl von Videos, da der vorherige Lauf möglicherweise nicht abgeschlossen ist, bevor der nächste startet.Idealerweise führe ich Cronjob nur alle 5 Minuten aus.
quelle