Dieser Artikel enthält einige Informationen zur Programmierung von Video-Aufnahmen unter Delphi. Dazu gehört auch die Aufnahme von Einzelbildern (Framegrabbing).
Unter Windows gibt es drei Schnittstellen, die die Programmierung von Video Capture erlauben.
Die Video for Windows (VfW) ist eine Schnittstelle mit der Videogeräte angesteuert werden. Es gibt AVIFile (Bearbeitung von AVI-Dateien), den Video Compression Manager (für die Komprimierung und Dekomprimierung von Videodaten), Video Capture (Aufnahme von Videos, auch als AVICapture bekannt) und DrawDIB (Anzeige von Videodaten).
Als dritte Schnittstelle bietet Microsoft DirectShow (ehemals DirectMedia) an. Diese Schnittstelle gehört zu DirectX. Für Video ist hier WDM Video Capture zuständig.
Weil oft Fragen dazu kommen, Video Capture dient zum Aufnehmen, die Wiedergabe wird von anderen Teilen der VfW Schnittstelle realisiert. Für die häufig gestellte Frage: 'Wie bekomme ich ein einzelnes Bild aus einer Videodatei?' gibt es eine Antwort auf der Homepage von Thomas Schwobe: Frames (Einzelbilder) aus einem AVI-File laden. Oder bei Microsoft im MSDN.
Linklisten mit Delphi Beispielen:
Earl F. Glynns Delphi Reference Library, Delphi Graphics / File Formats
(Section 'AVI')
Earl F. Glynns Delphi Reference Library, Delphi Graphics / File Format Conversions
(Sections 'AVI to BMPs' and 'BMPs to AVI')
Mit Video Capture lassen sich die Grundfunktionen von Videokarten steuern. Eine laufende Videosequenz kann in einem Fenster (z.B. Panel) angezeigt werden. Das Bild kann angehalten werden. Es können Einzelbilder, aber auch ganze Sequenzen gecaptured werden. Es sind Callback-Funktionen möglich, um Bilder während des Capture-Vorgangs zu bearbeiten.
Eine Beschreibung der Funktionen gibt es online im MSDN
Generell ist zu empfehlen, die VfW Schnittstelle nur dann zu benutzen, wenn auch ein VfW-Treiber installiert wurde. Es existiert zwar ein Kompatibilitätstreiber von Microsoft, welcher die Schnittstelle auf WDM umsetzt, dabei gibt es jedoch eine Reihe möglicher Probleme.
Um mit der Schnittstelle zu arbeiten muß eine Capture Fenster erzeugt werden. Dieses Capturefenster nimmt dann die gesamten Kommandos entgegen, welche über normale SendMessage-Befehle an das Fenster geschickt werden.
In der WinAPI Hilfedatei (gehört zur Delphi-Installation) findet man die Beschreibung zu den einzelnen Kommandos, wenn man nach WM_CAP... sucht. Weitere Hilfestellungen finden sich unten in der Linkliste.
Da ein Beispiel mehr sagt als viele Beschreibungen, habe ich ein Demo geschrieben, das ich hier zum Download anbiete. Die Datei enthält das Demo und eine Headerübersetzung der VfW.h. Das Demo demonstriert verschiedene Möglichkeiten, die die Schnittstelle bietet, u.a. die Darstellung des Videobildes, die Aufnahme von Einzelbildern und die Funktionsweise des Callbacks. Auf der rechten Seite werden dazu die aufgenommenen Einzelbilder dargestellt. Einige Karten unterstützen nur spezielle Videoformate. Das Demo demonstriert für einige einfache Formate, wie diese dekodiert werden können. Damit das Demo funktioniert, muß zusätzlich noch das Y Library Basis-Paket und die VfW Headerübersetzungen geladen werden.
Wem die Programmierung zu aufwenig erscheint, der kann auch eine Komponente benutzen. Einige befinden sich auf Torry. Ich empfehle TVideo von J. Hübler.
Linklisten mit Delphi Beispielen:
Earl F. Glynns Delphi Reference Library, Delphi Graphics / Multimedia / Video
Earl F. Glynns Delphi Reference Library, Delphi Graphics / Multimedia / VfW
Earl F. Glynns Delphi Reference Library, Delphi Graphics / File Formats
(Section 'AVI')
Zum Umsetzen von kartenspezifischen Funktionen gibt es von den Kartenherstellern verschiedene SDK's. Zu diesen Funktionen gehören unter anderem Helligkeits- und Kontraststeuerung, bei TV-Karten auch die Senderwahl.
Ich benutze persönlich eine miroVIDEO PCTV - Karte von Pinnacle Systems (auch als
miroMEDIA und miroSTUDIO bekannt).
Es gab zu miro-Zeiten ein kostenloses SDK zur Ansteuerung über mci-Kommandos, inzwischen
scheint es so, daß die Mitarbeiter von Pinnacle davon nichts mehr wissen (wollen?), wie
eine E-Mail-Kontaktversuch vor einiger Zeit und ein ein Gespräch auf der CeBit ergab.
Hauppauge-Karten sind nahezu baugleich, für diese Karten gibt es ein SDK von Hauppauge, allerdings gegen "Schutzgebühr".
Zu weiteren Karten kann ich nichts sagen.Für die Anzeige gibt es 3 Methoden:
Generell wird zwischen Preview und Overlay unterschieden. Beim Overlay sind mir drei Verfahren bekannt, Primary Surface Mode (Primary), Secondary Surface Mode (Overlay) und DibDraw.
Hier werden in einstellbaren Zeitabständen Einzelbilder aufgenommen und mittels GDI auf den Bildschirm gemalt.
Nachteil ist die ruckelnde Anzeige.
Hier werden die Daten direkt in den Bildwiederholspeicher geschrieben.
Die Probleme dieser Methode werden deutlich, wenn man versucht ein Menü über dem Live-Bild zu öffnen, es braucht einen kurzen Augenblick, ehe der Bereich des Menüs zuverlässig ausgeschlossen wird. Außerdem müssen die Daten vorher in das gleiche Format gewandelt werden, das die Grafikkarte benutzt.
Hier wird der Bereich, auf dem sich das Live-Bild befinden soll, mit einer bestimmten Schlüsselfarbe, meist lila (Delphi: clFuchsia), belegt. Die Daten werden direkt in den Bildwiederholspeicher, jedoch in einen freien Bereich geschrieben. Bei der Ausgabe ersetzt der Grafikchip die Farbe mit dem Einzelbild. Das Aufnahmeformat muß nicht zwingend dem Format der Grafikkarte entsprechen.
Vorteil ist der sehr ruhige Bildaufbau, Menüs sind sofort zu sehen. Es gibt jedoch auch einen 'Nachteil'. Wird das Videofenster ganz oder teilweise von einem anderen Fenster überdeckt, und in diesem Fenster die Schlüsselfarbe verwendet, dann wird an dieser Stelle ebenfalls das Live-Bild dargestellt.
Die Beschreibung gibt es online im MSDN.
Hier gilt ebenfalls, am besten nur dann benutzen, wenn auch ein WDM Treiber installiert wurde. Zudem hat man bei einem WDM Treiber meist mehr Kontrolle über die Karte.
Bei DirectShow benutzt man Filter, welche miteinander verbunden werden. Das macht die Programmierung verschiedenster Aufgabe recht einfach. Möchte man nur ein Live-Bild anzeigen, so verbindet man den Filter der Karte mit dem Ausgabefenster. Soll aufgenommen werden, schaltet man einfach den SampleGrabber Filter dazwischen. Soll in eine Datei aufgenommen werden, so nimmt man einen Splitter und leitet einen Ausgang, evtl. über einen Encoder, auf den Dateiausgabe-Filter. Soviel zur Theorie, in der Praxis kann es dann doch schon mal Probleme geben, in der Regel, weil manche Treiberhersteller sich nicht an die Vorgaben für die Namen der Pins halten. Pins nennt man die Ein- und Ausgänge der Filter. Dann muß man spezielle Lösungen für spezielle Karten implementieren.
Bei Vollbildaufnahmen kann sich ein weiteres Problem ergeben. Durch den Samplegrabber geht der komplette Stream über den Rechner, langsamere Rechner schaffen das einfach nicht, zumindestens nicht mit unkomprimierten Frames.
Kommen wir zum praktischen. Auch für WDM Capture gibt es Unterstützung für Delphi, die DirectShow Komponentensammlung DSPack. Dabei ist neben den Headerübersetzungen auch ein Demo mit ähnlichem Leistungsumfang, wie das oben beschriebene, zu finden im Unterverzeichnis Demos\D5\PlayVideoCap. Für Fragen steht ein spezielles Forum für DSPack zur Verfügung.