&#cy8c4124pvi;ိုးကားပဲ

没有进行类的封装只是把一些函数集中在一个文件中。

一个是函数的声明文件自带有DX8 SDK开发文件但我仍希望您能找到DX8 SDK和VC6。DX8

“请问Filter是什么”这个问题在我脑中很久了,DirectShow嘚功能是由Filter搭建起来的但我很久以来都被“Filter”这个词困惑着,直到现在才有些眉目当然,我学识浅很可能会说错,请海涵Filter在影音風暴等软件中称为“滤镜”,在微软中国上一些译文把它译为“筛选器”五花八门的(看来没有核心技术真的很被动)。而Filter在数字信号處理等专业课程中称为“滤波器”!这下您应该知道一点了吧DirectShow对视频、音频的处理过程就是数字信号处理的过程,可以把数字信号处理嘚理论应用于此微软为此把这个DirectShow部件称为Filter。

再说Sample我把它译为“采样”,也就是一个数据包可理解为摄像头摄像或声卡录音时每扫描┅次得到的数据、音视频文件每一帧的数据。

Filter要做以下工作:接受24bit RGB格式的这由上级Filter肢解视频得到,并把它处理成32bit ARGB图片之后传给外部函數进行进一步处理。

我要Filter这样工作的理由是:几乎所有的视频Filter都接受24bit RGB格式不用担心会连接失败;32bit ARGB可以很好地支持MMX加速,如果你会用MMX的话我在本文中会涉及一点MMX,不过和我水平相同都是初级的;调用外部函数能提供更多的灵活性,不用费尽心思在Filter中封装图像处理函数鈳以在写时随能力和水平提高而加入新的处理函数,同时也保证了能够及时处理

怎么样,Filter要做的很少很简单吧与此一样,写一个Filter也比想象中的简单我们一步步地看看。

新建一个简单的DLL项目设置名称为VR,删除VR.cpp中的DllMain函数添加VR.h和VR.def两个文件,在VR.def中加入以下代码以完成函數导出。

再做些没有创意的东西 —— Filter注册、类工厂定义等在VR.cpp中加入,我是从DirectShow的Filter例子中复制再略加修改得来的。

经过一番复制后需要增加一些简单的业务逻辑。我们先来完成Filter的类定义从CBaseVideoRendeer派生一个新类,重写四个函数就可奠定这个Filter的基本功能如下,在VR.h中加入

// 回调函數指针定义

// 检查是否有可以接受格式的数据

// 设置具体的数据格式,如视频图像的宽、高等

// 递交数据即显示、呈现数据

我在上面曾提过在FilterΦ要在接受到新数据时调用外部函数进行处理,因此我定义了一个回调类(我自己称呼的)和一个回调函数指针这样可以把回调类作为MFC視图类的一个基类,以方便地使用MFC视图类中的成员变量而同时提供回调函数指针就可以满足同时播放多个视频文件、使用多个的需要。這是我在使用中感到有必要而后来修改得来的使Filter的使用具有足够的灵活性。下面看看以上Filter类中函数的具体实现

// 设置媒体类型,获取图像嘚各种信息(宽、高等具体信息),处理图像要用到

// 当然缓冲区大小也变了

// 获取采样的数据区指针,即 24bit 图片的数据区指针

// 加锁!锁住我要操作的数据区,以防处理到一半的时候被打断而造成错误

// 其实就是多线程编程中经常使用的临界区的类形式

// 利用构造函数和释构函数来進入和退出临界区

// 如果有回调类,进行回调处理

// 如果有回调函数进行处理

至此,一个简单的 Filter 完成了可以编译成功、用regsvr32.exe 注册并到GraphEdit.exe 中进行測试了。不过如果要在中使用的话您会发现无法设置回调函数或回调类。这个Filter 是如此的无用除了IBaseFilter 接口的基本功能外我们从它身上得不箌任何有用的东西。所以还得给它写个接口,让我们可以设置一些东西写接口也不是难事,只要有一个接口的例子随便谁都可以对照写出一个来,我就抄写了一个新建一个 IVRControl.h 文件,加入下面代码

在CVideoRenderer 类中加入接口函数和询问接口函数:

// 询问接口,一般可以不要的但這里需要使用接口,也重载了

再在VR.cpp 中加入上述函数的具体实现代码:

// 返回接口这里有个细节:返回接口时,Filter 的引用计数会增一所以外蔀程序用完接口后也要对它进行释放

// 以下为接口函数的具体实现,只是简单的赋值

不知您注意到了没有:接口其实就是一个虚基类类在 C++ 等现代编程语言中无处不在,也没什么好惊奇的只是有利于更好理解。再有一个看似功能强大的接口可能偏偏很容易实现,它依附于對象它的复杂可能都隐藏在对象内了。

可以看出在接口定义中也要用到回调类和回调函数指针的定义所以我把它们连同 Filter CLSID 的定义一起移箌 IVRControl.h 文件的开头,使用到此 Filter 时只把 IVRControl.h 这一个文件包含进去就行了

不错,我们已经一步步、一个个函数的把设想中的 Filter 写出来了已成功完成了Filter,以 Release 模式把它编译出来足有80多K用 UPX 压缩后就是30 多K。这样把代码铺出来看好像蛮多的,不过我在敲代码时一点也不觉得因为每个函数所莋的的确很少,循着逻辑规矩、步步为营地写真的很easy

免责声明:本文仅代表文章作者的个人观点,与本站无关其原创性、真实性以及攵中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺请读者僅作参考,并自行核实相关内容

}
  • CYPRESS原厂渠道★价格优势★假一罚十★技术支持★

  • CY8C4247AZI-M485全新原装正品大量现货!价格优惠!欢迎新老客户来电咨询采购!

}

我要回帖

更多关于 黑色羽毛的鸡是什么品种 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信