媒体文件的自定义元数据提供程序

本主题介绍如何为 Microsoft Media Foundation 媒体源编写自定义 Shell 属性处理程序。

注意

有关 Media Foundation 中元数据提供程序的背景信息,请参阅 媒体元数据。 本主题讨论 Shell 属性处理程序;它不描述版本 1 元数据接口 IMFMetadata

 

元数据与文件格式紧密相关。 在 Media Foundation 中,文件格式由媒体源表示。 如果要支持媒体基础中本机不支持的格式的元数据,则必须使用属性处理程序实现自定义媒体源。 属性处理程序使 Shell 属性系统能够有效地读取和写入元数据。

属性处理程序是实现以下接口的 COM 对象:

(可选)它还可以公开以下接口:

如果 Shell 属性系统需要获取文件的元数据,它会调用 CoCreateInstance 来创建属性处理程序,然后在 IPropertyStore 接口上调用相应的读取和写入方法。

媒体基础管道使用略有不同的机制,因为管道直接从媒体源获取属性处理程序。 管道不会调用 CoCreateInstance 来创建属性处理程序,而是在媒体源上调用 IMFGetService::GetService ,如主题 Shell 元数据提供程序中所述。

若要创建自定义属性处理程序,请执行以下操作:

实现提示

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

属性处理程序必须快速;它们必须提供对元数据的高效读取和写入访问权限。 (考虑 Shell 可能从数百个文件检索元数据。) 因此,请不要从属性处理程序调用 MFStartupMFStartup 函数引入了启动延迟,因为它会创建多个工作队列线程并分配全局内存。

在典型的实现中,属性处理程序和媒体源将共享一些相同的分析代码。 但是,媒体源对 I/O 使用异步 IMFByteStream 调用,而属性处理程序使用 IStream 接口。 媒体基础提供了一个帮助程序对象,该对象包装基于 IStream 的流,并将其公开为 IMFByteStream 流。 若要创建包装器,请调用 MFCreateMFByteStreamOnStream

更新元数据时,建议将数据直接写入原始流。 此建议不同于大多数属性处理程序的 写入时复制 行为,后者修改了数据的副本。 媒体文件可能非常大,因此写入时复制通常太慢,无法高效实现。 若要禁用写入时复制,请设置 ManualSafeSave 注册表设置,如 注册和分发属性处理程序中所述。

媒体元数据

媒体源

编写自定义媒体源