处理视频呈现器中的格式更改

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

本部分介绍解码器筛选器或转换筛选器应如何处理视频呈现器的格式更改。

视频呈现器筛选器

当旧的 视频呈现器 筛选器连接时,它需要与主监视器的显示格式匹配的 RGB 格式。 这使它能够在 DirectDraw 不可用时使用 GDI 进行呈现。 开始播放时,视频呈现器可能会切换到与 DirectDraw 兼容的格式。 为了验证上游筛选器是否可以支持新格式,视频呈现器在上游筛选器的输出引脚上调用 IPin::QueryAccept。 如果上游筛选器接受新格式,QueryAccept 方法将返回S_OK。 视频呈现器通过将具有新格式的媒体类型附加到其分配器返回的下一个媒体示例来切换格式。 上游筛选器应通过对每个示例调用 IMediaSample::GetMediaType 来检查格式更改。 在流式处理过程中,视频呈现器可以随时在原始格式和新格式之间来回切换。 在第一次格式更改后,它不会调用 QueryAccept 。 上游筛选器接受新格式后,它必须能够来回切换。

上游筛选器可以通过从 QueryAccept 返回S_FALSE来拒绝格式更改。 在这种情况下,视频呈现器将继续使用原始格式的 GDI。

视频混合呈现器筛选器

视频混合呈现器筛选器 (VMR-7 和 VMR-9) 将使用系统上图形硬件支持的任何格式进行连接。 VMR-7 始终使用 DirectDraw 进行呈现,并在上游筛选器连接时分配基础 DirectDraw 图面。 VMR-9 始终使用 Direct3D 进行呈现,并在上游筛选器连接时分配基础 Direct3D 图面。

图形硬件可能需要比图像宽度更大的图面步幅。 在这种情况下,VMR 通过调用 QueryAccept 请求新格式。 它以视频格式报告 BITMAPINFOHEADERbiWidth 成员中的图面步幅。 如果上游筛选器未从 QueryAccept 返回S_OK,则 VMR 会拒绝该格式,并尝试使用上游筛选器播发的下一种格式进行连接。 VMR 将具有新格式的媒体类型附加到第一个媒体示例。 第一个样本后,格式保持不变;VMR 不会在图形运行时切换格式。

增强的视频呈现 (EVR)

EVR 始终使用 Direct3D 进行呈现。 如果需要更大的图面步幅,EVR 将使用与 VMR 相同的 QueryAccept 机制。

QueryAccept (上游)