Compartir a través de


Proveedores de metadatos en Windows Vista

En Windows Vista, Microsoft Media Foundation expone metadatos a través de la interfaz IMFMetadata .

Lectura de metadatos

Para leer metadatos de un origen multimedia, realice los pasos siguientes:

  1. Obtenga un puntero a la interfaz IMFMediaSource del origen multimedia. Puede usar la interfaz IMFSourceResolver para obtener un puntero IMFMediaSource .
  2. Llame a IMFMediaSource::CreatePresentationDescriptor para obtener el descriptor de presentación del origen multimedia.
  3. Llame a MFGetService en el origen multimedia para obtener un puntero a la interfaz IMFMetadataProvider . En el parámetro guidService de MFGetService, especifique el valor MF_METADATA_PROVIDER_SERVICE. Si el origen no admite la interfaz IMFMetadataProvider , MFGetService devuelve MF_E_UNSUPPORTED_SERVICE.
  4. Llame a IMFMetadataProvider::GetMFMetadata y pase un puntero al descriptor de presentación. Este método devuelve un puntero a la interfaz IMFMetadata .
    • Para obtener los metadatos de nivel de secuencia, llame primero a IMFStreamDescriptor::GetStreamIdentifier para obtener el identificador de secuencia. A continuación, pase el identificador de secuencia en el parámetro dwStreamIdentifier de GetMFMetadata.
    • Para obtener metadatos de nivel de presentación, establezca dwStreamIdentifier en cero.
  5. [Opcional] Llame a IMFMetadata::GetAllLanguages para obtener una lista de los idiomas en los que están disponibles los metadatos. Los idiomas se identifican mediante etiquetas de idioma compatibles con RFC 1766.
  6. [Opcional] Llame a IMFMetadata::SetLanguage para seleccionar el idioma.
  7. [Opcional] Llame a IMFMetadata::GetAllPropertyNames para obtener una lista de los nombres de todas las propiedades de metadatos de esta secuencia o presentación.
  8. Llame a IMFMetadata::GetProperty para obtener un valor de propiedad de metadatos específico, pasando el nombre de la propiedad.

En el código siguiente se muestran los pasos del 2 al 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;
}

En el código siguiente se muestran los pasos 7 a 8. Supongamos que DisplayProperty es una función que muestra un 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;
}

Metadatos multimedia

Proveedores de metadatos de Shell