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 :
- Obtenez un pointeur vers l’interface IMFMediaSource de la source multimédia. Vous pouvez utiliser l’interface IMFSourceResolver pour obtenir un pointeur IMFMediaSource .
- Appelez IMFMediaSource::CreatePresentationDescriptor pour obtenir le descripteur de présentation de la source multimédia.
- 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.
- 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.
- [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.
- [Facultatif] Appelez IMFMetadata::SetLanguage pour sélectionner la langue.
- [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.
- 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;
}
Rubriques connexes