在 DirectShow 中使用 WDDM 捕获

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

本主题适用于 Windows Vista 及更高版本。

某些视频卡具有集成的视频捕获功能。 在这些卡上,捕获的视频帧放置在 VRAM) (视频内存中。 在 Windows Vista 之前,在帧保留在 VRAM 中时,没有用于处理帧的标准机制。 相反,必须将数据复制到系统内存中并进行处理,然后复制回 VRAM 以供显示。 在 Windows Vista 中,DirectShow 现在支持在整个处理管道(从捕获到显示)中保留 VRAM 中的视频帧的机制。

KsProxy 筛选器通过查询驱动程序中的 KSPROPERTY_PREFERRED_CAPTURE_SURFACE 属性来确定驱动程序是否支持 VRAM 图面捕获。 (此属性记录在 Windows 驱动程序工具包文档中。) 如果驱动程序支持 VRAM 图面捕获,KsProxy 将分配一种特殊类型的媒体示例,用于保存指向 Direct3D 图面的指针。

接下来,KsProxy 确定下游筛选器是否支持 DirectX 视频加速 (DXVA) 2.0,如下所示:

  1. KsProxy 查询 IMFGetService 接口的下游输入引脚。
  2. 如果引脚公开 IMFGetService,KsProxy 会为 IDirect3DDeviceManager 接口调用 IMFGetService::GetService。 服务 identier 是MR_VIDEO_ACCELERATION_SERVICE。

媒体基础 SDK 文档中记录了这两个接口。

如果下游筛选器不支持 DXVA 2.0,KsProxy 将分配额外的系统内存缓冲区。 它使用此缓冲区将视频帧从 VRAM 复制到系统内存。 媒体示例的 IMediaSample::GetPointer 方法返回指向此系统内存缓冲区的指针。

但是,如果下游筛选器支持 DXVA 2.0,则 KsProxy 不会分配系统内存缓冲区。 在这种情况下, GetPointer 方法返回E_NOTIMPL。 相反,下游筛选器应直接访问示例的 Direct3D 图面。 下游筛选器可通过两种方式获取指向图面的指针,这两种方法都等效:

高级捕获主题