Ausschnitt: Jarhead © 2005 Universal Studios
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.
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).
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 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.
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