为 VMR-7 提供自定义Allocator-Presenter

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

分配器演示者负责分配 DirectDraw 图面并呈现视频帧以供呈现。 在绝大多数方案中,默认分配器表示器的功能足以满足应用程序的需求。 但是,通过插入自定义分配器表示器,应用程序可以直接访问视频位并完全控制呈现过程。 这种增加的功率的折衷是,应用程序必须处理 DirectDraw 表面管理的复杂性增加。

使用自定义分配器-表示器

上图显示了 VMR 和分配器表示器使用的通信接口。 替代所有默认分配和演示功能的自定义分配器表示器必须实现 IVMRImagePresenterIVMRSurfaceAllocator 接口,以及(可选) IVMRWindowlessControl

为了替换默认的分配器-表示器,应用程序调用 IVMRSurfaceAllocatorNotify::AdviseSurfaceAllocator 方法,并将指针传递到新的分配器表示器。 为了响应此调用,VMR 将调用分配器-演示者的 IVMRSurfaceAllocator::AdviseNotify 方法,以提供指向 VMR 的 IVMRSurfaceAllocatorNotify 接口的指针。 分配器演示者在使用 IVMRSurfaceAllocatorNotify::NotifyEvent 方法将事件传递给 VMR 时,将使用此接口指针。

作为备用解决方案,应用程序可以使用其自己的分配器-表示器和默认分配器-表示器。 在此方案中,自定义分配器-呈现器仅处理需要自定义功能的调用,并将 VMR 的其余调用传递到默认分配器呈现器。 在许多情况下,只需重写 IVMRImagePresenter 接口。

使用两个分配器表示器

若要同时使用自定义分配器-表示器和默认分配器-表示器,应用程序将首先调用 IVMRSurfaceAllocatorNotify::AdviseSurfaceAllocator 来提供指向新分配器-表示器的指针。 这会导致默认分配器表示器被销毁,因此应用程序必须通过调用 VMR 上的 QueryInterface 并请求 IVMRSurfaceAllocator 接口来创建它的另一个实例。 如上图所示,自定义分配器-表示器会替代 IVMRImagePresenter 接口方法,并将对 IVMRSurfaceAllocator 接口的所有调用传递到默认实现。 该图还显示了在分配器呈现器上实现的 IVMRWindowlessControl 接口。

为 VMR-9 提供自定义Allocator-Presenter

VMR 无呈现播放模式 (自定义分配器-演示者)