视频呈现器中的源矩形和目标矩形
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
VIDEOINFO、VIDEOINFOHEADER以及视频媒体类型的 VIDEOINFOHEADER2 格式结构中,有三种大小。 本文介绍它们是什么及其工作原理。
首先,这些结构的 bmiHeader 成员中存在一个大小。 bmiHeader 成员是一个 BITMAPINFOHEADER 结构,其宽度和高度成员 bmiHeader.biWidth 和 bmiHeader.biHeight。
其次,这些结构的 rcSource 成员中有一个矩形;最后,rcTarget 成员中有一个矩形。
假设你有两个筛选器 A 和 B,并且这些筛选器相互连接(左侧或上游,右侧或下游)具有特定视频媒体类型。
在筛选器 A 和 B 之间传递的缓冲区的大小(bmiHeader.biWidth,bmiHeader.biHeight)。 筛选器 A 应获取由 rcSource 确定的输入视频的一部分,并拉伸该视频以填充缓冲区的 rcTarget 部分。 要使用的输入视频部分基于 rcSource 与筛选 A 和 B 最初连接的媒体类型(biWidth、biHeight) 大小进行比较的方式。 如果 rcSource 为空,则筛选 A 会使用其整个输入视频。 如果 rcTarget 为空,则筛选 A 将填充整个输出缓冲区。
例如,假设筛选器 A 接收的视频数据为 160 x 120 像素。 假设筛选器 A 已连接到具有以下媒体类型的筛选器 B。
- (biWidth, biHeight): 320, 240
- rcSource:(0、0、0、0)
- rcTarget:(0、0、0、0)
这意味着筛选器 A 将在 x 和 y 方向中将它接收的视频拉伸 2,并填充 320 x 240 输出缓冲区。
作为另一个示例,假设筛选器 A 正在接收 160 x 120 视频数据,并且它连接到具有以下媒体类型的筛选器 B。
- (biWidth, biHeight): 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)部分,并将视频拉伸到大小(320,240)(按 x 方向的 4,2 向 y 方向)并填充 320 x 240 输出缓冲区。
现在假设筛选 A 调用 CBaseAllocator::GetBuffer,并且返回的媒体示例具有附加到它的媒体类型,这表示筛选器 B 希望筛选 A 提供与以前提供的视频大小或类型不同的视频。 假设新的媒体类型为:
- (biWidth, biHeight): 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)像素中,由 rcTarget(0、0、80、60)指定。 由于筛选器 A 正在接收 160 x 120 视频,因此输入视频的左上角是一个 (80, 60) 段,输出位图的大小相同,无需拉伸。
筛选 A 将不将数据置于输出缓冲区的其他像素中,并将保留这些位不变。 rcSource 成员由筛选器 A 和 B 之间原始连接的媒体类型的 biWidth 和 biHeight 绑定,rcTarget 受媒体示例的新 biWidth 和 biHeight 绑定。 在前面的示例中,rcSource 不能超出边界(0、0、320、240)和 rcTarget 不能超出边界(0、0、640、480)。