当前位置:
文档之家› 用DirectShow实现视频捕捉
用DirectShow实现视频捕捉
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不同的参数实现它不一样的功能。
Filter
hr = pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,
1 DirectShow的介绍
在DirectShow系统之上,我们看到的,即是我们的应用程序 (Application)。应用程序要按照一定的意图建立起相应的Filter Graph,然后通过Filter Graph Manager来控制整个的数据处理过程。 DirectShow能在Filter Graph运行的时候接收到各种事件,并通过消息 的方式发送到我们的应用程序。这样,就实现了应用程序DirectShow
WS_CLIPCHILDREN); //设定窗口大小 CRect rectClient; GetClientRect(hWnd,rectClient); m_pVW->SetWindowPosition(0, 0, 320, 240); //设定可视 hr=m_pVW->put_Visible(OATRUE);
4 视频捕捉的具体实现
2 存储文件
IBaseFilter
*pRender;
IFileSinkFilter *pSink;
pRender为multiplexer filter,pSink为file writer filter.
调用下面这个函数之后就会返回两个指针分别指向IBaseFilter和IFileSinkFilter接口,并将两个 Filter(multiplexer filter,pSink为file writer filter)加入到Filter Graph中去。
4 视频捕捉的具体实现
1 初始化COM库 HRESULT hr =CoInitialize(NULL)
2 Create the Filter Graph Manager ICaptureGraphBuilder *pBuilder = NULL; HRESULT hr = CoCreateInstance(CLSID_CaptureGr
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那么就是
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 |
4 视频捕捉的具体实现
接着在调用BindToObject()以后,可以将设备标识生成一个 DirectShow Filter,将其加到Filter Graph中就可以参与工作 了。 CComPtr pM=NULL;
ULONG cFetched; CComPtr pBf=NULL; if(pEm->Next(1,&pMቤተ መጻሕፍቲ ባይዱ&cFetched)==S_OK) {
hr = pBuilder->SetOutputFileName(&guid,
wach, &pRender, &pSink);
注意:其中guid为两种形式:
MEDIASUBTYPE_Avi和MEDIASUBTYPE_Asf
如果是前者,pRender为AVI Mux Filter,如果是后者,pRender为WM ASF Writer
PIN_CATEGORY_PREVIEW 2:指出Media的类型,对于video参数用MEDIATYPE_Video。 3:是一个指向capture filter's IBaseFilter 接口的指针。 4,5:他们可以为空,通常是用来传输数据。如果第5个为空,则表示将采用
Video Renderer作为默认的renderer。
aphBuilder, NULL, CLSCTX_INPROC, IID_ICaptur eGraphBuilder, (void **)&pBuilder);
4 视频捕捉的具体实现
3 获得当前的Filter Graph IGraphBuilder *pFg; hr = pBuilder->GetFiltergraph(&pFg);
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,设置窗口属性,或把他放到想要的位置。
用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提供的是 一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。
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);
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主要负责数 据的最终去向,我们可以将数据送给声卡、显卡进行多媒 体的演示,也可以输出到文件进行存储。