Alpha Blending (DirectShow)

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

[此 API 不受支持,将来可能会更改或不可用。]

本文介绍 DirectShow Editing Services (DES) 中的 alpha 混合。

Alpha 测量像素或图像的透明度。 在 32 位未压缩 RGB 视频中,四个组件定义每个像素:一个 alpha 通道 (A) ,三个颜色分量 (RGB) 。 alpha 值为零的像素是完全透明的。 alpha 值为 255 的像素是不透明的。 在这些值之间,像素具有不同程度的透明度。

DirectShow 为 32 位 RGB 视频定义了两种媒体类型:

  • MEDIASUBTYPE_ARGB32:视频是具有有效 alpha 通道的 32 位 RGB。
  • MEDIASUBTYPE_RGB32:像素为 32 位,但 alpha 通道不一定有效。

若要在 DES 中执行 alpha 混合,请将视频组的未压缩媒体类型设置为MEDIASUBTYPE_ARGB32。 在 C++ 中,调用 IAMTimelineGroup::SetMediaType 方法。 在 XTL 格式中,将 group 元素的 bitdepth 属性设置为 32 也可以完成此操作。

接下来,需要包含 alpha 通道的视频数据。 有若干个选项:

  • 可以使用已包含 32 位 RGB 视频和 alpha 数据的 AVI 文件。 目前,MPEG 或 Microsoft Windows Media Format (WMF) 源文件不支持 alpha。
  • DES 支持 32 位位位图 (.bmp) 和 Targa (.tga) 包含 alpha 数据的文件。
  • 可以编写使用 alpha 创建 32 位 RGB 数据的自定义源筛选器。 输出媒体类型必须是 MEDIASUBTYPE_ARGB32。 将筛选器用作时间线源对象中的子对象。

如果视频源没有 alpha,则可以使用创建 alpha 数据的效果。 Alpha Setter 效果将整个图像的 alpha 通道设置为常量值。 若要随时间变化 alpha,请将 IPropertySetter 接口与 Alpha Setter 效果结合使用。 只要组的未压缩媒体类型MEDIASUBTYPE_ARGB32,原始源就 不必是 32 位。

最后,将视频传递给执行 alpha 混合的效果或过渡。 Compositor Transition 执行 alpha 混合,键转换可以按 alpha 值键键。

以下示例 XTL 项目执行 alpha 混合:

<timeline>
<group type="video" bitdepth="32" width="320" height="240">
<track>
  <clip start="0" stop="6" src="c:\Example.avi" />
</track>
<track>
  <clip start="0" stop="6" src="c:\Example2.avi">
    <!-- Alpha Setter effect. -->
    <effect clsid="{506D89AE-909A-44f7-9444-ABD575896E35}" start="0" stop="6">
      <param name="alpha" value="255">
        <linear time="6" value="0" />
      </param>
    </effect>
  </clip>
  <!-- Key transition, with alpha keying. -->
  <transition clsid="{C5B19592-145E-11d3-9F04-006008039E37}" start="0" stop="6">
    <param name="KeyType" value="3" />  
  </transition>
</track>
</group>
</timeline>

使用 DirectShow 编辑服务