DirectShow filter 体系初探

  再次工作上项目需要,要研究下 DirectShow 的 filter 体系,以及通过将自己实现的 filter 插入到播放 audio/video 时的 filter graph,最后达到获取进入 render filter 前的已经解码的 A/V 数据的目的。

  上周五利用下午时间已经找到了实现的方向,记录如下。其实网上公开的资料多如牛毛,现在的感受,不管是做哪方面的 research,只要不是高精尖到什么隐形飞行器涂料技术,你基本都可以在 Internet 上找到很多线索,有时候甚至是标准答案(所以说熟练运用搜索引擎很重要,这是快速学习的基础所在)。

  DirectShow 基于 COM 来构建,设计思想非常值得借鉴。在 DS 中发挥作用的组件都被称作 filter,每个 filter 有各自不同的作用,当它们被正确的连接在一起时就可以完成 audio/video 的回放。

  filter 这个名字起的不错,当多媒体数据流经一个个“过滤器”,经过 A/V 分离、decode 和 render 之后被最终呈现的用户面前。总体上说,有这么 3 类 filter:
1) source filter,负责读取源数据
2) transform filter,负责做各种数据变换
3) render filter,负责渲染结果

  每个 filter 都暴露出一到多个 pin,他们各自之间通过 pin 进行连接。source filter 只有 output pin,而 render filter 只有 input pin,transform filter 则既有 input 又有 output pin。当这些 filter 正确的通过各自的 pin 连接在一起时,就形成一个 filter graph。

  就拿用 DS 来播放一个 MP3 来说,filter graph 里会出现如下几个 filer:
一个 source filter,后面接一个 MPEG-I Stream Splitter(当然这只是一个 audio,所以不会分离出 video 数据来),然后是一个 MPEG Layer-3 Decoder,最末端是一个 Default DirectSound Device 的 render filter。
filter graph

  所以看来我们如果想在这中间插一杠子,把已经解码过的 A/V 数据拿出来的话,就需要开发一个 transform filter。经过一番 Google,发现我们要做的就是实现一个 Sample Grabber Filter,它本质上还是一个 transform filter,DS 架构里有这么一号的本意是为了在开发 transform filter 的过程中方便测试 transform filter 工作是否正常的,但 sample grabber filter 也同样非常适合抓取流经 filter graph 的数据!其实系统中是存在一个现成的 Sample Grabber Filter 的,我们要做的工作就是把这个 filter 加到 filter graph 里来,然后去实现一个 Sample Grabber Filter Callback 就可以拿到数据了。

Leave a Reply