Share via


Benutzerdefinierte Metadatenanbieter für Mediendateien

In diesem Thema wird beschrieben, wie Sie einen benutzerdefinierten Shell-Eigenschaftshandler für eine Microsoft Media Foundation-Medienquelle schreiben.

Hinweis

Hintergrundinformationen zu Metadatenanbietern in Media Foundation finden Sie unter Medienmetadaten. In diesem Thema werden Shell-Eigenschaftshandler erläutert; es beschreibt nicht die Metadatenschnittstelle der Version 1, IMFMetadata.

 

Metadaten sind eng mit dem Format der Datei verknüpft. In Media Foundation werden Dateiformate durch Medienquellen dargestellt. Wenn Sie Metadaten für ein Format unterstützen möchten, das in Media Foundation nicht nativ unterstützt wird, müssen Sie eine benutzerdefinierte Medienquelle mit einem Eigenschaftshandler implementieren. Der Eigenschaftshandler ermöglicht es dem Shell-Eigenschaftssystem, Metadaten effizient zu lesen und zu schreiben.

Ein Eigenschaftshandler ist ein COM-Objekt, das die folgenden Schnittstellen implementiert:

Optional kann sie auch die folgende Schnittstelle verfügbar machen:

Wenn das Shell-Eigenschaftssystem Metadaten für eine Datei abrufen muss, ruft es CoCreateInstance auf, um den Eigenschaftenhandler zu erstellen, und ruft dann die entsprechenden Lese- und Schreibmethoden auf der IPropertyStore-Schnittstelle auf.

Die Media Foundation-Pipeline verwendet einen etwas anderen Mechanismus, da die Pipeline den Eigenschaftenhandler direkt aus der Medienquelle abruft. Anstatt CoCreateInstance zum Erstellen des Eigenschaftshandlers aufzurufen, ruft die Pipeline IMFGetService::GetService auf der Medienquelle auf, wie im Thema Shell-Metadatenanbieter beschrieben.

Gehen Sie wie folgt vor, um einen benutzerdefinierten Eigenschaftenhandler zu erstellen:

Implementierung Tipps

Eine Liste der Metadateneigenschaftenschlüssel finden Sie unter Metadateneigenschaften für Mediendateien.

Eigenschaftenhandler müssen schnell sein; sie müssen effizienten Lese- und Schreibzugriff auf die Metadaten bereitstellen. (Erwägen Sie, dass die Shell Möglicherweise Metadaten aus Hunderten von Dateien abruft.) Rufen Sie daher MFStartup nicht von Ihrem Eigenschaftshandler auf. Die MFStartup-Funktion führt die Startlatenz ein, da sie mehrere Arbeitswarteschlangenthreads erstellt und den globalen Arbeitsspeicher zuweist.

In einer typischen Implementierung teilen der Eigenschaftenhandler und die Medienquelle einige der gleichen Analysecode. Eine Medienquelle verwendet jedoch asynchrone IMFByteStream-Aufrufe für I/O, während der Eigenschaftshandler die IStream-Schnittstelle verwendet. Media Foundation stellt ein Hilfsobjekt bereit, das einen IStream-basierten Datenstrom umschließt und als IMFByteStream-Stream verfügbar macht. Rufen Sie zum Erstellen des Wrappers MFCreateMFByteStreamOnStreamOnStream auf.

Beim Aktualisieren von Metadaten wird empfohlen, die Daten direkt in den ursprünglichen Datenstrom zu schreiben. Diese Empfehlung unterscheidet sich von dem Kopier-on-Write-Verhalten der meisten Eigenschaftenhandler, in denen eine Kopie der Daten geändert wird. Mediendateien können sehr groß sein, sodass kopier-on-write in der Regel zu langsam ist, um eine effiziente Implementierung zu erreichen. Zum Deaktivieren von Kopier-on-Schreibvorgängen legen Sie die Registrierungseinstellung "ManualSafeSave " fest, wie unter "Registrieren" und "Verteilen von Eigenschaftenhandlern" beschrieben.

Medienmetadaten

Medienquellen

Schreiben einer benutzerdefinierten Medienquelle