视频功能

[与此页面关联的功能 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 像素(包括 160 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) 。 在这种情况下,筛选器应采用 160 x 120 RGB 源位图的 10 x 10 部分,并使其填充 320 x 240 位图的前 100 x 100 区域,使 320 x 240 位图的其余部分保持不变。 下图显示了此方案。

subrectangle 拉伸

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

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