Videoaufnahme mit Delphi programmieren


Einführung

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.

Media Control Interface (MCI)
Das Media Control Interface (MCI) ist eine Schnittstelle über die mittels einfacher Kommandos verschiedenste Multimediageräte angesprochen werden können. Die Kommandos können über Messages oder über Strings übergeben werden. Das MCI übernimmt dann über den MCI Treiber des Geräteherstellers die Ansteuerung.
Video for Windows (VfW)

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.

WDM Video Capture (DirectShow)
WDM Video Capture (DirectShow) setzt Windows 98/ME, Windows 2000 oder Windows XP voraus. Entsprechend programmiert genügt ein Treiber für alle diese Betriebssysteme. Die Schnittstelle ist abwärtkompatibel zu VfW, weist jedoch eine Menge zusätzlicher Features auf. Dazu gehören u.a. USB Kameras, 1394 DV Geräte (z.B. Digitale Camcorder) und TV Karten. Bei den TV Karten sind besonders die bei VfW fehlenden Eigenschaften (Eingangsauswahl, Tunerfrequenz, Helligkeit / Kontrast) interessant.

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')


VfW Video Capture

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')


Kartenspezifische Funktionen

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.

Wie kommt das Videobild in die Grafikkarte

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.

Preview

Hier werden in einstellbaren Zeitabständen Einzelbilder aufgenommen und mittels GDI auf den Bildschirm gemalt.

Nachteil ist die ruckelnde Anzeige.

Primary

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.

Overlay

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.

DibDraw
Hier weiß ich nicht genau, wie es funktioniert. Von der Bezeichnung und der Wirkung her vermute ich, daß die Videodaten per DrawDIB in die Grafikkarte gelangen. Das bedeutet ein recht ähnliches Verfahren, wie bei Primary, jedoch mit einem Umweg über die Software.


WDM Video Capture (DirectShow)

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.