DirectShow流媒体消息获得及图象转换.


概述

  流媒体的处理,以其混杂性和技巧性,始终广受工业界的关怀。尤其追随着因特网的普及,流媒体在网络上已普遍利用﹐怎样使流媒体的处理变得容易而富有收获逐渐成为了焦点问题。抉择一种轻便的利用计划,将事半功倍。此刻,微软的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值,那么仅凭测验是不可能检测到这类的讹谬。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值