Поставщики метаданных в Windows Vista
В Windows Vista Microsoft Media Foundation предоставляет метаданные через интерфейс IMFMetadata .
Чтение метаданных
Чтобы прочитать метаданные из источника мультимедиа, выполните следующие действия.
- Получите указатель на интерфейс IMFMediaSource источника мультимедиа. Чтобы получить указатель IMFMediaSourceSource, можно использовать интерфейс IMFSourceResolver.
- Вызовите IMFMediaSource::CreatePresentationDescriptor , чтобы получить дескриптор представления источника мультимедиа.
- Вызовите MFGetService в источнике мультимедиа, чтобы получить указатель на интерфейс IMFMetadataProvider . В параметре guidServiceMFGetService укажите значение MF_METADATA_PROVIDER_SERVICE. Если источник не поддерживает интерфейс IMFMetadataProvider , MFGetService возвращает MF_E_UNSUPPORTED_SERVICE.
- Вызовите IMFMetadataProvider::GetMFMetadata и передайте указатель на дескриптор представления. Этот метод возвращает указатель на интерфейс IMFMetadata .
- Чтобы получить метаданные уровня потока, сначала вызовите IMFStreamDescriptor::GetStreamIdentifier , чтобы получить идентификатор потока. Затем передайте идентификатор потока в параметре dwStreamIdentifierэлемента GetMFMetadata.
- Чтобы получить метаданные уровня презентации, задайте для dwStreamIdentifier нулевое значение.
- [Необязательно] Вызовите IMFMetadata::GetAllLanguages , чтобы получить список языков, на которых доступны метаданные. Языки определяются с помощью тегов языка, совместимых с RFC 1766.
- [Необязательно] Вызовите IMFMetadata::SetLanguage , чтобы выбрать язык.
- [Необязательно] Вызовите IMFMetadata::GetAllPropertyNames , чтобы получить список имен всех свойств метаданных для этого потока или презентации.
- Вызовите IMFMetadata::GetProperty , чтобы получить определенное значение свойства метаданных, передав имя свойства.
В следующем коде показаны шаги 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;
}
В следующем коде показаны шаги 7–8. Предположим, что DisplayProperty
является функцией, отображающей значение 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;
}
Связанные темы