Autor Beitrag
HolgerB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 91

Win XP
D6 Pers
BeitragVerfasst: Mo 17.01.05 12:07 
Hallo zusammen,

ich probiere gerade ob sich ein Videoprojekt mit Delphi realisieren läst.

Ich möchte bis zu vier Videos synchronisieren und in einer beliebigen Geschwindigkeit vorwärts und rückwärts abspielen. Das benötigt man für Bewegungsanalysen im Sport.

Das Problem ist, das ich bisher keine Komponenten gefunden habe, mit denen ich Videos vorwärts und rückwärts laufen lassen kann und im Idealfall auch noch auf die Einzelbilder zugreifen kann. Oder ich quäle sie so sehr dass sie abstürzen. :oops:

Ich habe mir die VideoLab 2.0 www.mitov.com Komponenten angeschaut und bin mit denen bisher am weitesten gekommen. Leider können die nicht schnell genug in den Bildern rückwärts springen und die Direct Show Komponenten von VideoLab sind meiner Erfahrung nach leider nicht stabil (oder ich hab sie falsch aufgerufen).

Ebenso habe ich mir das DSPack angeschaut, scheitere da aber immer schon am Aufruf von Funktionen und Prozeduren aufgrund der unglaublichen Fülle von Parametern.

Ich habe bereits sehr gute Erfahrungen mit Graphics32 graphics32.org/wiki/ und möchte diese Komponenten nutzen um die Videobilder als BMP anzuzeigen und ggf. darauf rumzumalen.

Meine Lösungsansätze sind bisher:

Eine Videokomponente auf ein bestimmtes Bild positionieren und das Bild als BMP auslesen. Die BMP's in einem Layer mit Graphics32 anzeigen.

An das BMP muss ich dran, weil ich in den meisten Fällen noch eine De-Interlace Routine über das Bild jagen muss.

Das funktioniert mit einem Video noch ganz toll, bei vieren stottert es ganz gewaltig beim rückwärts spielen.

Ich überlege derzeit teile des Videos in eine TBitmap32List einzulesen und die Bilder einfach über ein Array auszulesen. Da bekomme da aber schon nach wenigen Sekunden ein gewaltiges Speicherproblem vier Videos a 4 Sekunden benötigen mal eben 500 MB Speicher.


Fragen:

Welche Videoformate unterstützen Rückwärtslauf?

Welche Komponenten eignen sich dafür?

Hat jemand eine Bessere Idee, wie man an einzelne Videoframes heran kommt, besonders wenn man rückwärts abspielen möchte?

Wie kann ich ggf. 32bit Bitmaps im Speicher oder auf der Festplatte Platz sparend ablegen?


Ich würde mich über einige Tips und Anregungen freuen, bevor ich mich an das Schreiben der Hauptrotinen mache. Keine Angst, Quellcode will ich keinen.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 17.01.05 13:03 
Also ich habe zwar noch nicht wirklich etwas damit gemacht aber ich würde dir Empfehlen das Deinterleacing nicht von Hand zu machen. Und schon gar nicht würde ich das jeweilige Bild aus dem Video in ein TBitmap(32) kopieren und dann per hand auf den Bildschirm zu Zeichnen. Das dürfte verdammt langsam sein.

Wenn du die Videos bereits aufgenommen hast dann würde ich sogar empfehlen diese mit einem Programm zu bearbeiten und dort das Deinterleacing zu performen. Anderfalls solltest du dir mal den DScale DirectShow filter anschauen. Evtl solltest du dir auch einen DirectShow anschauen. Ich denke mal, dass man das ganz gut für so etwas gebrauchen kann. Dann könntest du die Videos evtl auch live deinterleacen. Aber nur im Notfall. Sonst lieber offline.

Ich kenne weder das DSPack noch den einzellnen Header. Würde aber vorschlagen, dass du dir den einzellnen Header nimmst. Ist bestimmt nicht so extrem viel auf einmal.
www.progdigy.com/headers/index.html
Und noch eine Seite zu dem Thema mit einem DirectShow header.
clootie.narod.ru/

Alle Angaben sind rein theoretischer Natur. Aber ich denke mal, dass dir alle Vorschläge weiter helfen.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
HolgerB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 91

Win XP
D6 Pers
BeitragVerfasst: Mo 17.01.05 13:34 
Das Deinterlace ist dabei nicht so ein großes Problem, du musst nur jede gerade Zeile in ein Bitmap schreiben, jede ungrade in eine andere. Ich möchte in das Video Referenzpunkte einzeichnen, wie z.B. einen Schwerpunkt. Oder einen Pfeil um "Fehler" zu markieren.

Ich befürchte das eine DirectShow Schnittstelle das nicht zulässt, oder das das noch aufwendiger zu Programieren wird.

Einige Tests haben ergeben, dass Graphics32 eine Bitmap schneller zeichnen kann als ich einen Scrollbar bewegen kann. Das funktionierte auch bei 1000 Bildern im Ram. Das müsste reichen.
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 17.01.05 13:43 
Mit der Bitmap32 wirst du wohl recht haben. Die ist schneller als eine Scrollbar. ABER meinst du, dass eine Softwarelösung schneller ist als Hardwarezeichnen? Abgesehen davon müsstest du das Bild erst einmal irgendwie aus dem Video holen und den Clientspeicher kopieren. Das ist noch einmal zusätzlicher Zeitaufwand.

Zum Thema zeichnen ich dachte bei dem Video an Overlay. Dort wird eine Farbe in der Grafikkarte durch ein Videosignal ersetze. Wenn du auf der Zeichenfläche an diversen Punkten keine Referenzfarbe hast dann würde dort auch kein Video gemalt werden. Indirekt würdest du an den Stellen das Zeichen des Videos verhindern. Aber für den Benutzer würde es gleich aussehen.

Klar ist die Schnittstelle größer un komplizierter. Ich denke aber mal, dass sich der Aufwand rechfertig und lohnen wird. Ist aber nur meine Meinung.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.