基于windows的几种视频采集方法的设计与实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
’DirectShow是微软根据对来自许
创建说频捕获窗fj
多不同的媒体资源的流视频和音频的需 要,开发的一个解决办法,它设计提供 所有高质量的视频回放以及捕获特性。 DirectShow还提供了广泛的支持结构 模型。这种模型可以将新的媒体类型轻 松地添加到自己的结构中。
DirectShow是一种基于COM技术的 多媒体编程接口。它给出了一种全新的 多媒体数据处理模型,并封装了采集、 压缩和解压缩等一系列算法,为视频监 控、视频会议等多媒体应用系统的开发
采集的核心代码【5]: { HWND hWnd=capCreateCaptureWindow(“视频捕获窗口”,
WS_CHILD WS VISIBLE,//设置指定窗口的风格 Rect.1eft,Rect.top,Rect.Right—Rect.1eft,Rect.bottom- Rect.top,//设置显式帧窗口的大小 NULL,NULL)://创建捕获窗口并将获取的句柄赋予hWnd //注册系统【旦】调函数 CapSetCallbackOnError(hWnd.(FARPROC)ErrorCalIbackProc: 7/在采集过程中出错时被调用
示意图如图2所示。值得说明的是,开发人员在开始编码前,可以使用 DirectX SDK提供的GraphEdit应用程序来对选用的过滤器进行测试,按照
系统需求选用的过滤器图表能否工作,在GraphEdit程序中就能够测试出
来,而且可以不必编写一行代码。
r——————————‘’。1 r——‘———————’‘1 r‘——————’’—。。1
成。唧的视频采集功能函数主要包括捕获视频流至AVI文件
(capCaptureSequence)、捕获视频流至缓存(capCaptureSequenceNoFi le)、 捕获视频流的具体帧至AVI文件(cap-CaptureSingleFrame)、本地预览 (capPreview/capOverlay)和捕获单帧预览(capGrabFrame/cap—GrabFrameN —oStop)等。VFW还提供了回调函数,允许应用程序精确控制视频流的捕 获、检测错误、监控状态变化,以及在捕获两帧数据的空隙和每捕获新帧 时对实时视频数据进行处理。具体的采集流程如图l所示。
m瑚raphBuiIder:
ICaptureBui lder2 IVideoWindow
//初始化c伽库
*m_pCaptureGraphBui lder *m_pViewWindow;
CoInitialize(NULL): /¥使用自定义函数GetDeviceInterfaces 0获取DirectShow提供的
CoInitialize来初始化,使用完毕后用CoUninitialize来释放。 采集的核心代码[5]:
HRESULT CaptureYideo 0 {
HRESULT IBaseFi Iter ImediaControl IGraphBuilder
lter抛L: hr:
*pBaseFi
*m_pMediaControl:
法来对系统已有的采集设备进行枚举,找到可供使用的设备.
hr=FindCaptureDevice(&pBaseFilter): //将上一步找到的视频过滤器加入到过滤器图表管理器中
Capture’):
hr=m_pGraphBuiIder一>AddFilter(pBaseFilter。L’Video
//用Renderstre锄将视频管理器和预览管理器连接起来
h r=m—P C a t t U r e G r a P h B U i l d e r一
>RenderStream(矗PIN_CATEGORY_PREVIEW,眦DIATYPE_Video.pBaseFilter。
NULL。NULL)·
呵圈
万方数据
//将采集到的视频图像保存到文件中 Hrffim—pCaptureGraphBuiIder一>SetOutputFileName(&MEDIASuBTYPE _Avi,L”c:\example.avi。,&ppf,NULL):
臻l一
信息 科学
基于Wind ows的几种视频采集方法设计与实现
李钦存王春明段海龙 (63895部队河南孟州454750)
[摘要】分别介绍在Windows操作系统下的三种实时视频数据采集的方法。即基于VFlr的实时视频采集,基于DirectShow的实时视频采集和基于视频卡附带软件 开发工具箱(SDK)的实时视频采集,并给出实现的核心代码。
[关键词]视频采集VFW Di rectShow SDK 中图分类号:TP391 文献标识码:A 文章编号:1671--7597(2008)1110087--02
随着计算机网络和多媒体计算的迅猛发展,许多应用系统,如可视电 话系统、电视会议系统、远程I监控系统等要求能够实时获取视频信息;同 样,若想进行图像处理也必须进行视频流捕获和单帧图像采集。因此,如 何实时获取视频数据使成为麻用中的垂要环节和关键前提[2]。
频流
capCaptureSequenceNoFile(hWnd):
}
设置调用函数:
LRESULT CALLBACK FrameCallbackProc(删D
hWnd,LPVIDEOHDR
IpVHdr) {
//采集到的视频数据放在VIDEOHDR数据块结构中 //这样就可以在这里捕获每帧的视频数据作进一步的处理。如显示 在新的窗口或者发送到远端计算机,或//进行相应的图像处理。 }
接口,函数主要是利用CoCreatelnstance方法建、-Y IGraphBui Ider.
ICaptureGraphBuiIder2的实例,并使用QueryInterface方法查询 系统是否支持所选的组件衫
hr=GetDeviceInterface0: //把采集图表与过滤器图表联系在一起
IIr=m-pcaptureGraphBui Ider一>SetFi 1 terGraph(m pGraphBui Ider): //主要使用ICreateDevEnum接口提供的CreateClassEnumerator方
l 源过滤嚣『_叫转换过滤器 卜叫渲染过滤器 I 1.。........................_J I......................一1......................_J
图2 Di rectShow过滤器连接示意图
下面介绍用DirectShow来进行实时视频采集需要的一些函数和COM编 程的方法。
万方数据
CapSetCallbackOnStatus(hWnd,(FARPROC)StatusCallbackProc: //在采集窗口发生改变时被调用
CapSetCalIbackOnFrame(hWnd,(FARPROC)FrameCallbackProc):
//在每采集完一帧时调用 capDriverConnect(hWnd。O)://窗口与驱动设备相连接 capOverlay(hWnd,TRUE);11将显示设置成Overlay模式,开始捕获视
用IGraphBuiIder接口来建立过滤器图表管理器,建立好管理器之 后,可以调用IGraphBuilder::AddFilter方法将自己需要的过滤器加入到
过滤器图表管理器中。IGraphBuilder::QueryInterface是查询选定的过滤
器组件是否支持某个特定的接口。
用ICaptureGraphBuilder2接口提供的方法来建立采集图像。其中与
信息。
CoCreateInstance这个Win32API函数创建并返回COM组件的一个实
例,将开发人员自己设定的对象与COM组件联系起来。如下面的代码:
IGraphBuilder *m』raphBuilder:
hr---CoCreateInstance(CLSID—FilterGraph。N【JU。CLSCTX INPR0c, IID—IGraphBuilder,(void料)&醚pGraphBui Ider): Colnitialize和CoUninitialize,在使用COM库前必须使用
叵圃
Ⅵ置裂 信息
科掌
■薹》i
和媒体流的调度,应用程序通过它来控制Filter Graph。一般情况下,一
个完整的过滤器图表以一个源过滤器开始(Source fiIter),一个递交过 滤器(renderer filter)结束,如果已知一个源过滤器,过滤器图表管理
器会根据源过滤器的类型自动生成相应的Filter Graph。它的过滤器连接
ቤተ መጻሕፍቲ ባይዱ
LRESULT CALLBACK ErrorCal 1backProc(HWND nErrID.LPSTR lpErrorText)
{//在这里作相应的处理}
hWnd,int
LRESULT CALLBACK StatusCallbackPrOC(H骱4D hWnd,int nID,LPSTR
IpStatusText) {//在这里作相应的处理} 二、基于DirectShow的实时视频数据采集
上
注册系统回调函数
上
获取捕获窗【1的参数设置
上
I
与视频采集设备连接
上
I捕获图像到缓存或文件并进行相应处理
上
l中止视频捕获并断开与采集设备的连接
提供了良好的平台[1]。
图1 VFW实现视频捕获的流程
DirectShow是位于DirectX(DirectDraw,DirectSound,Di rect3D等)
视频采集有关的方法有m pCaptureGrapbJ3uilder::SetFiitergraph,指定
一个过滤器图表来生成采集图像。
m』aptureGraphBui Ider::RenderStream将源程序和接收过滤器连接
起来。
使用IVideoWindow接口来控制显示视频的窗口的属性,如高度位置等
基础之上的媒体层。它主要提供播放本地文件或Internet服务器l:的多媒
体数据,以及从视频采集譬等硬件设备中捕获多媒体流的功能。它能够播
放多种压缩格式的视音频文件(或流),包括肝EG,Quick Time,AVI,WAV以 及基于VFW和WI)M的视音频捕获流。DirectShow的实质是以“过滤器( Filters)”组件为核心的模块化系统。用各种过滤器构造成不同的过滤器 图表(Filter Graph)就可以完成回放采集等不同任务,一个称为“过滤 器图表管理器”(Filter Graph Manager)的组件负责Filter之间的连接
一、基于VFW的实时视频数据采集 VFW(Video For Windows)是Microsoft推出的关于数字视频的一个软 件包,该软件包能使应用程序数字化并播放从传统模拟视频源得到的视频 剪辑。VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数 据量大的问题,需要对数据进行压缩。软件包引进了一种,qAVI的文件标 准,该标准未规定如何对视频进行捕获。压缩仪规定视频和音频该如何存 储在硬盘上,在AVI文件中交替存储视频帧和与之相匹配的音频数据。 V聃给程序员提9t,vBx和AVICap窗口类的高级编程工具。使程序员能通过发 送消息或’发|苘!属性来捕获、播放和编辑视频剪辑。Windows98以上系统都自 动安装配置视频所需的组件,如设备驱动程序,视频压缩程序等[3]。 vFW上要由以F6个模块组成: AVICAP.DLL:处理视频捕获。为AVI文件输入输出和视频、音频设备 驱动程序提供一个编程接u。 MSVIDEO.DLL:用DrawDib函数处理屏幕卜的视频操作。‘ MCIAVI.DRV:包含对VFW的MCI命令的解释器。 AVIFILE.DLL:支持由标准多媒体I/O函数提供的更高的命令来访问 AVI文件。 ICM:压缩管理器,管理用于视频压缩/解压的编码器。 ACM:音频压缩管理器,管理用于波形音频压缩/解压的编解码器。 在这里介绍采用窗口类AVICap实现视频捕获的方法。AVlCap支持实时 的视频流捕获和单帧捕获并提供对视频源的控制。它能直接访问视频缓冲 区,小需要生成中间文件,实时性很强,效率很高[4]。同时,它也可将视 频捕获到文件。视频数据的实时采集j#要是通过调用AYlCap32.d11创建 AVICAP窗口类,由AVICAP窗口类中的消息、宏雨数、结构以及回调函数来完