DirectShow 简介

发布于 2021-11-23


DirectShow 是微软公司提供的基于 COM 技术的处理多媒体开发框架,用于接替 VFW(Video For Windows)技术。它可以采集硬件音视频数据、播放音视频、处理电视模拟信号、播放DVD、播放磁带、音视频编辑等等。

发展

ActiveMovie 是 DirectShow 的前身。在 1998 年,大致在 DirectX 5 年代的时候,ActiveMovie 被重命名为 DirectShow,属于 DirectX 的一部分。从 2005 年 4 月起,DirectShow 被从 DirectX SDK 中移除,必须单独下载 Extra 包才能得以支持,之后 DirectShow 的文档和示例被转移到 Windows SDK。

自 Win7 之后 DirectShow 也不再更新了,历史轮回,接替 DirectShow 的新技术是 Media Foundation。

DirectShow 作为一个诞生了 20 多年的技术,已经慢慢被淘汰了。一是由于 DirectShow 本身使用起来比较复杂,二是微软也不再更新支持它了。另外在新起 FFmepg、GStreamer 等跨平台多媒体开发框架面前,也没有优势。

只有在 Window 平台的某些场景,作为底层的实现,可能需要用到 DirectShow。

DirectShow 框架

DirectShow 程序中,功能如同搭积木一般,由一个个 filters 通过 pin 互相连接成在一起,组成一个 filter graph,如下图播放视频文件的例子所示:

avi filter graph

File Source filter 从硬盘文件中读取到数据,然后把数据通过 pin 转交给 AVI Splitter filter 处理,把数据分拆成音频数据流和视频数据流。视频数据流发送给 AVI Decompressor filter,解码数据,最终再发送给 Renderer filter,把画面绘制在屏幕上。音频数据流发送给 Default DirectSound Device filter 处理,播放出声音。

程序不会直接操作某个 filter ,而是在上层通过 Filter Graph Manager 控制整体的功能,从而影响到下层具体的 filter。

下图是 DirectShow 整体的框架:

DirectShow arch

filter 通过本身的 pin 连接在一起,组成了 filter graph。而 DirectShow 的另一部模块则是 Filter Graph Manager,应该程序通过 Filter Graph Manager 的接口操作整个多媒体处理流程。在这个过程中,Filter Graph Manager 也会发送一些通知事件给程序进行交互。

filter 就是涉及到具体的多媒体处理逻辑。它分为几类:

  • source filter,就是多媒体数据流的源头。它可以是磁盘中的音视频文件,网络数据,也可以是硬件摄像头、话筒。它是整个 filter graph 的起点。
  • transform filter,filter graph 的中间层。数据流从上游传输过来,对数据流做某种处理,然后继续把数据发送给下游。
  • renderer filters。数据流的终点。最终对多媒体数据流进行处理,比如保存到文件中、渲染到显示器或者声卡里。

此外还有 splitter filter、 mux filter,它们也可以算是 transform filter 中的一种:

  • splitter filter,把一路数据流分成多路,比如把数据流分成音频数据流、视频数据流、发送给不同的下游 filter。
  • mux filter,把多路数据流合并成一路。

此外另一个著名的多媒体处理框架 FFmpeg 也是具有 filter graph 这样类似的框架。

GraphEdit

在 DirectShow 中代码创建 filter graph 过于抽象。因此微软还提供了一个可视化的 GraphEdit 工具,通过 UI 操作来创建 filter graph,可用来设计调试 DirectShow。

参考资料

由于 DirectShow 算是比较古老的技术了。相关的书籍都是2005之前的。

一本是《DirectShow 开发指南》,一本是《DirectShow实务精选》,作者都是陆其明。

参考