Windows Vista 中的元数据提供程序

在 Windows Vista 中,Microsoft Media Foundation 通过 IMFMetadata 接口公开元数据。

读取元数据

若要从媒体源读取元数据,请执行以下步骤:

  1. 获取指向媒体源的 IMFMediaSource 接口的指针。 可以使用 IMFSourceResolver 接口获取 IMFMediaSource 指针。
  2. 调用 IMFMediaSource::CreatePresentationDescriptor 以获取媒体源的演示文稿描述符。
  3. 在媒体源上调用 MFGetService 以获取指向 IMFMetadataProvider 接口的 指针。 在 MFGetServiceguidService 参数中,指定MF_METADATA_PROVIDER_SERVICE值。 如果源不支持 IMFMetadataProvider 接口, 则 MFGetService 将返回 MF_E_UNSUPPORTED_SERVICE
  4. 调用 IMFMetadataProvider::GetMFMetadata 并传入指向表示描述符的指针。 此方法返回指向 IMFMetadata 接口的指针。
  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;
}

媒体元数据

Shell 元数据提供程序