DirectShow 基本术语概念 [大三TJB_708]

来源:互联网 发布:电脑屏幕监控软件教师 编辑:程序博客网 时间:2024/05/16 11:40

此篇笔记整理的是初学DirectShow会涉及的最基本的概念、最基本的操作。

 

Filter和Filter接口的区别

Filter是指具Filter框架(描述各个pin组件各种情况,包括媒体类型、链接、数据传输等方法,还可能将一些状态赋给Filter中的对象(即变量))。Filter接口不是指Filter内的函数成员,而是针对于一种特殊的逻辑算法而集成的与Filter相对应的另一个类,类中包含了各种对Filter数据进行处理的函数,这些函数实现了处理Filter数据的算法。

根据习惯,Filter对应的接口是在Filter名前加一个大写的‘I’字符。如Filter名为“MyFilter”则对应接口名一般为“IMyFilter”。Filter接口更为普通的一个特点是接口名都是以字符“I”开头。在DirectShow SDK的基类中也有相关接口的鼻祖(如IBaseFilter)。

 

 

Filter和Filter上的pin区别

Filter和Filter上的pin没有本质的区别,都是COM组件(实质就是C++的类)。只是因为大小和功能的不同而得到了不同的名字而已。在DirectShow SDK的基类中,Pin也有自己的祖先,它们的名字由Pin字符串为结束标记。就像Filter的基类名由Filter字符串结束一样。就像开头说的那样,Pin的实质是C++类,所以在Pin中也包含了许多的成员函数。

Pin、接口上的成员函数用到Filter中

以CBasePin和CBaseFilter为例子。顾名思义,CBaseFilter是一个Filter,CBasePin是此Filter需要包含的Pin。看看把pin上的成员函数用到对应的Filter中的具体机制,以CBasePin::Inactive()函数为例。注:根据Filter结构,Pin为Filter的数据 成员。

<strong>STDMETHODIMP CBaseFilter::stop(){//………codes……………if(m_state != state_Stopped) {int cPin = GetPinCount();for (int c = 0;  c < cPin;  c++ ) {</strong>CBasePin *pPin = GetPin(c);if(pPin->IsConnected()) {HRESULT hrTmp = pPin->inactive();<strong>}}}</strong>


 

引用Pin 中的成员函数从定义一个Pin对象开始,使用接口的方法也是一样的。

哈!看到了吧,我们只是在Filter的函数成员中定义一个对应Pin基类的对象,然后通过此对象访问此类的成员函数而已!那么Filter访问接口内的函数难道不是这样么?这就是在我们熟悉以前的高深机制!所以,在这里做个推理:调用Filter对应的接口函数也是相同的机制。

 

 

Filter设计

DirectShow SDK提供了一套开发Filter的基类源代码。虽然这些源代码非必须,但是还是强烈的推荐使用,因为可以简化Filter开发过程。同时基类的设计结构也引导用户在开发Filter的方向与思维。初学者可以对SDK中 Filter 内部函数实现加以参考。

 

根据需求选择继承一个父类

首先对DirectShow SDK提供的基类功能做一个简要掌握。

一般的一个选择方法:

1)         需要写一个Source Filter时,且要将产生的数据“推”出去时,一般选择CSource

2)         若设计Filter接收输入数据,经过一定的处理要再输出数据,一般选择CTransformFilter

3)         同时有输入和输出,且输入Pin上需要“拉”数据,则我们选择CBaseFilter,在输入Pin上使用工具类CPullPin

4)         Filter接收输入数据后就不再需要输出,一般选择CBaseFilter

Filter父类确定之后,一般Pin的父类也就相应的确定了。DirectShow SDK中提供的具体的Filter子类都提供了相应的Pin类,我们可以从这些特定的Pin类中相应的继承。

《DirectShow 编程指南》

在选择继承一个父类的时候,需要遵守父类被继承的方法,如继承CBaseInputPin类时需要:

当使用CBaseInputPin派生一个子类的时候,最少需要重写以下函数:

(1)       CBaseInputPin::BeginFlush

(2)       CBaseInputPin::EndFlush

(3)       CBaseInputPin::Receive

(4)       CBasePin::CheckMediaType(继承CBasePin类就需要重写的函数);

(5)       CBasePin::GetMediaType

这里只是显示一下父基类派生子类时的使用方法。

 

Filter的应用结构

Filter只是一个应用程序框架,一个支持“输入-->内部处理-->输出”的过程应用框架,是一个黑箱子。内部处理部分显得更加重要,如果将内部处理当成一个独立的版块来进行设计,那么会给Filter项目的清晰和扩展性做出贡献。

不仅如此,在设计Filter程序时,用户还可以加入自己的模块化思想(虽然C++中都是类和对象),但是使用模块化思想是随时都可以用的。没有界限和约束,只要能使开发者的思维变得更加的清晰,操作更加的容易,结构更加的明显(如项目中根据功能建立的文件夹,里面包含.h和.cpp文件)

原创粉丝点击