视频功能

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

IAMStreamConfig::GetStreamCaps 方法在一组 AM_MEDIA_TYPEVIDEO_STREAM_CONFIG_CAPS 结构中呈现视频功能。 可以使用此方法公开引脚上支持的所有格式和分辨率,如下所示。

有关 GetStreamCaps的音频相关示例,请参阅 音频功能

假设捕获卡支持 160 x 120 像素和 320 x 240 像素(含)之间的所有分辨率的 JPEG 格式。 在这种情况下,支持分辨率之间的差异是一个,因为你添加或减去每个受支持的分辨率中的一个像素以获取下一个受支持的分辨率。 支持的分辨率中的这种差异称为粒度。

假设你的卡片还支持大小为 640 x 480。 下面说明了这种单一分辨率和上述分辨率范围(所有大小介于 160 x 120 像素和 320 x 240 像素之间)。

分辨率从 160 x 120 到 320 x 240 像素,加上 640 x 480

此外,假设它在分辨率在 160 x 120 到 320 x 240 之间支持 24 位颜色 RGB 格式,但粒度为 8。 下图显示了本例中的一些有效大小。

分辨率为 160 x 120 到 320 到 240,粒度为 8

若要以另一种方式列出更多决议,以下是有效决议列表。

  • 160 x 120
  • 168 x 120
  • 168 x 128
  • 176 x 128
  • 176 x 136
  • ...其他解决方法...
  • 312 x 232
  • 320 x 240

使用 GetStreamCaps 通过提供媒体类型 320 x 240 JPEG(如果是默认大小或首选大小)以及最低功能 160 x 120、最大功能 320 x 240 以及粒度为 1 来公开这些颜色格式和维度功能。 使用 GetStreamCaps 公开的下一对是 640 x 480 JPEG 的媒体类型,至少为 640 x 480,最大为 640 x 480,粒度为 0。 第三对包括 320 x 240、24 位 RGB 的媒体类型,最小功能为 160 x 120、最大功能为 320 x 240,粒度为 8。 这样,你几乎就可以发布卡可能支持的几乎所有格式和功能。 必须知道所提供的压缩格式的应用程序可以获取所有对,并列出媒体类型的所有唯一子类型。

筛选器从 VIDEOINFOHEADER 结构的 rcSourcercTarget 成员中获取其媒体类型源和目标矩形。 筛选器不必支持源矩形和目标矩形。

在整个 IAMStreamConfig 文档中描述的裁剪矩形与输出引脚的 VIDEOINFOHEADER 结构的 rcSource 矩形相同。

IAMStreamConfig 文档中所述的输出矩形与输出引脚的 BITMAPINFOHEADER 结构的 biWidthbiHeight 成员相同(请参阅 AVI 文件格式 中的DV 数据)。

如果筛选器的输出引脚连接到具有无空源和目标矩形的媒体类型,则需要筛选器将输入格式的源子对象拉伸到输出格式的目标子对象中。 源子ectangle 存储在 VIDEO_STREAM_CONFIG_CAPS 结构的 InputSize 成员中。

例如,请考虑以下视频压缩器方案:输入图像采用 RGB 格式,大小为 160 x 120 像素。 源矩形的左上角为坐标(20,20),右下角为(30,30)。 输出图像采用 MPEG 格式,大小为 320 x 240。 目标矩形的左上角为 (0,0),其右下角为 (100,100)。 在这种情况下,筛选器应采用 10 x 10 的 160 x 120 RGB 源位图中的 10 x 10 段,并使其填充 320 x 240 位图的前 100 x 100 个区域,使 320 x 240 位图的其余部分保持不变。 下图显示了此方案。

子ectangle 拉伸

筛选器可能不支持此功能,并且无法连接到 rcSourcercTarget 不为空的媒体类型。

VIDEOINFOHEADER 结构公开有关筛选器的数据速率功能的信息。 例如,假设已将输出引脚连接到具有特定媒体类型的下一个筛选器(直接或通过使用 CMediaType::SetFormat 函数传递的媒体类型)。 查看该媒体类型的 VIDEOINFOHEADER 格式结构的 dwBitRate 成员,以查看应将视频压缩到哪些数据速率。 如果将 VIDEOINFOHEADER 中每个帧的时间单位数乘以 结构的 AvgTimePerFrame 成员 dwBitRate 成员中的数据速率,并除以 10,000,000(每秒单位数),则可以确定每个帧应包含的字节数。 可以生成更小的框架,但永远不会生成更大的框架。 若要确定视频压缩器或捕获筛选器的帧速率,请使用输出引脚媒体类型的 AvgTimePerFrame