DirectShow 视频捕获筛选器

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

DirectShow 中的捕获筛选器具有一些将其与其他类型的筛选器区分开来的功能。 尽管 捕获图形生成器 隐藏了许多详细信息,但最好阅读此部分,以便大致了解 DirectShow 捕获图。

固定类别

捕获筛选器通常具有两个或多个输出引脚,这些引脚提供相同类型的数据,例如预览引脚和捕获引脚。 因此,媒体类型不是区分引脚的好方法。 相反,引脚按功能进行区分,该功能使用 GUID(称为 引脚类别)进行标识。

有关如何查询固定类别的讨论,请参阅 使用固定类别。 但是,对于大多数应用程序,不必直接查询固定。 相反,各种 ICaptureGraphBuilder2 方法采用指定操作的引脚类别的参数。 捕获图形生成器会自动找到正确的引脚。

预览引脚和捕获引脚

某些视频捕获设备具有单独的输出引脚,用于预览和捕获。 预览插针用于将视频呈现到屏幕,而捕获引脚用于将视频写入文件。

预览固定和捕获引脚具有以下差异:

  • 预览引脚会根据需要删除帧,以保持捕获引脚上的吞吐量。
  • 捕获引脚中的每个帧都带有捕获帧时的流时间的时间戳。 预览引脚不会为其提供的示例添加时间戳。

预览帧没有时间戳的原因是筛选器图在流中引入了少量延迟。 如果将捕获时间用作演示时间,则视频呈现器会将每个样本视为稍晚。 这可能会导致视频呈现器在尝试追赶时删除帧。 删除时间戳可确保呈现器在到达时显示每个样本,而不会删除帧。

预览引脚的固定类别PIN_CATEGORY_PREVIEW。 捕获引脚的类别是PIN_CATEGORY_CAPTURE。

视频端口引脚

视频端口是视频设备 ((如模拟电视调谐器) )与视频卡之间的硬件连接。 视频端口使设备能够将视频数据直接发送到图形卡。 视频使用硬件覆盖在屏幕上显示。 视频端口可能是将两台设备连接到单独卡上的实际电缆;或者可能是同一卡上的硬连线连接。

视频端口的优点是视频直接进入视频内存,无需 CPU 进行任何工作。 但是,视频端口有一些缺点:

  • 无论是否要预览视频,视频端口在捕获期间始终使用覆盖图面。
  • 帧之间的翻转会自动发生,这使得翻转与其他视频操作同步变得困难。

如果捕获设备使用视频端口,则捕获筛选器具有视频端口引脚而不是预览插针。 视频端口引脚的引脚类别PIN_CATEGORY_VIDEOPORT。

每个捕获筛选器至少有一个捕获引脚。 此外,它可能有预览插针或视频端口固定,但绝不能同时具有两者。 筛选器可以有多个捕获引脚和预览引脚,每个引脚提供单独的媒体类型。 因此,单个筛选器可以有一个视频捕获引脚、一个视频预览引脚、一个音频捕获引脚和一个音频预览引脚。 (不过,没有任何等效于音频的视频端口。)

上游 WDM 筛选器

Windows 驱动程序模型 (WDM) 设备可能需要捕获筛选器上游一些额外的筛选器。 这些筛选器包括:

尽管这些筛选器是 DirectShow 中的单独筛选器,但它们通常表示相同的硬件设备。 每个筛选器控制设备的不同功能。 筛选器通过引脚连接,但媒体数据不会在引脚连接之间移动。 因此,这些筛选器上的引脚不会通过建立媒体类型进行连接。 相反,它们使用称为 介质的 GUID 值。 中等 GUID 是为给定设备微型驱动程序唯一定义的。 例如,同一电视卡的电视调谐器筛选器和视频捕获筛选器都支持同一介质,这使应用程序能够正确生成图形。

在实践中,只要使用 ICaptureGraphBuilder2 生成捕获图,这些筛选器会自动添加到图形中。 有关更详细的讨论,请参阅 WDM 类驱动程序筛选器

关于 DirectShow 中的视频捕获