DirectShow 应用程序编程简介
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
本文介绍 DirectShow 中使用的基本术语和概念。 阅读本部分后,即可编写第一个 DirectShow 应用程序。
筛选器和筛选图
DirectShow 的构建基块是一个称为 筛选器的软件组件。 筛选器是一个软件组件,用于对多媒体流执行某些操作。 例如,DirectShow 筛选器可以
- 读取文件
- 从视频捕获设备获取视频
- 解码各种流格式,例如 MPEG-1 视频
- 将数据传递到图形或声音卡
筛选器接收输入并生成输出。 例如,如果筛选器解码 MPEG-1 视频,则输入是 MPEG 编码的流,输出是一系列未压缩的视频帧。
在 DirectShow 中,应用程序通过将筛选器链连接在一起来执行任何任务,以便一个筛选器的输出成为另一个筛选器的输入。 一组连接的筛选器称为 筛选器图。 例如,下图显示了用于播放 AVI 文件的筛选器图。
“文件源”筛选器从硬盘读取 AVI 文件。 AVI 拆分器筛选器将文件分析为两个流:一个压缩的视频流和一个音频流。 AVI 解压缩器筛选器解码视频帧。 视频呈现器筛选器使用 DirectDraw 或 GDI 将帧绘制到显示器。 默认 DirectSound 设备筛选器使用 DirectSound 播放音频流。
应用程序不必管理所有这些数据流。 相反,筛选器由名为 Filter Graph Manager 的高级组件控制。 应用程序进行高级 API 调用,例如“运行” (以在图形中移动数据) 或“停止” (来停止数据流) 。 如果需要对流操作进行更多控制,可以直接通过 COM 接口访问筛选器。 Filter Graph 管理器还会将事件通知传递给应用程序。
Filter Graph 管理器还有另一个用途:它通过连接筛选器为应用程序提供生成筛选器图的方法。 (DirectShow 还提供各种帮助程序对象来简化此过程。这些内容在文档中进行了全面介绍。)
编写 DirectShow 应用程序
概括而言,任何 DirectShow 应用程序都必须执行三项任务。 下图对此进行了说明。
- 应用程序创建 Filter Graph Manager 的实例。
- 应用程序使用 Filter Graph 管理器生成筛选器图。 关系图中的确切筛选器集将取决于应用程序。
- 应用程序使用 Filter Graph 管理器来控制筛选图并通过筛选器流式传输数据。 在整个过程中,应用程序还将响应来自 Filter Graph 管理器的事件。
处理完成后,应用程序将释放 Filter Graph 管理器和所有筛选器。
DirectShow 基于 COM;Filter Graph 管理器和筛选器都是 COM 对象。 在开始对 DirectShow 进行编程之前,应大致了解 COM 客户端编程。 许多有关 COM 编程的书籍都可用。
若要开始使用 DirectShow,请阅读 如何播放文件一文,其中介绍了用于播放视频文件的简单控制台应用程序。 关于 DirectShow 部分更详细地介绍了 DirectShow 体系结构,而使用 DirectShow 部分则介绍 DirectShow 支持的主要方案,例如捕获、视频编辑、DVD 播放和电视。