Index

DirectShow 8 mit VB 2005

Screenshot

Ausschnitt: Jarhead © 2005 Universal Studios

Was genau ist eigentlich DirectShow?

MP3, MPEG-1/2/4, RealVideo, WMV, Theora, Indeo, Cinepak, DivX, XVid.
WAV, OGG, AVI, ASF, Matroska, Quicktime, RealMedia.
1000 verschiedene Codecs, 1000 verschiedene Containerformate, ein Wirrwar an APIs, Dokus, und, und, und. Würde man heute ein Programm basteln wollen, das die beliebtesten Multimediaformate (sowohl Audio als auch Video) wiedergibt, bräuchte man Monate, würde man sie alle einzeln von Hand implementieren wollen.
Microsoft hat ihrem Multimedia API DirectX ein mächtiges Werkzeug hinzugefügt, um diese Aufgabe praktisch an einem Tag erledigen zu können, abhängig von den gewollten Features, namens DirectShow (Streng genommen war DirectShow früher ein Teil von DirectX, jetzt aber im Platform SDK enthalten?).
Grob: Mit DirectShow kann man beliebige Medien wiedergeben, sowohl Audio als auch Video, vorausgesetzt, der benötigte Codec ist vorhanden.
Im Detail lässt sich mit DirectShow aber noch viel mehr anstellen.

Die Macht im Graphen

DirectShow ist nur ein Begriff, der unter sich einige hundert COM Interfaces sammelt.
Eines dieser Interfaces ist der sogenannte Graph Builder. Dem übergibt man einen Pfad, und er sucht sich aus den installierten Filtern die passenden raus, um den Audio Stream zur Soundkarte, und den Video Stream auf den Schirm zu bringen. Was genau ist nun ein Filter? Das kann ein Codec sein, oder eine Dateiquelle, oder ein Effekt, oder auch ein Ausgabegerät.
IGraphBuilder.RenderFile("C:\film.avi") würde folgendes bewirken:

Alle Filter im Graphen sind flexibel miteinander verbunden.
Der Vorteil davon: Es können theoretisch unendlich viele weitere Filter eingefügt werden, z.B. Effektfilter für Audiostreams (natürlich kann man Filter auch selber schreiben, darauf will ich hier aber nicht eingehen).

Einsatzgebiete

Mit DirectShow geht aber noch mehr, zum Beispiel:

Für letzteres müsste man einfach das jeweilige Renderer Filter durch ein Dateischreibefilter ersetzen, und noch zwischen dieses und den Decoder ein Encoder Filter einsetzen.
Um schneller verstehen zu können, wie Graphen aufgebaut sind, und wie sie funktionieren, empfehle ich, mit Graphedit, einem im DirectX SDK <= 8, oder auch jetzt im Platform SDK enthalten (oder einfach Google), zu spielen.

DirectShow und .Net

DirectShow besteht, wie schon weiter oben erwähnt, aus vielen COM Interfaces, die .Net natürlich nicht kennt. Bedeutet Übersetzen (oder auf die LGPL DirectShow.Net Lib zurückgreifen). Ist diese Hürde erstmal genommen, lassen sich SDK Beispiele und ähnliches aber relativ leicht übersetzen.

Der Player

Features:

Für das Audio Processing und die Audioanalyse (Frequenzspektrum, Amplitudenverlauf) habe ich das Sample Grabber Filter verwendet, welches den Datenfluss an einer beliebigen Stelle im Graphen anzapfen kann. Kompatibel sind diese Funktionen aber nur mit 8 und 16 Bit PCM Streams.

Download: DirectShow Player