Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette rubrique explique comment écrire un gestionnaire de propriétés Shell personnalisé pour une source multimédia Microsoft Media Foundation.
Note
Pour plus d’informations sur les fournisseurs de métadonnées dans Media Foundation, consultez métadonnées multimédias. Cette rubrique traite des gestionnaires de propriétés Shell ; elle ne décrit pas l’interface de métadonnées version 1, IMFMetadata.
Les métadonnées sont étroitement liées au format du fichier. Dans Media Foundation, les formats de fichiers sont représentés par des sources multimédias. Si vous souhaitez prendre en charge les métadonnées d’un format qui n’est pas pris en charge en mode natif dans Media Foundation, vous devez implémenter une source multimédia personnalisée avec un gestionnaire de propriétés. Le gestionnaire de propriétés permet au système de propriétés Shell de lire et d’écrire efficacement les métadonnées.
Un gestionnaire de propriétés est un objet COM qui implémente les interfaces suivantes :
- IInitializeWithStream
- IPropertyStore
Si vous le souhaitez, il peut également exposer l’interface suivante :
Si le système de propriétés Shell doit obtenir des métadonnées pour un fichier, il appelle CoCreateInstance pour créer le gestionnaire de propriétés, puis appelle les méthodes de lecture et d’écriture appropriées sur l’interface IPropertyStore.
Le pipeline Media Foundation utilise un mécanisme légèrement différent, car le pipeline obtient le gestionnaire de propriétés directement à partir de la source multimédia. Au lieu d’appeler CoCreateInstance pour créer le gestionnaire de propriétés, le pipeline appelle IMFGetService ::GetService sur la source multimédia, comme décrit dans la rubrique Fournisseurs de métadonnées Shell.
Pour créer un gestionnaire de propriétés personnalisé, procédez comme suit :
- Implémentez l’interfaceIMFGetService pour exposer IPropertyStore. Le GUID de service est MF_PROPERTY_HANDLER_SERVICE.
- Si la source multimédia est utilisée à distance, elle doit également exposer l’interface IPropertyStore via la méthode QueryInterface de la source multimédia, en plus de IMFGetService.
- Pour rendre le gestionnaire de propriétés disponible pour le système de propriétés Shell, inscrivez la DLL pour le gestionnaire de propriétés, comme décrit dans Inscrire et distribuer des gestionnaires de propriétés.
- La source multimédia est inscrite séparément, comme décrit dans Gestionnaires de schémas et gestionnaires Byte-Stream.
Conseils d’implémentation
Pour obtenir la liste des clés de propriété de métadonnées, consultez Propriétés des métadonnées pour les fichiers multimédias.
Les gestionnaires de propriétés doivent être rapides ; ils doivent fournir un accès en lecture et écriture efficace aux métadonnées. (Considérez que l’interpréteur de commandes peut récupérer des métadonnées à partir de centaines de fichiers.) Par conséquent, n’appelez pas MFStartup à partir de votre gestionnaire de propriétés. La fonction MFStartup introduit la latence de démarrage, car elle crée plusieurs threads de file d’attente de travail et alloue de la mémoire globale.
Dans une implémentation classique, le gestionnaire de propriétés et la source multimédia partageront un certain code d’analyse. Toutefois, une source multimédia utilise des appels d’E/S asynchrones IMFByteStream, tandis que le gestionnaire de propriétés utilise l’interfaceIStream. Media Foundation fournit un objet d’assistance qui encapsule un flux IStreamet l’expose en tant que flux IMFByteStream. Pour créer le wrapper, appelez MFCreateMFByteStreamOnStream.
Lors de la mise à jour des métadonnées, il est recommandé d’écrire les données directement dans le flux d’origine. Cette recommandation diffère de la comportement de copie en écriture de la plupart des gestionnaires de propriétés, dans lesquels une copie des données est modifiée. Les fichiers multimédias peuvent être très volumineux, de sorte que la copie en écriture est généralement trop lente pour une implémentation efficace. Pour désactiver la copie en écriture, définissez le paramètre de Registre ManualSafeSaveSave, comme décrit dans Gestionnaires de propriétés de registre et de distribution.
Rubriques connexes