2 Stimmen

Unzuverlässige Zwischenspeicherung und Vorauslesung von Videobildern

Ich arbeite an einer Anwendung, die mehrere Videos gleichzeitig anzeigt. Die Videos werden in Form von Verzeichnissen voller Bilddateien gespeichert. Für jede Bildnummer gibt es bis zu 9 Bilder, die von der Festplatte geladen werden müssen. Ich würde gerne Caching und Read-ahead für die Bilder implementieren. Das wäre ziemlich einfach, aber die Komplikation besteht darin, dass das Dateisystem (manchmal ein Netzwerk-FS) bei weitem nicht schnell genug ist, um jedes Bild anzuzeigen. Der Lesekopf sollte also auswählen, welche Bilder er zu laden versucht, und nur für diese Bilder read()-Anfragen stellen. Außerdem wäre es am besten, wenn er bei der Entscheidung, welche Bilder er laden will, berücksichtigen könnte, welche Bilder bereits im Cache sind.

Ich habe mir einen gierigen Algorithmus ausgedacht, der ganz gut funktioniert, aber ich frage mich, ob dies ein Problem ist, das untersucht wurde, und ob es bessere/optimale Algorithmen gibt.

Ich gehe davon aus, dass die Zeit in Bezug auf die Bildrate und nicht in Sekunden gemessen wird, um die Pseudocodierung zu vereinfachen.

load_time_per_image = how long it takes to load an image
images_per_frame = the number of images to display simultaneously
worst_time = images_per_frame * load_time_per_image

def decide_next_frame_to_load:
    for each frame from now to now + worst_time:
        loadable = (frame - now) / load_time_per_image
        if number_of_images_cached(frame) > images_per_frame - loadable:
            # this frame is the first one it's possible to load in time.
            return frame

Hat jemand Vorschläge? Vielen Dank für Ihre Hilfe! -Thomas

0voto

Rick C. Petty Punkte 901

Ist dies für den Echtzeitbetrieb vorgesehen?

Einige der leistungsschwächsten Videobearbeitungsprogramme, die ich kenne, "indizieren" jedes Bild, indem sie jedes Bild in einer eigenen Bilddatei speichern. Müssen Sie auf diesen Speichermechanismus zurückgreifen? Es wäre wesentlich effizienter, wenn die Quellvideos bereits in einem Videoformat gespeichert wären (eines pro Datei) und es einen Index für jedes Video gäbe (im Grunde die Dateiversätze für jedes Bild). Dann können Sie den Caching-Mechanismus des Betriebssystems nutzen, um die Leistung zu verbessern.

Eine weitere Möglichkeit, die Sie vielleicht in Betracht ziehen sollten, obwohl sie bei vernetzten Dateisystemen wahrscheinlich nicht viel hilft, ist die Speicherung der Bilder im YUV-Format. Ihre Anwendung, die die Videos anzeigt, könnte schneller laufen (zum Teil, weil die RGB-zu-YUV-Konvertierung nicht notwendig ist, und oft, weil Sie die Arbeit des Zeichnens des YUV-Bildes auf die Videokarte verlagern können), wodurch mehr Zeit für die Arbeit im Dateisystem bleibt. Ich mache das, wenn ich auf ein X-Display zeichne, nur um Jitter zu vermeiden.

Was das Zwischenspeichern der Bilder angeht, würde ich wahrscheinlich einen separaten Thread verwenden, um die Bilder so schnell wie möglich von der Festplatte zu lesen, während der Hauptthread das Bild zusammensetzt und präsentiert. Der Hauptthread kann seine Schleife einmal pro Bildpräsentationsintervall ausführen, und der separate Thread kann blockieren, wenn die Menge der gepufferten/vorbereiteten Bilder einen bestimmten Schwellenwert erreicht. Videoplayer wie mplayer verwenden solche Strategien.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X