关于DirectShow在Video视频处理方面的的一些基本应用_第1页
关于DirectShow在Video视频处理方面的的一些基本应用_第2页
关于DirectShow在Video视频处理方面的的一些基本应用_第3页
关于DirectShow在Video视频处理方面的的一些基本应用_第4页
关于DirectShow在Video视频处理方面的的一些基本应用_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DirectShow视频处理的基本应用程序作者:侑名文章的出处:不明点击数: 8017更新时间: 2005-10-6DirectShow视频处理的基本应用程序DirectShow是微软提供的DirectX软件开发软件包的一部分,是windows中主要以处理流媒体数据为重点开发的编程接口,可以有效地处理音频视频数据提供用于直接访问系统基础功能的应用程序的接口,允许该应用程序直接控制从数据收集到数据广播的中间部分。DirectShow以较新的概念操作媒体流。 他类似于计算机硬件管脚Pin的概念,引入了滤波滤波器和流程图等原理。 媒体流通过流图中的每个过滤器,并且最后到达输出接口,在该时间段中,经过每个过滤器的转换和控制,最终数据达到恒定的请求。 DirectShow的基本接口可以应用自己的过滤器,例如将视频数据流的格式从MPEG转换(解压缩)为RGB,或者将像素格式从YUV转换为RGB,以满足流中数据的特殊处理需要DirectShow本身是一个比较复杂的系统,包含了很多概念,对于初学者的程序员来说,需要学习很多新的知识,特别是对于VC以外的应用程序开发人员来说,可以预想到想要实际使用DirectShow的功能的困难。 因此,这里提供了一个折中的解决方案,让非VC开发者可以方便地使用DirectShow提供的功能,同时为所有想进入视频编程领域的开发者提供DirectShow的入口点。 与这篇文章相关的源代码可能对感兴趣的读者有用。一、DirectShow的graph原理Graph实际上是filters的容器,Dshow提供了Graph控件(Com ),应用程序可以使用cocreate实例创建Graph对象。 Dshow还有另一种创建和操作Graph的方法。 这就是Builder对象。 一般来说,应用程序首先需要创建Builder对象。 是Dshow流控制的关键。 Builder接口提供的方法包含智能地创建Graph的Filters的能力。 如果不知道媒体流的格式,使用Builder连接到filter时,将智能添加的系统的格式转换为Graph的filters链,生成所需格式的最佳转换链。创建Builder和Graph后,通过将Graph添加到Builder中,可以将指定的Filter添加到Graph中。 一般系统的视频设备是通过设备枚举过程捕获的,系统的每个视频驱动器都定义为视频设备(音频设备也一样)。 函数:cocreainstance (clsid _ systemdeviceenum空值clsmctx_incoproc_serveriid_iisdevenum(void*)pCreateDevEnum;创建系统设备枚举器对象iisdevenum*pcreatedevenum; /设备枚举器对象指针GUIDiid_iisdevenum/设备枚举器接口的guidconstrclsctx_incoproc_server/要创建的对象的处理特征GUIDCLSID_SystemDeviceEnum/枚举器对象类的GUID注意: GUID包含在Dshow头文件UUID.h中。设备枚举对象用于列出系统中已安装的设备,每个设备类形成IenumMoniker对象,并列举系统中安装的设备数/创建视频输入设备枚举器IEnumMoniker *pEm;pcreatedevenum-createclassmerrator (clsid _ videoinputdevicecategory,pEm,0 );pEm是建立的视频设备枚举器,通过此对象枚举系统的视频设备。莫妮卡*pm; /列举视频设备获取pEm-Next(1,pM,cFetched ),hr=s_ok)/Imonker接口Dshow通过设备的Imoniker接口来操作系统中的设备。 类似的步骤可获得系统的音频装置,且这些步骤统称为系统的输入装置。 (关于函数的参数定义,可以看到VC的帮助,不是VC开发者,只要知道基本原理就行。)监视器对象可以通过提供的BindToObject方法获取输入设备的Filter对象PS-PS (0,0,IID_IBaseFilter,(void*)pVCap )pVCap是视频输入设备对象,可以使用QueryInterface函数来获得特殊输入设备的接口对象(pVCap只是反映基本的过滤器对象,不能反映特殊方法, 查询特殊接口需要知道接口的GUID,这可以从购买设备时提供的资料中获得,一般不需要特殊的接口功能,使用基本的功能可以保证应用系统的兼容性和广泛的可用性。获取设备后,将其添加到Graph中,并使用智能连接的系统默认渲染器图形添加过滤器(PVC AP,空)p buider-render stream (pin _ category _ captureMEDIATYPE_VideopACap空值空值;形成从输入到系统的默认Render的视频播放filters链接,启动该链接后,视频图像将显示在显示器上。 当然,还需要设置显示窗口的大小和位置。 此播放链路已在视频输入设备的捕获管脚上建立。 如果设备上不存在Capture管脚,则无法建立链接,也可以在Preview管脚上建立链接(PIN_CATEGORY_PREVIEW )。 过滤器链接的原理如图所示当USB相机指定了显示窗口的大小作为视频输入装置的滤波回放链接时,该USB相机可以回放视频流。 Graph的基本概念框图如下其中,Filter1.还可以应用自己加入的特殊Filter来对视频流进行特殊处理,例如,还可以对视频数据进行特殊压缩和解压缩,如嵌入型、滚动视频和实时图形。 视频数据流在p样本缓冲中阶段性地通过各个过滤器,最后到达render,进行显示处理。 pSample是一个过滤器数据交换缓冲指针,通过用自己的过滤器改变pSample的数据,达到改变视频流显示的目的。二、过滤器的制作和使用建立滤镜通过建立滤镜对象类并输出接口方法组,根据滤镜的用途选择适当的父类,Dshow还选择各种父类对象和接口,例如用于Graber的滤镜可以直接捕捉存储器中的帧图像,远胜于使用窗API的cap类函数的快照。 接口方法的定义:declare _ interface _ (igrabberbipp,inon ) 111112222222652STD方法(媒体类型) (this _ c媒体类型* PMT ) pure; /* in */the media type selectedSTD方法(get _ media type ) (this _ c媒体类型* * PMT ) pure;/* out */themediatypeselectedSTD方法(get _ ipin ) (this _ ipin * * ppin ) pure; /* 出 */源平面。STD方法(get _ state ) (this _ filter _ state * state ) pure; /* 出 */过滤器状态。STD方法(get _ filter ipin ) (this _ intn,IPin *pPin ) PURE; 输入/输入/输出管脚STD方法(get _ image size ) (this _ long * outwidthlong * outHeight长*输出位计数)纯;STD方法(get _ frame size ) (this _ long * outframeesize ) pure;STD方法(get _ bitmapinfo header ) (this位图头*输出位图(pure );STD方法(get _ is16位RGB ) (this _ long * outilisrgb 565 )纯;STD方法(put _ isfieldicture ) (this _ boolinisfield ) pure;STD方法(快照) (this _ byte * out buffer,BOOL inIsSyncMode) PURE;STD方法(isasyncsnapshotfinished ) (this _ bool * out finished ) pure;STD方法(取消) (this )纯;/- -滤镜对象的定义:classcgrabberlinkplace : publicctransplacefilter公共igrabberipp/- -描述了滤镜对象和输出接口方法后,可以使用regsvr32在系统中注册滤镜,以便应用和使用1 .在1.cocreainstance中创建接口,并使用基本滤镜对象类的GUID。cocreate实例(clsid_grabberreinplace空值clsmctx_incoproc_serverIID_IBaseFilter(void *)pBf;指定CLSID_GrabberInPlace/过滤器的类GUID。 用自己的过滤器定义IID_IbaseFilter/基本过滤器对象接口GUID。 是所有过滤器的父类此时,您将获取包含您自己的过滤器的基本过滤器指针(特殊方法函数不会出现在此接口中),如果需要使用特殊方法,请使用QueryInterface,查询将获取特殊的接口指针pbf-query接口(iid _ grabber IPP )(void *)pGf;IID_GrabberIPP/特殊过滤器的接口GUIDPGf/特殊过滤器接口指针pGf允许您操作特殊过滤器来处理视频数据。 注意:在写自己的特殊过滤方法时,必须正确地理解过滤器父类各层的对象的操作关系和方法,灵活地处理各种情况的发生,过滤器是系统应用层以下的系统程序,其异常可能导致系统崩溃,因此,default三、视频dll的输出函数动态库输出函数:启动Com和枚举系统设备bool _ stdcallfnvideodll _ initial (void )列出系统中安装的音频和视频设备,并将其作为操作表列出。销毁所有系统设备和已建立的设备对象.bool _ stdcallfnvideodll _ finally (void )放弃建立的设备对象,并结束动态库操作获取当前的系统设备数int _ stdcallfnvideodll _ getdvideodevicescenumber (bool is视频)is视频: true表示获取视频设备数,否则表示获取音频设备数获取系统中指定类型(音频/视频)设备的数量获取指定系统设备的参数bool _ stdcallfnvideodll _ getdvideodeviceparms (longdevindexTParms * pParmsbool is视频; bool_stdcallDevIndex指定设备的索引号,如果存在多个设备,则指定设备号。PParms设备参数缓冲指针、设备参数接收is视频: true表示获取视频设备数,否则表示获取音频设备数设置指定系统设备的参数fnvideodll _ setideodeviceparms (longdevindex,TParms * pParms,bool is视频)选择指定的设备,并创建设备对象(基于指定的参数)bool _ stdcallfnvideodll _ selected视频dev (intdevindexhwnd应用程序手柄RECT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论