概述
流媒体的处理,以其混杂性和技巧性,始终广受工业界的关怀。尤其追随着因特网的普及,流媒体在网络上已普遍利用﹐怎样使流媒体的处理变得容易而富有收获逐渐成为了焦点问题。抉择一种轻便的利用计划,将事半功倍。此刻,微软的DirectShow给了我们一个不错的抉择。
DirectShow是微软公司在ActiveMovie和Video for Windows的基础上推出的新一代基于COM的流媒体处理的开发包,与DirectX开发包同时公布。现在,DirectX最新版本为9.0。DirectShow为多媒体流的捕捉和回放供给了强有力的扶持。利用DirectShow,我们能够很得体地从扶持WDM驱动模型的采集卡上捉拿数据,并且举行相应的后期处理乃至存储到文件中。这么使在多媒体数据库管教系统(MDBMS)中多媒体数据的存取变得更加得体。
DirectShow 原理及重要的接口
1、DirectShow工作原理
1) DirectShow的系统构造
DirectShow的系统构造如图1所示。
图1 DirectShow系统
DirectShow位于利用层中。它利用一种叫Filter Graph的模型来管教全副数据流的处理过程;加入数据处理的各秉功能模块叫Filter;各个Filter 在Filter Graph中按定然的次序连接成一条“流水线”协同工作。按照功能来分,Filter大约分为三类:Source Filters、Transform Filters和Rendering Filters。Source Filters重要负责获得数据,数据源能够是文件、因特网、可能计算机里的采集卡、数字摄像机等,然后将数据往下传输;Transform Fitlers重要负责数据的款式转换、传输;Rendering Filtes重要负责数据的最后去路,我们能够将数据送给声卡、显卡举行多媒体的演示,也能够输出到文件举行存储。
在DirectShow系统之上,我们看到cdr.riacdr.com的,即是我们的利用过程(Application)。利用过程要按照定然的愿望发生起相应的Filter Graph,然后穿越Filter Graph Manager来扼制全副的数据处理过程。DirectShow能在Filter Graph运行的时候接收到各种事件,并穿越消息的措施发送到我们的利用过程。这么,就告终了利用过程与DirectShow系统之间的交互。
2) Filter概述以及连接
过滤器(Filter)是DirectShow中最大约的观念。DirectShow是穿越Filter Graph来管教Filter的。Filter Graph是Filter的“容器”,而Filter是Filter Graph中的最小功能模块。Filter是一种COM组件,对于每个Filter,都有其自己的Pin,它是由Filter创立的COM对象。Filter穿越Pin来举行他们之间的连接。Pin分为两种:输出Pin和输入Pin。输出的Pin把Filter处理后的数据递交到Filter的表面,而输入Pin则是把Filter表面的数据接收到Filter中,以便Filter对这些数据举行处理。对于三种种类的Filter(Source Filter,Transform Filter,Rendering Filter)的连接图如下:
图2 Filter的连接
2、DirectShow对硬件的扶持原理
大家懂得,为了长进系统的安宁性,Windows垄断系统对硬件垄断举行了隔绝;利用过程等闲不能直接拜会硬件。DirectShow Filter工作在用户形式(User mode,垄断系统特权级别为Ring 3),而硬件工作在内核形式(Kernel mode,垄断系统特权级别为Ring 0),DirectShow处理的措施是,为这些硬件设计包装Filter;这种Filter能够工作在用户形式下,表面、扼制措施跟等闲Filter一样,而包装Filter内部告终与硬件驱动过程的交互。这么的设计,使得编写DirectShow利用过程的开发人员,从为扶持硬件而需做出的特异处理中解脱出来。DirectShow曾经集成的包装Filter,包括Audio Capture Filte(qcap.dll)、VfW Capture Filter(qcap.dll,Filter的Class Id为CLSID_VfwCapture)、TV Tuner Filter(KSTVTune.ax,Filter的Class Id为CLSID_CTVTunerFilter)、Analog Video Crossbar Filter(ksxbar.ax)、TV Audio Filter(Filter的Class Id为CLSID_TVAudioFilter)等;另外,DirectShow为批准WDM驱动过程的硬件设计了KsProxy Filter(Ksproxy.ax,)。下图即便各个包装Filter与硬件交互的构造图:
利用过程 DirectShow Filter Graph KsTune.ax KsXbar.ax KsCap.ax 其他等闲的Filter Stream Class Tuner minidriver Crossbar mindriver Capture minidriver Tuner,Crossbar,Capture minidriver
3、DirectShow 的重要接口
DirectShow批准了COM规范,因而许多重要的功能都是穿越COM接口来告终。下面就罗列一些重要的DirectShow的接口。
(1) IGraphBuilder接口
用于构造Filter Graph的接口,发生和管教一系列的Filter,过滤和处理源媒体流。
(2) IMediaControl接口
用于扼制多媒体流在过滤器图表中的流动,如流的启用和静止。
(3) IMediaEvent接口
用于捉拿播送过程中发生的事件,并通知利用过程,如EC_COMPLETE等。
(4) IVideoWindow接口
用于扼制视频窗口的属性。
(5) IMeadiaSeeking接口
用于查找媒体的接口,定位流媒体,扼制多媒体数据播送供给准确扼制。
(6) IBaseFilter接口
从ImediaFilter接口继承,用来定义一个翔实的过滤器指针,并对多媒体数据举行处理。
(7) IPin接口
用于管教两个过滤器之间的Pin,从而连接过滤器。
(8) IsampleGrabberCB接口
是Sample Grabber过滤器的一个接口,用于当流媒体数据穿越过滤器时举行采样以获得帧图象。
DirectShow流媒体数据的采集及图片的捉拿
用DirectShow来利用摄像头,等闲要求摄像头的驱动是WDM款式的,当然,一些比拟老的驱动款式DirectShow也可扶持。在DirectShow中,有一个Sample Grabber过滤器,它是一个能够被插入流的过滤器,它有自己的缓冲,储藏采样。我们就能够用它来从一个视频文件中容易的扑获一桢。DirectShow穿越图形过滤管教器(Filter Graph Manager)来与上层利用过程和基层的驱动举行联系。DirectShow穿越捉拿过滤器(Capture Filter)来扶持对摄像头的捉拿,一个捉拿过滤器有多个插口(pin),其中的预览(preview)插口可用来举行揭示祯图象。
1、创立图形过滤管教器Filter Graph
如上面原理所述,率先要创立Filter Graph:
CComPtr< IGraphBuilder > m_pGraph;
hr=m_pGraph.CoCreateInstance( CLSID_FilterGraph );
2、连接装备
还要创立系统枚举器组件对象:
CComPtr<ICreateDevEnum>pCreateDevEnum;pCreateDevEnum.CoCreateInstance( CLSID_SystemDeviceEnum );
然后利用接口措施CreateClassEnumerator ()为指定的Filter登记种类目录创立一个枚举器,并获得IenumMoniker接口:
CComPtr< IEnumMoniker > pEm;
pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0 );
随后在调用BindToObject()尔后,能够将装备标识生成一个DirectShow Filter,将其加到Filter Graph中就能够加入工作了。
CComPtr< IMoniker > pM;
CComPtr< IPropertyBag > pBag;
hr=pM->BindToStorage(0,0,ID_IPropertyBag, (void**) &pBag );
3、创立Sample Grabber过滤器
CComPtr< ISampleGrabber > m_pGrabber
hr=m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
当创立好SampleGrabber尔后,在Sample Grabber 过滤器连接到别ie.ieltsuk.org的过滤器之前你定然搭配它。然后查询IsampleGrabber接口,还要设置流媒体种类:
m_pGrabber->SetMediaType();
能够仅仅指定主媒体种类;可能主种类加子种类;可能主种类,子种类和种类款式。然后就把它加载到FilterGraph中去:
m_pGraph->AddFilter(pGrabBase,"Grabber" );
4、查找Filter Graph 的Pin并告终后续连接。
接下来就能够穿越调用IGraphBuilder 的FindPin()接口来查找过滤管教器中的Pin接口,并穿越ICaptureGraphBuilder2 中的接口RenderStream()来告终后续的连接。
hr=pCGB2->FindPin(pCap,PINDIR_OUTPUT,&PIN_CATEGORY_VIDEOPORT, NULL,FALSE,0,&pVPPin);
hr=pCGB2->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video, pCap,pGrabBase,pRenderer);
5、获得流媒体种类并运行
穿越GetConnectedMediaType()获得连接流媒体的种类尔后,我们能够穿越IsampleGrabberCB类的接口BufferCB()来把视频的数据拷贝到自定义的缓冲区中,然后穿越在缓冲区的拷贝举行视频到图象数据的拷贝。最后运行﹕
CComQIPtr<IMediaControl,&IID_IMediaControl > pControl = m_pGraph;
hr = pControl->Run( );
结论
本文谈论了DirectShow的大约原理,创立Filter Graph的大约措施,以及穿越DirectShow来捉拿视频数据,然后将其保留为自己想要的图象,对于多媒体数据库管教系统是一个极其利于的赔偿,如对测验报名的软件系统有很强的习惯性,能够减退开发成本。长进用户的实用性。
DirectShow技巧是一个开发多媒体的卓有收获的措施。在未来几年中,DirectShow技巧的进展前景相当宽阔,掌握DirectShow的技巧将有重要的实用含义。
目前,Example对象具有负值了!万一getValues() 的调用者永远也不设置归来的Dimension对象的width 和height值,那么仅凭测验是不可能检测到这类的讹谬。