视频呈现器中的源矩形和目标矩形

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

视频媒体类型的 VIDEOINFOVIDEOINFOHEADERVIDEOINFOHEADER2 格式结构中有三种大小。 本文介绍它们是什么及其工作原理。

首先,这些结构的 bmiHeader 成员中有一个大小。 bmiHeader 成员是一个 BITMAPINFOHEADER 结构,其自己的宽度和高度成员 bmiHeader.biWidthbmiHeader.biHeight

其次,这些结构的 rcSource 成员中有一个矩形;最后,这些结构的 rcTarget 成员中有一个矩形。

假设你有两个筛选器 A 和 B,并且这些筛选器 (左侧的 A 或 上游,B 位于右侧,或者下游) 与特定视频媒体类型相互连接。

在筛选器 A 和 B 之间传递的缓冲区的大小 (bmiHeader.biWidthbmiHeader.biHeight) 。 筛选器 A 应获取 由 rcSource 确定的输入视频的一部分,并拉伸该视频以填充缓冲区的 rcTarget 部分。 要使用的输入视频部分基于 rcSource 与筛选器 A 和 B 最初连接的媒体类型的 (biWidthbiHeight) 大小进行比较的方式。 如果 rcSource 为空,则筛选器 A 使用其整个输入视频。 如果 rcTarget 为空,筛选器 A 将填充整个输出缓冲区。

例如,假设筛选器 A 正在接收 160 x 120 像素的视频数据。 还假定筛选器 A 连接到具有以下媒体类型的筛选器 B。

  • (biWidthbiHeight) :320、240
  • rcSource: (0、0、0、0)
  • rcTarget: (0, 0, 0, 0)

这意味着筛选器 A 将在 x 和 y 方向上将其接收的视频拉伸 2,并填充 320 x 240 输出缓冲区。

再举一例,假设筛选器 A 正在接收 160 x 120 的视频数据,并且它连接到具有以下媒体类型的筛选器 B。

  • (biWidthbiHeight) :320、240
  • rcSource: (0、0、160、240)
  • rcTarget: (0, 0, 0, 0)

rcSource 成员相对于连接的缓冲区大小 320,240。 由于指定的 rcSource (0, 0, 160, 240) 是缓冲区的左半部分,因此筛选器 A 将获取其输入视频的左半部分或 (0, 0, 80, 120) 部分,并在 x 方向将视频拉伸到 (320, 240) (4 的大小, 和 2 在 y 方向) 并填充 320 x 240 输出缓冲区。

现在,假设筛选器 A 调用 CBaseAllocator::GetBuffer,并且返回的媒体示例附加了媒体类型,表示筛选器 B 希望筛选器 A 提供与之前提供的视频大小或类型不同的视频。 假设新媒体类型为:

  • (biWidthbiHeight) :640、480
  • rcSource: (0、0、160、120)
  • rcTarget: (0、0、80、60)

这意味着媒体样本的缓冲区大小为 640 x 480。 rcSource 成员相对于原始连接媒体类型 (320,240) 而不是 (640,480) 的新媒体类型,因此 rcSource 指定使用左上角 (输入视频的 25%) 。 输入视频的这一部分放置在左上角 (640 x 480 输出缓冲区的 80, 60) 像素,由 ( 0, 0, 80, 60) 指定。 由于筛选器 A 接收 160 x 120 的视频,因此输入视频的左上角是一个 (80,60) 块,输出位图的大小相同,并且不需要拉伸。

筛选器 A 不会在输出缓冲区的其他像素中放置任何数据,并将保留这些位不变。 rcSource 成员由筛选器 A 和 B 之间原始连接媒体类型的 biWidthbiHeight 绑定,rcTarget 由媒体示例的新 biWidthbiHeight 绑定。 在前面的示例中, rcSource 无法超出 (0、0、320、240) 的边界, rcTarget 无法超出 (0、0、640、480) 边界。