Zugriff auf einzelne Bilder eines Videos

samalbra

Cadet 3rd Year
Registriert
Feb. 2018
Beiträge
35
Hallo,
ich würde gerne wissen, wie man auf die einzelnen Bilder eines Videos zugreifen kann. Geht das überhaupt? Oder ist man da an ein Format gebunden? Ich blicke da noch nicht wirklich durch. Der Code zum Abspielen von Bildern, steckt der in den Containerformaten? Könnte ich z.B. einen Videoplayer programmieren, bei dem ich die Reihenfolge meiner Bilder selber festlege?
 
Das sollte so ziemlich jedes Videobearbeitungstool können wenn ich dich richtig verstanden habe.
 
Also ich meine kein Video, bei dem man Bilder abspielt und deren Reihenfolge festlegt. Ich meine den Zugriff auf die Frames, aus denen das flüssige Video besteht. Wenn man ein Video z.B. rückwärts laufen lässt, ist das letzte Bild quasi das erste, das abgespielt wird. Kann ich aber jedes einzelne Bild selber ansprechen? Z.B erst das erste Bild, dann das letzte Bild, das zweite, das vorletzte Bild usw. abspielen (wäre sinnlos, dient einfach als Beispiel).
 
Digitale Videos bestehen nicht wirklich aus aneinandergereihten Bildern wie bei einer analogen Filmrolle ;)
Kurz erklärt hast du üblicherweise Keyframes und es gibt ein Delta der Zwischenbilder. Du kannst aber jedes Bild einzeln betrachten. Je nach Kompression ist das allerdings nicht sonderlich ansehnlich.
 
Also das Zugreifen auf einzelne Frames wird per se schwierig, da je nach Format die Frames gar nicht direkt abgelegt sind. Es kann auch einfach sein, dass nur die Änderungen zum vorherigen Frame gespeichert werden. D.h. du müsstest dir das Bild erst zusammenbauen indem du die Sequenz bis zu diesem Bild rekonstruierst. Vielleicht gibt es aber schon fertiges dazu - schon gegoogelt?
 
Ok, schon wieder schlauer geworden, dankeschön :)

@The Ripper noch nicht, ich weiß noch ehrlich gesagt gar nicht, wonach ich da genau googlen soll. "Bilder eines Videos rekontruieren" ist es schonmal nicht :rolleyes:
 
Naja mir geht es eigentlich nicht um ein fertiges Tool, mit dem ich das eventuell machen könnte. Ich wüsste einfach nur gerne, wie man so etwas programmieren könnte. Dabei möchte ich eben nicht von der Bildsequenz, wenn man das dann noch so nennen kann, abhängig sein.
 
Dir muss halt klar sein das es eine Vielzahl an Codecs gibt, mit einer Vielzahl an jeweiligen Parametern und mehrere reine Container-Formate, in denen sich ganz unterschiedliche Videoformate verbergen können.

Üblicherweise ist ein Video nicht eine einfache Aneinanderreihung von Einzelbildern, sondern es gibt in einem zeitlichen Abstand ein vollständiges Bild und bis zum nächsten vollständigen Bild werden nur Änderungen gespeichert. Das verringert die Dateigröße.

Willst du nun ein bestimmes Bild haben, zu einer festgelegten Laufzeit, müsstest du erstmal zurück gehen bis zum letzten vollständigen Bild und die Änderungen bis zu dem Bild das du haben willst nachvollziehen und dieses Bild müsste dann neu gerendert werden.
 
Zuletzt bearbeitet:
MJPEG besteht aus vielen jpg-Dateien, die einfach hintereinander hängen. Wird gerne von billigen/alten Kamera benutzt, weil es fast keine CPU benötigt, da vorherige und nachfolgende Frames egal sind.
Häufiger trifft man jedoch H.264, aber das ist komplex zum selbst auseinander nehmen. Besser fertige Bibliotheken benutzen und die können dann Zwischenframes erzeugen.
 
Zuletzt bearbeitet:
Oder verrate mehr, was du EIGENTLICH machen willst.
Eine Möglichkeit ist immer ein zweistufiges Verfahren:
Im ersten Schritt gehst du über das komplette Video und legst jedes Frame in einem array/std::vector ab. (O(N) Platz und Zeit - Dies kann aber extrem viel Speicher brauchen! Evtl Frameweise komprimiert ablegen mittels jpeg)
Anschließend hast du tatsächlich O(1) Zugriff auf einzelne Bilder die für sich alleine und ohne Abhängigkeit zu anderen Frames vollständig existieren, was abgesehen von Caching-Effekten dann eine beliebige Reihenfolge von Frames mit dem selben Aufwand abspielbar macht, wie 1, 2, 3, ....
 
Man könnte aber schon einen Player programmieren, bei dem man quasi den Schieberegler beliebig vor und zurückschieben könnte und dabei entsprechend der Geschwindigkeit das Video "flüssig abgespielt" werden würde oder?
Man könnte dann lediglich nicht zu jedem einzelnem Punkt auf dem Schieberegler das entsprechende Bild sehen. Sobald das Abspielen aber stetig ist, gibt es da keine Probleme, ist das richtig?
Ergänzung ()

Tut mir leid, habe einige Nachrichten erst jetzt gesehen.Eigentlich ist der Zugriff auf jedes einzelne Bild unwichtig, diese Überlegung ging aus der falschen Annahme heraus, dass Video einzelne Bilder abspielen.
Im Prinzip will ich das, was ich im letzten Post beschrieben habe.
 
Zurück
Oben