Поделиться через


Поставщики метаданных в Windows Vista

В Windows Vista Microsoft Media Foundation предоставляет метаданные через интерфейс IMFMetadata .

Чтение метаданных

Чтобы прочитать метаданные из источника мультимедиа, выполните следующие действия.

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

Метаданные мультимедиа

Поставщики метаданных оболочки