为 VMR-9 提供自定义Allocator-Presenter
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
若要将自定义分配器演示器与视频混合呈现器 9 (VMR-9) 筛选器配合使用,请执行以下步骤:
实现支持 IVMRSurfaceAllocator9 和 IVMRImagePresenter9 接口的 类。
在 IVMRFilterConfig9 接口的 VMR-9 筛选器上调用 QueryInterface。
调用 IVMRFilterConfig9::SetRenderingMode 方法并传入 VMR9Mode_Renderless 标志。
针对 IVMRSurfaceAllocatorNotify9 接口的 VMR-9 筛选器上的 QueryInterface。
调用 IVMRSurfaceAllocatorNotify9::AdviseSurfaceAllocator 方法,并传入指向分配器表示器的 IVMRSurfaceAllocator9 方法的指针。
调用分配器-表示器的 IVMRSurfaceAllocator9::AdviseNotify 方法,并传入指向 VMR-9 筛选器的 IVMRSurfaceAllocatorNotify9 接口的指针。
在 IVMRSurfaceAllocator9::AdviseNotify 的实现中,调用 IVMRSurfaceAllocatorNotify9::SetD3DDevice Pass,该指针指向 Direct3D 设备,并在其中显示视频的监视器句柄。
在 IVMRSurfaceAllocator9::InitializeDevice 方法的实现中,创建与 InitializeDevice 方法中给定的参数匹配的 Direct3D 图面。 (可选)可以使用 VMR-9 筛选器的 IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper 方法来分配这些图面。 将图面指针存储在数组中。
注意
如果希望 VMR-9 将视频帧绘制到纹理图面上,请将 VMR9AllocFlag_TextureSurface 标志添加到 VMR9AllocationInfo 结构。 如果设备不支持本机视频格式的纹理,则可能需要创建单独的纹理图面,然后将视频帧从视频图面复制到纹理。
在流式处理期间,VMR-9 通过调用 IVMRSurfaceAllocator9::GetSurface 方法从分配器呈现器获取图面。 VMR-9 通过图面数组中的索引指定图面 (步骤 8) 。
在 VMR-9 调用 IVMRImagePresenter9::P resentImage 方法时显示图像。 参数包括指向包含视频图像的 Direct3D 图面的指针。
如果 Direct3D 设备随时丢失,分配器演示者必须还原设备并重新创建图面。 例如,如果显示模式更改或用户将窗口移动到另一台监视器,设备可能会丢失。 如果 Direct3D 设备发生更改,请调用 VMR-9 筛选器的 IVMRSurfaceAllocatorNotify9::ChangeD3DDevice 方法。
当流式处理停止时,VMR-9 调用 IVMRSurfaceAllocator9::TerminateDevice 方法。 分配器表示器应释放其所有 Direct3D 资源。
VMR-7 和 VMR-9 在自定义分配器演示者的管理方式上存在一些差异:
- VMR-9 筛选器的 AllocateSurfaceHelper 方法可供分配器表示器在分配图面时使用。 此方法使得自定义分配器表示器不必将任何调用转发到默认分配器-表示器。 因此,VMR-9 筛选器的默认分配器表示器的 CLSID 不会发布。
- 与 VMR-7 不同,VMR-9 不提供特殊的 DirectDraw 独占模式分配器表示器。 IVMRSurfaceAllocatorNotify9::AllocateSurfaceHelper 方法使此对象变得不必要。
- 对于交错视频,VMR-9 始终在呈现图像之前对视频进行反交错。 分配器表示器不再负责在显示图像之前对图像进行反交错。
相关主题