[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine和媒体基金会中的 音频/视频捕获取代。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media 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,如下所示:
- KsProxy 查询下游输入引脚以获取 IMFGetService 接口。
- 如果引脚公开 IMFGetService,则 KsProxy 将调用 IMFGetService::GetService 接口来获取 IDirect3DDeviceManager 接口。 服务标识符MR_VIDEO_ACCELERATION_SERVICE。
这两个接口都记录在 Media Foundation SDK 文档中。
如果下游筛选器不支持 DXVA 2.0,KsProxy 会分配额外的系统内存缓冲区。 它使用此缓冲区将视频帧从 VRAM 复制到系统内存。 媒体示例的 IMediaSample::GetPointer 方法返回指向此系统内存缓冲区的指针。
但是,如果下游筛选器支持 DXVA 2.0,则 KsProxy 不会分配系统内存缓冲区。 在这种情况下, GetPointer 方法返回E_NOTIMPL。 相反,下游筛选器应直接访问示例的 Direct3D 图面。 下游筛选器可通过两种方式获取指向图面的指针,这两种方法均等效:
- 查询 IMFGetService 接口的示例,并为 IDirect3DSurface9 接口调用 GetService。 服务标识符MR_BUFFER_SERVICE。
- 查询 IMediaSample2Config 接口的示例,并调用 IMediaSample2Config::GetSurface。
相关主题