Provedores de metadados personalizados para arquivos de mídia
Este tópico descreve como escrever um manipulador de propriedades shell personalizado para uma fonte de mídia do Microsoft Media Foundation.
Observação
Para obter informações detalhadas sobre provedores de metadados no Media Foundation, consulte Metadados de mídia. Este tópico discute manipuladores de propriedade shell; ele não descreve a interface de metadados da versão 1, IMFMetadata.
Os metadados estão intimamente vinculados ao formato do arquivo. No Media Foundation, os formatos de arquivo são representados por fontes de mídia. Se você quiser dar suporte a metadados para um formato que não tem suporte nativo no Media Foundation, você deve implementar uma fonte de mídia personalizada com um manipulador de propriedades. O manipulador de propriedades permite que o sistema de propriedades shell leia e escreva metadados com eficiência.
Um manipulador de propriedades é um objeto COM que implementa as seguintes interfaces:
Opcionalmente, ele também pode expor a seguinte interface:
Se o sistema de propriedades Shell precisar obter metadados para um arquivo, ele chamará CoCreateInstance para criar o manipulador de propriedades e, em seguida, chamará os métodos apropriados de leitura e gravação na interface IPropertyStore .
O pipeline do Media Foundation usa um mecanismo ligeiramente diferente, pois o pipeline obtém o manipulador de propriedades diretamente da fonte de mídia. Em vez de chamar CoCreateInstance para criar o manipulador de propriedades, o pipeline chama IMFGetService::GetService na fonte de mídia, conforme descrito no tópico Provedores de Metadados do Shell.
Para criar um manipulador de propriedades personalizado, faça o seguinte:
- Implemente a interface IMFGetService para expor o IPropertyStore. O GUID de serviço é MF_PROPERTY_HANDLER_SERVICE.
- Se a fonte de mídia for usada remotamente, ela também deverá expor a interface IPropertyStore por meio do método QueryInterface da fonte de mídia, além de IMFGetService.
- Para disponibilizar o manipulador de propriedades para o sistema de propriedades Shell, registre a DLL para o manipulador de propriedades, conforme descrito em Registrando e distribuindo manipuladores de propriedade.
- A fonte de mídia é registrada separadamente, conforme descrito em Manipuladores de Esquema e manipuladores de Byte-Stream.
Dicas de implementação
Para obter uma lista de chaves de propriedade de metadados, consulte Propriedades de metadados para arquivos de mídia.
Os manipuladores de propriedades devem ser rápidos; eles devem fornecer acesso eficiente de leitura e gravação aos metadados. (Considere que o Shell pode recuperar metadados de centenas de arquivos.) Portanto, não chame MFStartup do manipulador de propriedades. A função MFStartup introduz latência de inicialização, pois cria vários threads de fila de trabalho e aloca memória global.
Em uma implementação típica, o manipulador de propriedades e a fonte de mídia compartilharão alguns dos mesmos códigos de análise. No entanto, uma fonte de mídia usa chamadas IMFByteStream assíncronas para E/S, enquanto o manipulador de propriedades usa a interface IStream . O Media Foundation fornece um objeto auxiliar que encapsula um fluxo baseado em IStream e o expõe como um fluxo IMFByteStream . Para criar o wrapper, chame MFCreateMFByteStreamOnStream.
Ao atualizar metadados, é recomendável gravar os dados diretamente no fluxo original. Essa recomendação difere do comportamento copy-on-write da maioria dos manipuladores de propriedade, no qual uma cópia dos dados é modificada. Os arquivos de mídia podem ser muito grandes, portanto, a cópia na gravação normalmente é muito lenta para uma implementação eficiente. Para desabilitar a cópia na gravação, defina a configuração do Registro ManualSafeSave , conforme descrito em Registrando e distribuindo manipuladores de propriedade.
Tópicos relacionados