DirectShow 的重要接口

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来使用摄像头,一般要求摄像头的驱动是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 过滤器连接到别的过滤器之前你必须配置它。然后查询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( );

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值