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文件)
- DirectShow 基本术语概念 [大三TJB_708]
- [DirectShow] 基类 [大三TJB_708]
- MFC DirectShow视频预览 [大三TJB_708]
- [DirectShow] 播放一个源视频 [大三TJB_708]
- [HTML]HTML语言基本结构 [大三TJB_708]
- DirectX3D 框架和基本绘图 [大三TJB_708]
- [DirectShow] 枚举设备到Combo Box列表中 [大三TJB_708]
- vs2010 DirectShow(windows sdk v7.1)配置 [大三TJB_708]
- DirectX11_VS2010配置 [大三TJB_708]
- [DirectShow] VMR-9实现自定义allocator-presenter大体流程 [大三TJB_708]
- 基本术语概念理解
- [HTML]html链接 [大三TJB_708]
- Mysql 创建数据库 [大三TJB_708]
- php显示中文 [大三TJB_708]
- C++ this指针 [大三TJB_708]
- Win32程序设计基本原理 [大三TJB_708]
- GetOpenFileName打开文件 [大三TJB_708]
- 学习域整理 [大三TJB_708]
- sql2008无法保存修改
- 华清远见Android学习资料下载页
- wince 音量设置函数WaveOutSetVolume
- 利用C语言创建、删除目录,批量创建文件
- 数据库,多表查询
- DirectShow 基本术语概念 [大三TJB_708]
- C++静态成员函数小结
- openJdk 项目导入Visual Studio
- 第五周项目三——长方体类
- iPhone4 兼容 iPhone 5 需要注意的地方
- VS2008快捷键大全
- 电话号码 手机号码 等准确详细 正则表达式
- 初次学习erlang的笔记
- Android中的资源访问