Metadatenanbieter in Windows Vista

In Windows Vista macht Microsoft Media Foundation Metadaten über die BESMETADATA-Schnittstelle verfügbar.

Lesen von Metadaten

Führen Sie die folgenden Schritte aus, um Metadaten aus einer Medienquelle zu lesen:

  1. Sie erhalten einen Zeiger auf die BENUTZEROBERFLÄCHEMediaSource-Schnittstelle der Medienquelle. Sie können die BENUTZEROBERFLÄCHESourceResolver-Schnittstelle verwenden, um einen NSMEDIASource-Zeiger zu erhalten.
  2. Rufen Sie DIE MEDIENQUELLE::CreatePresentationDescriptor auf, um den Präsentationsdeskriptor der Medienquelle zu erhalten.
  3. Rufen Sie MFGetService für die Medienquelle auf, um einen Zeiger auf die BENUTZEROBERFLÄCHEMetadataProvider-Schnittstelle zu erhalten. Geben Sie im guidService-Parameter von MFGetService den Wert MF METADATA PROVIDER SERVICE _ _ _ an. Wenn die Quelle die BENUTZEROBERFLÄCHEMetadataProvider-Schnittstelle nicht unterstützt, gibt MFGetService MF E _ _ UNSUPPORTED _ SERVICE zurück.
  4. Rufen Sie DIEMETADATAProvider::GetMFMetadata auf, und übergeben Sie einen Zeiger auf den Präsentationsdeskriptor. Diese Methode gibt einen Zeiger auf die BENUTZEROBERFLÄCHEMetadata-Schnittstelle zurück.
    • Um Metadaten auf Streamebene zu erhalten, rufen Sie zuerst DEN STREAMDescriptor::GetStreamIdentifier auf, um den Streambezeichner zu erhalten. Übergeben Sie dann den Streambezeichner im dwStreamIdentifier-Parameter von GetMFMetadata.
    • Legen Sie dwStreamIdentifier auf 0 (null) fest, um Metadaten auf Präsentationsebene zu erhalten.
  5. [Rufen ] Sie optional DEN Aufruf VON VORMMETADATA::GetAllLanguages auf, um eine Liste der Sprachen zu erhalten, in denen Metadaten verfügbar sind. Sprachen werden mit RFC 1766-kompatiblen Sprachtags identifiziert.
  6. [Optional rufen Sie ZUM Auswählen der Sprache DEN Aufruf ] VON VORNMETADATA::SetLanguage auf.
  7. [Rufen ] Sie optional DEN NAMEN DER METADATEN AUF::GetAllPropertyNames auf, um eine Liste der Namen aller Metadateneigenschaften für diesen Stream oder diese Präsentation zu erhalten.
  8. Rufen Sie DURCHMETADATA::GetProperty auf, um einen bestimmten Metadateneigenschaftswert zu erhalten, und übergeben Sie dabei den Namen der Eigenschaft.

Der folgende Code zeigt die Schritte 2 bis 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;
}

Der folgende Code zeigt die Schritte 7 bis 8. Angenommen, DisplayProperty es handelt sich um eine Funktion, die einen PROPVARIANT-Wert anzeigt.

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;
}

Medienmetadaten

Shellmetadatenanbieter