《DirectShow视频采集方案.docx》由会员分享,可在线阅读,更多相关《DirectShow视频采集方案.docx(24页珍藏版)》请在优知文库上搜索。
1、2.3DireCtShOW视频采集方案流媒体处理技术以其困难性和技术性始终受到人们的关注.防着网络技术的不断发展.流媒体在网络上得到了广泛地应用.如何能修简洁、有效地进行流媒体处埋.已成为一个熊点问趣.为此.MiCrOson推出了DireaShODireaShOW是Microsoft推出的菸于Windows平台的流媒体处理开发包,它与DirectX,起发布,DireciShow对流媒体的捕获、回放供应了强大的支持,运用它还可以在域于WDM必动的采集卡上进行数据捕获。本节将介绍有关DinxtShow的相关学问.DirectShow系统结构分析DircetShoW主要由过谑器(FilterGmph
2、)图表构成.过谑图农中包含/各种Eilter,这些FiIter旎够按肯定依次连接在起.构成一条流水缓.从功能的角度划分,Filter大体可以分为3类,SourceFillers,TransformFiltersRenderingFilters.SoUgFilterS主要负责获得数据,可以是一个文件、一个聚集卡、声卡或数码相机等TmnSft三Fike上负费数据的转换、传输.例如各种编码器、解码器等。RCnderingFillerS负责数据的最终去向,例如将数据传送到声卡、显卡或存储为文件.在开发DirCCtShCW应用程序时,通常须要设计个过/图农(FihCrGraPh),向过酒图我中添加相应的
3、过沙器,最终连接过泄器的引脚就完成了功能的设计。例如,实现个荷沽的视频预览功能,须要向过沙图表中添加一个视频捕获源过沌器和一个VideRendCrer过沌器,将视领捕获源过池器的输出引脚与VideoRCIKkrer过谑器的输入引脚相连就可以了.而在程序中只须要依据设计过泄图表的捕获添加过漉零并连接过沌潺引脚就可以了.在连接过沌零引脚时须要注意:只能是输出过逑器引肥与输入过沙器引脚相连,两个给出过谑器或两个输入过港器引脚是不能相连的.为了在程序中运用DireClShow,须要单独安装DireCtX,当前DireaX的域新版本为9.0,即DireCIX9.0,用户可以从MiE三h的官方网站上免费卜
4、战,在安装DiNCIX之后,程序中须要引用Fshumh头文件,并3入51四洞,.g库文件和“quartzlib”库文件才可以运用DimCtShOW.代眄如下:#Pragmacomment(Iib1wStrmiids)#Pragmacomment(lib,quartz)“includeFilter图表设计为了使利用户设计过波图衣,DireCIX供应了个GntPhEdiI工具,用户可以单击“起先”菜单下的“MicrvsofiDirectX9SDKDir;IXUtiIiliesVGraphEdit”菜单项打开GraphEdil工具,如图2.10所示。IS2.10GraphEditZA卜面笔者介绍如何
5、运用GraphEdit工具设计过谑图表,过游图衣的功能是实现视猱的预览功能,详细步骤如卜:(1)在图2.4中单击“GraphAnscrtFmenr菜单项打开M添加过谑器”窗口,如图2.11所示。jInyertFilter|CI0”VhichfiltersdJrOQvastto5ert?.BDASoBCeFiltersBDATrftniportIafomtionKandrrsD*vcControlFilter*,DirectShcvFilters:DIwAudioCaptxirttEffects5DIMAUdioBffcltDWVideoEffects;ExternalRiidrtrsVidiR
6、ndrr4BVldVOCpSreSoxircero3OlWp,511)VId*oCorprtsortAlWStremDeCgPremgDevicesRAlWStrQSingCpturDtvicxAIftStrsiComunicationTrnfornt&KlWStremincCrossbarDevicesAMStrosingDITraxixfomx图2.11添加过流器的口(2)在“VideoCapiureSoUrCeS”节点下选择一个视频捕获源过渡器,单击“InsertFiller按钮将其添加到过沙图衣中,如图2.12所示图2.12添加视婉桶茯源过沙器窗口提示;假如系统中没有安装摄像头及其驱动
7、程序,该节点下将不会有视频捕获源过谑器,(3)在“DirorlSh。WFilg”节点卜选择“VideoRenderer”过滤罂,籽其添加到图表中,如图2.13所示。图2.13添加“VideoRCndCRr”过湖器窗口(4)利用鼠标将视频捕获源过谑器的“Capture”引胆与VideoRCndCrer过渡器的“VMRInPMr引脚相连,如图2.14所示。图2.14连接过渡引脚窗11(5)单击工具栏中的“上b按钮运行过滤图发,将显示一个视频预览窗口,如图2.15所示,Aelve1*vicVib4*呼三一版本控制之道PragmaticVersionControl图2.15税嫉预览窗I】枚举系统设备运
8、用GraPhEdit工具,用户可以特别便利地扶疗与某一系统设备相关的过港器.但是,在程序中该如何获得这些过港器呢?用户可以采纳枚举的方式列举系统中安装的设备“以列举系统中的视频捕获设招为例,件先定义一个设需列举接口ICrealeDeVEnUm的一个指针,调用CoCreaieInstance方法创建ICneateDevEnum实例,然后定义一个列举监视器!EnumMonikcr的个指针,试用ICrCHtCDCVEnUm实例的CrcatcciassEnumcrator方法创建IEniImMOnikCr实例,最终以指环的方式调用IEnUmMOlIiker实例的NeXI方法遍历系统设备,调用IEnll
9、mMOniker实例的BindToObjeci方法将系统设备绑定到过游器上。在上面的描述中.ICrcatcDdEnum实例的CrMCClaSEEIWmCnHOr方法的第个参数瑜定枚举的系统设备.例如笫个参数为CisiD-VidcolnpulDcviccCalcgory,22示将要枚举系统中的视物甫奈卡,为Cl-SlD3WcoComprcssrCatcgory.表示枚举系统中的视频压缩器。下面的代码演示了如何枚举系统中的视频捕获卡枚举视频设备ICreatcDcvEnum*pDcvEnum=NU1.1.:CoCrcatclnsancc(CIID-SystcmDcviccEnum.NU1.1.C1.
10、SCTXNPRQC,IIDJCfa(eDevEnum(void*)&pDevEnum);IEjiuniMonikcr*pClassEnum=NU1.1.:pDcvEnum-XkcatcClassEnumcrator(C1.SIDVidcolnputDcviccCatcgriry.ApCIassEnum.0):U1.ONGcFctchcd;while(pClasEnumNex(I.pMoniker-BindTObjxt(0.0.HD_IBaseFiher.(void*)Rclcasc():break;JpClassEnurn-Relcasc():而下面的代眄则用于推断系统中是否安装了指定的视频压
11、缩器.ICrcatcDcvEnumfpDcvEnum=NU1.1.;CoCreateInstance(C1.SID_Sys(emDeviceEnum,NU1.1.C1.SCTX.INPROC.IID,ICrcaleDevEnum.(void*)pDevEnum);IEnumMonikcr4pClasEnum=NU1.1.:列举视频压缩设备pDevEiniin-XreateClassEnumeratortC1.SID.VideoCompressofCategor),.ApCIassEnumi0);while(pClaxsEnum-Nexl(1.&pMoniker.AcFelched)=S_OK(
12、IPmpcrtyBag4PProP-NU1.1.;pMonikerBindToSorage(void*5*)p-Rcad(1.,FriendlyNamcw,varNan,O);CStringsir=varName.bstrVal;if(str.Fil(,MicrsoftVideo.0)!=-1)(pMonikcr-BindT(K)bjcct(0.O,HDeIBaseFihcr4(void*,)pComprcss);pMonikerRelease();break;JVariantCIcar(AvarNanK);)pClassEnun-Release();查找FilterPin每一个过渡器(Fil
13、ter)至少应有一个引脚(Pin).或者是输入引脚或者是输出用脚。有线过渡器还拥有多个引脚,即又情人引脚又有除出引脚.但是过漉零的谕入、怆出引脚并不是对应的,有些过漉零可以有多个谕入引脚.而只有一个横出引脚或齐没有输出引脚,在程序中为了连接过酒器间的引脚,逋常须要狭得过渔器的各个引脚.用户可以运用IEnumPins接11来枚举某一个过滤器的输入、蛤出引脚.过灌器IBaseFiItcr供应了一个EnumPins方法用于生成一个IEnUmPinS接口实例,这样,通过调用IEnUmPinS的Next方法便可以访问各个引脚了。下面的代码定义了一个FindPin函数.用于获得某个过源潺的输入或徜出引脚.
14、查找引脚IPin*CKinescopeDIgjjFindRindBaseFiherj*pRlter,PIN_DIRECTIONdir)IEnumPins*pEnumPins:IPin*putin;P1N.D1RECTIONpDir:pFilter-EnumPins(&pEnumPins):while(pEnumPins-Ncxt(l.&pOutpin,Nl;1.1.)=S_OK)pO(pin-QuerjDitection(pDir);tfDir=Jir)(returnpOutpin:1Jreturn0:J用户可以按下面的方式换得某个过沌器的输入、给出引脚.IPin*PCOlnou,“PComln;pComln=ndPin(pCnpress.PlNDIR-INPUT);pComOut=FmdPn(pCompress.PlNDIR-OUPUT);连接FilterPin运用GmPhEditTA,用户可以利用鼠标特别便利地连接两个过湖!间的引脚.但是在程序中却没这么简洁了.首先须要依据节介绍的方法狭得两个过状器的怆入、怆出引脚,然后将第一个过港器的怆出引胆连接到其次个过港器的输入中梆,其中,连接两个引脚须要调用IGraphBuikkr接口的ConnectDireci方法。下面的代码演示了如何连接两个过范器的引脚.IPin才pCInOUI产PComIn: