最近在做虚拟摄像头和麦克风方面的编程,现在把DirectShow相关功能做一下梳理。
DirectShow是什么
Microsoft® DirectShow® 是 Microsoft Windows® 平台上流媒体的体系结构。 DirectShow 提供多媒体流的高质量捕获和播放。 它支持多种格式,包括高级系统格式 (ASF) 、电影专家组 (MPEG) 、Audio-Video交错 (AVI) 、MPEG 音频层 3 (MP3) 和 WAV 声音文件。 它支持基于 Windows 驱动程序模型 (WDM) 或视频从数字和模拟设备捕获。 它会自动检测并使用视频和音频加速硬件(如果可用),但也支持没有加速硬件的系统。
DirectShow 基于组件对象模型 (COM) 。 若要编写 DirectShow 应用程序或组件,必须了解 COM 客户端编程。 对于大多数应用程序,无需实现自己的 COM 对象。 DirectShow 提供所需的组件。 但是,如果要通过编写自己的组件来扩展 DirectShow,则必须将它们作为 COM 对象实现。
DirectShow 专为 C++ 设计。 Microsoft 不提供 DirectShow 的托管 API。
DirectShow 简化了媒体播放、格式转换和捕获任务。 同时,它为需要自定义解决方案的应用程序提供对基础流控制体系结构的访问。 还可以创建自己的 DirectShow 组件以支持新格式或自定义效果。
可以使用 DirectShow 编写的应用程序类型的示例包括文件播放器、电视和 DVD 播放器、视频编辑应用程序、文件格式转换器、音频-视频捕获应用程序、编码器和解码器、数字信号处理器等。
其设计目标是通过将应用程序与数据传输、硬件差异和同步的复杂性隔离开来简化在 Windows 平台上创建数字媒体应用程序的任务。
为了达到流式传输视频和音频所需的吞吐量,DirectShow 尽可能使用 Direct3D 和 DirectSound。 这些技术有效地将数据呈现给用户的声音和图形卡。 DirectShow 通过将媒体数据封装在带时间戳的示例中来同步播放。 为了处理各种可能的源、格式和硬件设备,DirectShow 使用模块化体系结构,其中应用程序混合和匹配称为 filter 的不同软件组件。
DirectShow 提供支持基于 Windows 驱动程序模型 (WDM) 捕获和优化设备的filter ,以及支持 Windows (VfW) 捕获卡的较旧视频的filter ,以及为音频压缩管理器 (ACM) 和视频压缩管理器 (VCM) 接口编写的编解码器。
如此处所示,DirectShow filter 与各种设备通信和控制,包括本地文件系统、电视调谐器和视频捕获卡、VfW 编解码器、通过 DirectDraw 或 GDI) (的视频显示,以及通过 DirectSound) 卡 (声音。 因此,DirectShow 使应用程序免受这些设备的许多复杂性。 DirectShow 还为某些文件格式提供本机压缩和解压缩filter 。
DirectShow是如何工作的
DirectShow 的构建单元是filter,这里的filter类似于Unix编程中的过滤器结构,每个 filter 有着输入和输出,DirectShow通过将 filter 连接在一起来执行任何任务,以便一个 filter 的输出成为另一个 filter 的输入,举个微软官方的例子:
“文件源” filter 从硬盘读取 AVI 文件。 AVI 拆分器 filter 将文件分析为两个流:一个压缩的视频流和一个音频流。 AVI 解压缩器 filter 解码视频帧。 视频呈现器 filter 使用 DirectDraw 或 GDI 将帧绘制到显示器。 默认 DirectSound 设备 filter 使用 DirectSound 播放音频流。
当然,以上是举个例子,所以陈述了所有的过程。实际上应用程序不必管理所有这些数据流过程,相反,filter 由名为 Filter Graph Manager 的高级组件控制。 应用程序进行高级 API 调用,例如“运行” (以在图形中移动数据) 或“停止” (来停止数据流) 。 如果需要对流操作进行更多控制,可以直接通过 COM 接口访问 filter 。 Filter Graph 管理器还会将事件通知传递给应用程序。
Filter Graph 管理器还有另一个用途:它通过连接 filter 为应用程序提供生成 filter 图的方法。 (DirectShow 还提供各种帮助程序对象来简化此过程。这些内容在文档中进行了全面介绍。)
如何创建使用DirectShow的程序
- 应用程序创建 Filter Graph Manager 的实例。
- 应用程序使用 Filter Graph 管理器生成 filter 图。 关系图中的具体的 filter 集将取决于应用程序。
- 应用程序使用 Filter Graph 管理器来控制 filter 并通过 filter 流式传输数据。 在整个过程中,应用程序还将响应来自 Filter Graph 管理器的事件。处理完成后,应用程序将释放 Filter Graph 管理器和所有 filter 。
DirectShow 基于 COM;Filter Graph 管理器和filter 都是 COM 对象。 在开始对 DirectShow 进行编程之前,应大致了解 COM 客户端编程。 许多有关 COM 编程的书籍都可用。