Partager via


Fournisseurs de métadonnées dans Windows Vista

Dans Windows Vista, Microsoft Media Foundation expose les métadonnées via l’interface IMFMetadata .

Lecture des métadonnées

Pour lire les métadonnées d’une source multimédia, procédez comme suit :

  1. Obtenez un pointeur vers l’interface IMFMediaSource de la source multimédia. Vous pouvez utiliser l’interface IMFSourceResolver pour obtenir un pointeur IMFMediaSource .
  2. Appelez IMFMediaSource::CreatePresentationDescriptor pour obtenir le descripteur de présentation de la source multimédia.
  3. Appelez MFGetService sur la source multimédia pour obtenir un pointeur vers l’interface IMFMetadataProvider . Dans le paramètre guidService de MFGetService, spécifiez la valeur MF_METADATA_PROVIDER_SERVICE. Si la source ne prend pas en charge l’interface IMFMetadataProvider , MFGetService retourne MF_E_UNSUPPORTED_SERVICE.
  4. Appelez IMFMetadataProvider::GetMFMetadata et passez un pointeur vers le descripteur de présentation. Cette méthode retourne un pointeur vers l’interface IMFMetadata .
    • Pour obtenir les métadonnées au niveau du flux, appelez d’abord IMFStreamDescriptor::GetStreamIdentifier afin d’obtenir l’identificateur de flux. Passez ensuite l’identificateur de flux dans le paramètre dwStreamIdentifier de GetMFMetadata.
    • Pour obtenir des métadonnées au niveau de la présentation, définissez dwStreamIdentifier sur zéro.
  5. [Facultatif] Appelez IMFMetadata::GetAllLanguages pour obtenir la liste des langues dans lesquelles les métadonnées sont disponibles. Les langues sont identifiées à l’aide de balises de langue conformes À la norme RFC 1766.
  6. [Facultatif] Appelez IMFMetadata::SetLanguage pour sélectionner la langue.
  7. [Facultatif] Appelez IMFMetadata::GetAllPropertyNames pour obtenir la liste des noms de toutes les propriétés de métadonnées pour ce flux ou cette présentation.
  8. Appelez IMFMetadata::GetProperty pour obtenir une valeur de propriété de métadonnées spécifique, en passant le nom de la propriété.

Le code suivant illustre les étapes 2 à 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;
}

Le code suivant montre les étapes 7 à 8. Supposons que DisplayProperty soit une fonction qui affiche une valeur 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;
}

Métadonnées de média

Fournisseurs de métadonnées shell