Compartilhar via


Provedores de metadados no Windows Vista

No Windows Vista, o Microsoft Media Foundation expõe metadados por meio da interface IMFMetadata .

Lendo metadados

Para ler metadados de uma fonte de mídia, execute as seguintes etapas:

  1. Obtenha um ponteiro para a interface IMFMediaSource da fonte de mídia. Você pode usar a interface IMFSourceResolver para obter um ponteiro IMFMediaSource .
  2. Chame IMFMediaSource::CreatePresentationDescriptor para obter o descritor de apresentação da fonte de mídia.
  3. Chame MFGetService na fonte de mídia para obter um ponteiro para a interface IMFMetadataProvider . No parâmetro guidService de MFGetService, especifique o valor MF_METADATA_PROVIDER_SERVICE. Se a origem não der suporte à interface IMFMetadataProvider , MFGetService retornará MF_E_UNSUPPORTED_SERVICE.
  4. Chame IMFMetadataProvider::GetMFMetadata e passe um ponteiro para o descritor de apresentação. Esse método retorna um ponteiro para a interface IMFMetadata .
    • Para obter metadados no nível do fluxo, primeiro chame IMFStreamDescriptor::GetStreamIdentifier para obter o identificador de fluxo. Em seguida, passe o identificador de fluxo no parâmetro dwStreamIdentifier de GetMFMetadata.
    • Para obter metadados no nível da apresentação, defina dwStreamIdentifier como zero.
  5. [Opcional] Chame IMFMetadata::GetAllLanguages para obter uma lista dos idiomas nos quais os metadados estão disponíveis. Os idiomas são identificados usando marcas de idioma compatíveis com RFC 1766.
  6. [Opcional] Chame IMFMetadata::SetLanguage para selecionar o idioma.
  7. [Opcional] Chame IMFMetadata::GetAllPropertyNames para obter uma lista dos nomes de todas as propriedades de metadados para este fluxo ou apresentação.
  8. Chame IMFMetadata::GetProperty para obter um valor de propriedade de metadados específico, passando o nome da propriedade.

O código a seguir mostra as etapas 2 a 4:

HRESULT GetMetadata(
    IMFMediaSource *pSource, IMFMetadata **ppMetadata, DWORD dwStream = 0)
{
    IMFPresentationDescriptor *pPD = NULL;
    IMFMetadataProvider *pProvider = NULL;

    HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFGetService(
        pSource, MF_METADATA_PROVIDER_SERVICE, IID_PPV_ARGS(&pProvider));

    if (FAILED(hr))
    {
        goto done;
    }

    hr = pProvider->GetMFMetadata(pPD, dwStream, 0, ppMetadata);

done:
    SafeRelease(&pPD);
    SafeRelease(&pProvider);
    return hr;
}

O código a seguir mostra as etapas 7 a 8. Suponha que DisplayProperty seja uma função que exibe um valor PROPVARIANT .

HRESULT DisplayMetadata(IMFMetadata *pMetadata)
{
    PROPVARIANT varNames;
    HRESULT hr = pMetadata->GetAllPropertyNames(&varNames);
    if (FAILED(hr))
    {
        return hr;
    }

    for (ULONG i = 0; i < varNames.calpwstr.cElems; i++)
    {
        wprintf(L"%s\n", varNames.calpwstr.pElems[i]);

        PROPVARIANT varValue;
        hr = pMetadata->GetProperty( varNames.calpwstr.pElems[i], &varValue );
        if (SUCCEEDED(hr))
        {
            DisplayProperty(varValue);
            PropVariantClear(&varValue);
        }
    }

    PropVariantClear(&varNames);
    return hr;
}

Metadados de mídia

Provedores de metadados do Shell