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:

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.

Metadados de mídia

Fontes de mídia

Escrevendo uma fonte de mídia personalizada