Shell 元数据提供程序

从 Windows 7 开始,Microsoft Media Foundation 通过 IPropertyStore 接口公开元数据。

使用本主题中定义的进程获取的元数据应仅用于只读访问。 不支持使用此过程写入数据。 可以使用从 PSLookupPropertyHandlerCLSID 获取的类标识符 (CLSID) 创建 IPropertyStore 对象以进行写入。

读取元数据

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

  1. 获取指向媒体源的 IMFMediaSource 接口的指针。 可以使用 IMFSourceResolver 接口获取 IMFMediaSource 指针。
  2. 在媒体源上调用 MFGetService 以获取指向 IPropertyStore 接口的指针。 在 MFGetServiceguidService 参数中,指定MF_PROPERTY_HANDLER_SERVICE值。 如果源不支持 IPropertyStore 接口, MFGetService 将返回 MF_E_UNSUPPORTED_SERVICE
  3. 调用 IPropertyStore 方法以枚举元数据属性。

以下代码演示这些步骤。 DisplayProperty假设 是一个显示 PROPVARIANT 值的函数。

HRESULT EnumerateMetadata(IMFMediaSource *pSource)
{
    IPropertyStore *pProps = NULL;

    HRESULT hr = MFGetService(
        pSource, MF_PROPERTY_HANDLER_SERVICE, IID_PPV_ARGS(&pProps));

    if (FAILED(hr))
    {
        goto done;
    }

    DWORD cProps;

    hr = pProps->GetCount(&cProps);
    if (FAILED(hr))
    {
        goto done;
    }

    for (DWORD i = 0; i < cProps; i++)
    {
        PROPERTYKEY key;
        hr = pProps->GetAt(i, &key);
        if (FAILED(hr))
        {
            goto done;
        }

        PROPVARIANT pv;

        hr = pProps->GetValue(key, &pv);
        if (FAILED(hr))
        {
            goto done;
        }

        DisplayProperty(key, pv);
        PropVariantClear(&pv);
    }

done:
    SafeRelease(&pProps);
    return hr;
}

有关元数据属性键的列表,请参阅 媒体文件的元数据属性

媒体元数据