Seit kurzem beschäftige ich mich nebenbei mit der Windows Media Foundation (MF). Im Grunde geht es mir darum, einen relativ einfachen Weg zu haben, Videos wiederzugeben und Videos zu erzeugen. Für Ersteres ist die MF nicht zwingend notwendig, klar, für Letzteres aber schon. Konkret hätte ich im Kopf, aus einer eigenen 3D-Engine heraus selbst ohne Zusatzsoftware ein Video aufzunehmen und z. B. auf die Festplatte zu schreiben. Davon bin ich im Moment aber selbstverständlich noch ein paar Wochen bis Monate entfernt ^^. Zunächst habe ich mich oberflächlich mit dem Thema beschäftigt. Gleich vorweg kann ich das Buch Developing Microsoft Media Foundation Applications von Anton Polinger empfehlen. Es wurde auch mir empfohlen und bietet einen detaillierten Überblick über das Thema. Bis jetzt hat es mir als gutes Nachschlagewerk gedient, vor allem auch deshalb, weil ich mit der Hilfe von Msdn so meine Probleme hatte.
Ein grundsätzliches Problem für C#-Entwickler wie mich ist die Tatsache, dass praktisch alle Beispiele zur MF in C++ vorliegen und auch oben genanntes Buch nur mit C++ arbeitet. Es hilft nix, hier muss man halt durch und manuell in C# “übersetzen”. Man muss aber zum Glück nicht selber auf C++ zurückgreifen, um die MF verwenden zu können. Für mein erstes Beispiel habe ich SharpDX verwendet. Eine Warnung muss ich dazu aber geben: Die Klassen und Funktionen erscheinen mir nicht so gut in C# übersetzt wie z. B. die von der Direct3D-API, also nicht zu viel erwarten. Funktionieren tun sie aber, soweit ich es bis jetzt getestet habe.
Nach gut zwei Vormittagen kann ich jetzt schon erste Erfolge mit der MF feiern. Hier ein Download zu den Quellcodes eines kleinen, in C# geschriebenen Media Players. Der Weg war eigentlich relativ einfach, ich habe mir den Beispielcode von Msdn gezogen und mich dann an dem Beispiel “BasicPlayback” orientiert bzw. die wichtigsten Sachen mit C# und SharpDX nachprogrammiert. Im Prinzip ging das so relativ flott von der Hand, nur ein blödes Thema: Man darf nicht vergessen, die MF Bibliothek zu initialisieren. Wenn das vergessen wird, schlagen alle anderen API-Aufrufe fehl. Die Exception dabei ist wie bei COM üblich sehr sprechend. Für das erste Testprogramm habe ich das entsprechend im Load-Ereignis des Hauptfensters gemacht (nachfolgend der Code). Je nach Programm sollte das natürlich an anderer Stelle gemacht werden.
/// <summary> /// Default load event. /// </summary> /// <param name="e"></param> protected override void OnLoad(EventArgs e) { base.OnLoad(e); if (this.DesignMode) { return; } // Very important: Initialize MF library.. MF.MediaFactory.Startup(MF.MediaFactory.Version, 0); UpdateDialogState(); }
Was macht also mein erstes Testprogramm? Kurz: Nicht viel. Per Menü kann eine Wmv-Datei geöffnet und wiedergegeben werden. Sobald das Video durchgelaufen ist, kann man ein weiteres öffnen und abspielen. Das war`s. Der wirkliche Nutzen liegt aber darin, die Funktionsweise der MF an diesem einfachen Beispiel kennen zu lernen. Jeder, der sich dafür interessiert, ist eingeladen, sich das Coding anzuschauen.
Quellcode
www.rolandk.de/files/Testing.SimpleMFPlayer.zip
Verweise
- http://archive.msdn.microsoft.com/mediafoundation
- http://www.sharpdx.org/documentation/api/n-sharpdx-mediafoundation
- Developing Microsoft Media Foundation Applications von Anton Polinger