媒体文件的自定义元数据提供程序
本主题介绍如何为 Microsoft Media Foundation 媒体源编写自定义 Shell 属性处理程序。
注意
有关 Media Foundation 中元数据提供程序的背景信息,请参阅 媒体元数据。 本主题讨论 Shell 属性处理程序;它不描述版本 1 元数据接口 IMFMetadata。
元数据与文件格式紧密相关。 在 Media Foundation 中,文件格式由媒体源表示。 如果要支持媒体基础中本机不支持的格式的元数据,则必须使用属性处理程序实现自定义媒体源。 属性处理程序使 Shell 属性系统能够有效地读取和写入元数据。
属性处理程序是实现以下接口的 COM 对象:
(可选)它还可以公开以下接口:
如果 Shell 属性系统需要获取文件的元数据,它会调用 CoCreateInstance 来创建属性处理程序,然后在 IPropertyStore 接口上调用相应的读取和写入方法。
媒体基础管道使用略有不同的机制,因为管道直接从媒体源获取属性处理程序。 管道不会调用 CoCreateInstance 来创建属性处理程序,而是在媒体源上调用 IMFGetService::GetService ,如主题 Shell 元数据提供程序中所述。
若要创建自定义属性处理程序,请执行以下操作:
- 实现 IMFGetService 接口以公开 IPropertyStore。 MF_PROPERTY_HANDLER_SERVICE服务 GUID。
- 如果媒体源将远程使用,则除了 IMFGetService 之外,它还必须通过媒体源的 QueryInterface 方法公开 IPropertyStore 接口。
- 若要使属性处理程序可用于 Shell 属性系统,请注册属性处理程序的 DLL,如 注册和分发属性处理程序中所述。
- 媒体源是单独注册的,如 方案处理程序和Byte-Stream处理程序中所述。
实现提示
有关元数据属性键的列表,请参阅 媒体文件的元数据属性。
属性处理程序必须快速;它们必须提供对元数据的高效读取和写入访问权限。 (考虑 Shell 可能从数百个文件检索元数据。) 因此,请不要从属性处理程序调用 MFStartup 。 MFStartup 函数引入了启动延迟,因为它会创建多个工作队列线程并分配全局内存。
在典型的实现中,属性处理程序和媒体源将共享一些相同的分析代码。 但是,媒体源对 I/O 使用异步 IMFByteStream 调用,而属性处理程序使用 IStream 接口。 媒体基础提供了一个帮助程序对象,该对象包装基于 IStream 的流,并将其公开为 IMFByteStream 流。 若要创建包装器,请调用 MFCreateMFByteStreamOnStream。
更新元数据时,建议将数据直接写入原始流。 此建议不同于大多数属性处理程序的 写入时复制 行为,后者修改了数据的副本。 媒体文件可能非常大,因此写入时复制通常太慢,无法高效实现。 若要禁用写入时复制,请设置 ManualSafeSave 注册表设置,如 注册和分发属性处理程序中所述。
相关主题