关于媒体示例和分配器

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

筛选器跨引脚连接提供数据。 数据从一个筛选器的输出引脚移动到另一个筛选器的输入引脚。 输出引脚传递数据的最常见方法是对输入调用 IMemInputPin::Receive 方法,但也有一些其他机制。

根据筛选器,媒体数据的内存可以通过各种方式分配:在堆上、在 DirectDraw 图面中、使用共享 GDI 内存或使用某种其他分配机制。 负责分配内存的对象称为 分配器,该分配器是公开 IMemAllocator 接口的 COM 对象。

当两个引脚连接时,其中一个引脚必须提供分配器。 DirectShow 定义一系列方法调用,用于建立哪个引脚提供分配器。 引脚还就分配器将创建的缓冲区数和缓冲区大小达成一致。

在流式处理开始之前,分配器会创建缓冲区池。 在流式处理期间,上游筛选器使用数据填充缓冲区,并将其传递到下游筛选器。 但是,上游筛选器不会为下游筛选器提供指向缓冲区的原始指针。 相反,它使用称为 媒体示例的 COM 对象,分配器创建这些对象来管理缓冲区。 媒体示例公开 IMediaSample 接口。 媒体示例包含:

  • 指向基础缓冲区的指针
  • 时间戳
  • 各种标志
  • (可选)媒体类型

时间戳定义呈现器筛选器用于计划呈现的呈现时间。 标志指示自上一个示例以来数据中是否存在中断之类的情况。 媒体类型为筛选器提供了一种在流中更改格式的方法。 通常,该示例没有媒体类型,这表示格式自上一个示例以来没有更改。

当筛选器使用缓冲区时,它会保留样本的引用计数。 分配器使用引用计数来确定何时可以重复使用缓冲区。 这可以防止筛选器覆盖另一个筛选器仍在使用的缓冲区。 样本不会返回到分配器的可用样本池,直到每个筛选器释放它。

有关详细信息,请参阅下列主题:

以下主题适用于编写自己的自定义筛选器的开发人员:

筛选器图及其组件