Provider di metadati in Windows Vista
In Windows Vista, Microsoft Media Foundation espone i metadati tramite l'interfaccia IMFMetadata .
Lettura dei metadati
Per leggere i metadati da un'origine multimediale, seguire questa procedura:
- Ottenere un puntatore all'interfaccia IMFMediaSource dell'origine multimediale. È possibile usare l'interfaccia IMFSourceResolver per ottenere un puntatore IMFMediaSource .
- Chiamare IMFMediaSource::CreatePresentationDescriptor per ottenere il descrittore di presentazione dell'origine multimediale.
- Chiamare MFGetService nell'origine multimediale per ottenere un puntatore all'interfaccia IMFMetadataProvider . Nel parametro guidService di MFGetService specificare il valore MF_METADATA_PROVIDER_SERVICE. Se l'origine non supporta l'interfaccia IMFMetadataProvider , MFGetService restituisce MF_E_UNSUPPORTED_SERVICE.
- Chiamare IMFMetadataProvider::GetMFMetadata e passare un puntatore al descrittore di presentazione. Questo metodo restituisce un puntatore all'interfaccia IMFMetadata .
- Per ottenere i metadati a livello di flusso chiama prima IMFStreamDescriptor::GetStreamIdentifier per ottenere l'identificatore del flusso. Passare quindi l'identificatore del flusso nel parametro dwStreamIdentifier di GetMFMetadata.
- Per ottenere i metadati a livello di presentazione, impostare dwStreamIdentifier su zero.
- [Facoltativo] Chiama IMFMetadata::GetAllLanguages per ottenere un elenco delle lingue in cui sono disponibili i metadati. Le lingue vengono identificate usando tag di linguaggio conformi a RFC 1766.
- [Facoltativo] Chiamare IMFMetadata::SetLanguage per selezionare la lingua.
- [Facoltativo] Chiamare IMFMetadata::GetAllPropertyNames per ottenere un elenco dei nomi di tutte le proprietà dei metadati per questo flusso o presentazione.
- Chiamare IMFMetadata::GetProperty per ottenere un valore di proprietà di metadati specifico, passando il nome della proprietà.
Il codice seguente illustra i passaggi da 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;
}
Il codice seguente illustra i passaggi da 7 a 8. Si supponga che DisplayProperty
sia una funzione che visualizza un valore 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;
}
Argomenti correlati