DirectShow之系统结构
directshow(以下简称ds)的官方文档详细讲解了ds的相关知识,当然讲得也比较多,而且还是英文,所以不是那么容易看完。ds文档中最重要的2部分是About DirectShow和Using DirectShow,前者是对ds的基本框架进行详细的介绍,看完后能够对音视频数据的来源和去路有比较清晰的理解;后者是如何使用ds,这部分内容特多,详细讲解了该如何使用ds编程,我目前才刚看到DirectShow Editing Services,所以这篇文章所涉及的内容不超过这里。
我觉得ds的学习重点有2个,其一是对ds的数据流有很清楚的概念,其次是知道如何创建自己的filter,因为在音视频网络程序中,我们可能需要自己编写编码和解码的filter以及udp、rtp传送的filter。
ds的系统结构图如下(ds文档about ds部分):
这个图详细列出了ds的各个component以及他们之间的关系,可以看出,ds的核心是3个filter,filter简单理解成外包公司,也可以看作是大工厂中流水线的各个部门,filter处理的是音视频数据。其中source filter与外部打交道,获取最原始的数据,数据在transform filter中被加工成需要的数据形式传送到rendering filter,rendering filter将数据输出到外部并显示结果,图中有3种结果分别是声音、视频和文件。图中还有一个application部件,application可以使用commands(ds中的IMediaControl类)控制ds内部的运行,ds内部产生的事件消息也回馈给application(ds中的IMediaEvents类),这样程序就可以很方便的使用ds咯。
我们知道,一个外包公司做不出最终产品,一个流水线中的部门必须存在于一个具有完整体系的公司中才有意义,上面提到的3个filter也必须有高层管理才行,ds中的这个高层便是graph manager。graph是图的意思,看起来写成filter似乎更加合适,其实不然,因为ds内部还有一些更加细节的东西存在,如pin、sample、allocator等,所有的这些合在一起才能构成一个完整ds系统。因此graph可以进一步理解为设计师对需求进行的系统架构图,我们可以通过ds的graphedit来查看和编辑graph。
ds内部更加详细的图如下:
这个图描述了filter、pin、sample、allocator之间的联系,从图中可以看出,filter的出口是pin,一般graph中的filter是从左往右排列的,故一般情况下filter的左出口为input pin,右出口为output pin,pin在ds中有自己的类IPin(最基本的),不过它通常绑定在filter上,filter之间的连接需要通过pin来进行,pin之间需要匹配。数据从output pin到input pin有一番波折,其间要经过一个media sample,我们可以从media sample中得到一些数据的信息。allocator负责创建和管理sample,仔细看图,pin中间的sample是用虚线连起来的,说明这个sample实际上并不存在,pin中间正在存在是一个allocator,嘿嘿,虚线的那个sample是allocator创建的哦,还需要注意的一点是2个pin都指向allocator,说明这2个pin共用一个allocator,文档中这么说的:Every pin connection shares one allocator. When two pins connect, they decide which filter will provide the allocator。
好了,ds系统的基本结构简要介绍到这里,还有不明白的多看文档哈!!!
下次再说下如何创建自己的filter,这个才是重中之重呀。