用DirectShow实现视频捕捉

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
IVideoWindow *m_pVW; hr = pBuilder->FindInterface(&PIN_CATEGORY_PREVIEW, &pBf, IID_IVideoWindow, (void **)& m_pVW);
4 视频捕捉的具体实现
//设定视频窗口 //设定视频窗口为主窗口的一个子窗口 hr=m_pVW->put_Owner((OAHWND)hWnd); //设定窗口样式 m_pVW->put_WindowStyle(WS_CHILD |
PIN_CATEGORY_PREVIEW 2:指出Media的类型,对于video参数用MEDIATYPE_Video。 3:是一个指向capture filter's IBaseFilter 接口的指针。 4,5:他们可以为空,通常是用来传输数据。如果第5个为空,则表示将采用
Video Renderer作为默认的renderer。
pM->BindToObject(0,0,IID_IBaseFilter, (void**)&pBf); pM.Release(); } else { return false; }
4 视频捕捉的具体实现
//将设备添加到graph hr = m_pGraph->AddFilter(pBf, L"Video Capture"); 接下来分别是视频和存储文件这两个分支 1 视频: hr=m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,pBf,NULL,NULL); 这5个参数的意义分别为(从第一个开始): 1:指出Capture Filter中pin的属性,如果是Preview那么就是
4 视频捕捉的具体实现
2 存储文件
IBaseFilter
*pRender;
IFileSinkFilter *pSink;
pRender为multiplexer filter,pSink为file writer filter.
调用下面这个函数之后就会返回两个指针分别指向IBaseFilter和IFileSinkFilter接口,并将两个 Filter(multiplexer filter,pSink为file writer filter)加入到Filter Graph中去。
3 视频捕捉的整体框架与思路
2、Capture Filter有两个pin,分别是Capture和Preview。从图3 可以看出,它们和其他的Filter连接在一起,分成两路。 Capture->AVI Mux->File Writer这条分支是用来存储多媒体 文件;Preview->Video Renderer这条分之是用来视频显示。 建立了Capture Filter以后,还得建立AVI Mux Filter、File Writer、Video Renderer这些Filter。使用 ICaptureGraphBuilder接口依次连接到Filter Graph中,最终形 成一个完整的Filter Graph Manager。要实现视频捕捉到文件, 可用ICaptureGraphBuilder::RenderStream方法,指定相应的 输出文件路径等参数即可。要实现视频捕捉,也可以用 ICaptureGraphBuilder::RenderStream方法,通过设置 RenderStream不同的参数实现它不一样的功能。
1 DirectShow的介绍
1、 DirectShow的体系结构如图1所示。
1 DirectShow的介绍
DirectShow位于应用层中。它使用一种叫Filter Graph的模 型来管理整个数据流的处理过程;参与数据处理的各个功 能模块叫Filter;各个Filter 在Filter Graph中按一定的顺序 连接成一条“流水线”协同工作。按照功能来分,Filter大 致分为三类:Source Filters、Transform Filters和 Rendering Filters。Source Filters主要负责取得数据,数 据源可以是文件、因特网、或者计算机里的采集卡、数字 摄像机等,然后将数据往下传输;Transform Fitlers主要 负责数据的格式转换、传输;Rendering Filtes主要负责数 据的最终去向,我们可以将数据送给声卡、显卡进行多媒 体的演示,也可以输出到文件进行存储。
4 视频捕捉的具体实现
下面就主要设置Video Renderer Filter用来播放video.Filter Interfaces: IVideoWindow.获得访问Video Preview Window的接口指针 video preview window是一个独立的窗口。如果你想改变默认的行为,先 调用 ICaptureGraphBuilder::FindInterface获得IVideoWindow 接口。第二 个参数通过pBf指定,描述video capture filter,第三个参数是想得到的接 口(IVideoWindow),最后的是返回的接口。当你得到IVideoWindow接口 后,你可以调用IVideoWindow的方法象 put_Owner, put_WindowStyle, or SetWindowPosition 去获得 video preview window的handle,设置窗口属性,或把他放到想要的位置。
4连接设备 还要创建系统枚举器组件对象 CComPtr pCde=NULL CComPtr pEm =NULL hr=CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &pCde); 然后使用接口方法CreateClassEnumerator ()为指定的Filter注册类型目录创建一 个枚举器,并获得IenumMoniker接口 pCde->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0);
4 视频捕捉的具体实现
1 初始化COM库 HRESULT hr =CoInitialize(NULL)
2 Create the Filter Graph Manager ICaptureGraphBuilder *pBuilder = NULL; HRESULT hr = CoCreateInstance(CLSID_CaptureGr
4 视频捕捉的具体实现
接着在调用BindToObject()以后,可以将设备标识生成一个 DirectShow Filter,将其加到Filter Graph中就可以参与工作 了。 CComPtr pM=NULL;
ULONG cFetched; CComwk.baidu.comtr pBf=NULL; if(pEm->Next(1,&pM,&cFetched)==S_OK) {
2 Filter概述以及连接
3 视频捕捉的整体框架与思路
流程图如下:
3 视频捕捉的整体框架与思路
1、建立Capture Filter,这个Filter很重要,它代表的是 捕捉卡等硬件设备。其实它就是Directshow与设备的 Driver之间的接口。因为Filter通过Deviceloctl函数实现 交互,使得应用程序员可以通过Directshow的Filter直接 与捕捉设备的Dirver进行通信。Capture Filter的创建也 不象其他Filter一样使用CoCreateInstance就可以,而是 先创建一个系统设备(System Device Enumerator)枚 举器,从中选择代表Capture设备的Capture Filter;然 后与添加别的Filter一样调用IFilterGraph::AddFilter就可 以将Capture Filter加入Filter Graph。
Filter
hr = pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,
WS_CLIPCHILDREN); //设定窗口大小 CRect rectClient; GetClientRect(hWnd,rectClient); m_pVW->SetWindowPosition(0, 0, 320, 240); //设定可视 hr=m_pVW->put_Visible(OATRUE);
1 DirectShow的介绍
在DirectShow系统之上,我们看到的,即是我们的应用程序 (Application)。应用程序要按照一定的意图建立起相应的Filter Graph,然后通过Filter Graph Manager来控制整个的数据处理过程。 DirectShow能在Filter Graph运行的时候接收到各种事件,并通过消息 的方式发送到我们的应用程序。这样,就实现了应用程序DirectShow
hr = pBuilder->SetOutputFileName(&guid,
wach, &pRender, &pSink);
注意:其中guid为两种形式:
MEDIASUBTYPE_Avi和MEDIASUBTYPE_Asf
如果是前者,pRender为AVI Mux Filter,如果是后者,pRender为WM ASF Writer
aphBuilder, NULL, CLSCTX_INPROC, IID_ICaptur eGraphBuilder, (void **)&pBuilder);
4 视频捕捉的具体实现
3 获得当前的Filter Graph IGraphBuilder *pFg; hr = pBuilder->GetFiltergraph(&pFg);
用DirectShow实现视频捕捉
内容
1 DirectShow的介绍 2 Filter概述以及连接 3 视频捕捉的整体框架与思路 4 视频捕捉的具体实现 5 关于MJPEG 6 其他
1 DirectShow的介绍
DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理 的开发包,与DirectX开发包一起发布。 那么,DirectShow能够做些什么呢?且看,DirectShow为多媒体流的 捕捉和回放提供了强有力的支持。运用DirectShow,我们可以很方便 地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期 处理乃至存储到文件中。它广泛地支持各种媒体格式,包括Asf、 Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而 易举。另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、 DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以 及与数字摄像机的数据交换。更值得一提的是,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)的连接图如下:
相关文档
最新文档