DirectShow 应用程序编程简介

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

本文介绍 DirectShow 中使用的基本术语和概念。 阅读本部分后,即可编写第一个 DirectShow 应用程序。

筛选器和筛选图

DirectShow 的构建基块是一个称为 筛选器的软件组件。 筛选器是一个软件组件,用于对多媒体流执行某些操作。 例如,DirectShow 筛选器可以

  • 读取文件
  • 从视频捕获设备获取视频
  • 解码各种流格式,例如 MPEG-1 视频
  • 将数据传递到图形或声音卡

筛选器接收输入并生成输出。 例如,如果筛选器解码 MPEG-1 视频,则输入是 MPEG 编码的流,输出是一系列未压缩的视频帧。

在 DirectShow 中,应用程序通过将筛选器链连接在一起来执行任何任务,以便一个筛选器的输出成为另一个筛选器的输入。 一组连接的筛选器称为 筛选器图。 例如,下图显示了用于播放 AVI 文件的筛选器图。

用于播放 avi 文件的筛选器图

“文件源”筛选器从硬盘读取 AVI 文件。 AVI 拆分器筛选器将文件分析为两个流:一个压缩的视频流和一个音频流。 AVI 解压缩器筛选器解码视频帧。 视频呈现器筛选器使用 DirectDraw 或 GDI 将帧绘制到显示器。 默认 DirectSound 设备筛选器使用 DirectSound 播放音频流。

应用程序不必管理所有这些数据流。 相反,筛选器由名为 Filter Graph Manager 的高级组件控制。 应用程序进行高级 API 调用,例如“运行” (以在图形中移动数据) 或“停止” (来停止数据流) 。 如果需要对流操作进行更多控制,可以直接通过 COM 接口访问筛选器。 Filter Graph 管理器还会将事件通知传递给应用程序。

Filter Graph 管理器还有另一个用途:它通过连接筛选器为应用程序提供生成筛选器图的方法。 (DirectShow 还提供各种帮助程序对象来简化此过程。这些内容在文档中进行了全面介绍。)

编写 DirectShow 应用程序

概括而言,任何 DirectShow 应用程序都必须执行三项任务。 下图对此进行了说明。

典型的 directshow 应用程序

  1. 应用程序创建 Filter Graph Manager 的实例。
  2. 应用程序使用 Filter Graph 管理器生成筛选器图。 关系图中的确切筛选器集将取决于应用程序。
  3. 应用程序使用 Filter Graph 管理器来控制筛选图并通过筛选器流式传输数据。 在整个过程中,应用程序还将响应来自 Filter Graph 管理器的事件。

处理完成后,应用程序将释放 Filter Graph 管理器和所有筛选器。

DirectShow 基于 COM;Filter Graph 管理器和筛选器都是 COM 对象。 在开始对 DirectShow 进行编程之前,应大致了解 COM 客户端编程。 许多有关 COM 编程的书籍都可用。

若要开始使用 DirectShow,请阅读 如何播放文件一文,其中介绍了用于播放视频文件的简单控制台应用程序。 关于 DirectShow 部分更详细地介绍了 DirectShow 体系结构,而使用 DirectShow 部分则介绍 DirectShow 支持的主要方案,例如捕获、视频编辑、DVD 播放和电视。