Einfacher Media Player mit C# und der Windows Media Foundation #3

In den letzten Beiträgen habe ich es schon öfters geschrieben: Die API der MediaFoundation (MF) finde ich prinzipiell überraschend einfach anzuwenden. Meine Probleme entstanden aber i. d. R. dadurch, dass der von mir verwendete Wrapper SharpDX.MediaFoundation alles andere als ausgereift ist. Aus diesem Grund habe ich in den letzten Tagen im Internet nach Alternativen gesucht – und prompt das (leider schon seit 2012 eingestellte) OpenSource Projekt MediaFoundation.Net gefunden. Die Tatsache, dass daran nicht mehr entwickelt wird, schreckt zunächst ab, aber nach einem kurzen Blick über die Klassen und Interfaces erkennt man, dass die MF-API grundsätzlich sauberer abgebildet ist. Aus diesem Grund habe ich meinen Video Player aus den letzten Blog-Einträgen genommen und auf diese Bibliothek umgestellt.

Die Umstellung selbst ging relativ flott, da sowohl das zuvor verwendete SharpDX.MediaFoundation, als auch MediaFoundation.Net sich sehr nah an den Funktionen der MF-API befinden. Der Umstieg beschränkte sich im Wesentlichen also auf folgende Themen:

  • Ändern des Namespaces
  • Hier und da ein „MF“-Präfix vor den Methoden oder Konstanten schreiben
  • Hier und da ein paar andere Namen (z. B. wird aus MediaFactory MFExtern)
  • Manche Konstanten, die ich vorher selber definieren oder zusammenbauen musste, sind in MediaFoundation.Net bereits da

Zwar fühlt sich MediaFoundation.Net grundsätzlich sauberer und vollständiger an, leider gibt es aber auch ein paar Sachen, die unnötig blöd sind. Ein Beispiel ist die Tatsache, dass viele Methoden enthalten sind, bei denen Rückgabewerte über Out-Parameter abgebildet werden. Hier ein Code dazu:

// Create source object
MF.IMFSourceResolver sourceResolver;
MF.MFExtern.MFCreateSourceResolver(out sourceResolver);

Jetzt muss man sich fragen: Muss das sein? Wie es besser geht zeigen SharpDX und SlimDX bei den Direct3D Schnittstellen.

Was mir auch nicht ganz hundertprozentig gefällt ist das Thema, dass man nicht wie für .Net üblich die Dispose-Methode verwendet, um COM-Objekte freizugeben, sondern eine statische Methode dafür verwenden muss. Hier ein Beispiel:

finally
{
    // Clean up.
    COMBase.SafeRelease(pHandler);
    COMBase.SafeRelease(pRendererActivate);
}

Aber gut, das muss man halt wissen…

Insgesamt sind das aber glücklicherweise nur Mängel im Detail. Damit finde ich die MediaFoundation.Net API schon deutlich besser und ausgereifter als SharpDX.MediaFoundation. In meinen nächsten Versuchen werde ich wohl mehr darauf setzen.

Quellcode

https://www.rolandk.de/files/Testing.SimpleMFPlayerV3.zip

Verweise

  1. http://mfnet.sourceforge.net/

2 Gedanken zu „Einfacher Media Player mit C# und der Windows Media Foundation #3“

  1. Hello Roland,
    Your articles about Media Foundation Player are amazing and a real help on the way to discover this platform but, despite of all of that I face up a problem, I have tried to set volume but without success.
    Could you give me a hint how to manage that?
    I am grateful already, Thanks.

    Antworten
  2. Hallo Rolad,

    wirklich eine tolle Seite mit guten Beispielen hast du veröffentlicht.

    Ich möchte dieses Beispiel weiter entwickeln und ein Bitmap an iorgend einer Stelle im Video machen.
    Dazu verwende ich die Methode m_displayControl.GetCurrentImage(pBih, out pDib, out pcbDib, out pTimeStamp);

    Wie kann ich diese Methode mit async und await aufrufen damit ich das Bitmap anspeichern kann?
    Ich erhalte die Fehlermeldungen „Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.“
    und anschließend „Das Objekt wird bereits an anderer Stelle verwendet.“

    Antworten

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.