基于Windows的几种视频采集方法设计与实现
基于 DirectShow 和 WPF 的实时视频图像采集与处理系统设计与实现

基于 DirectShow 和 WPF 的实时视频图像采集与处理系统设计与实现武凤翔【期刊名称】《计算机应用与软件》【年(卷),期】2015(000)003【摘要】Currently,the main problems of video image are the low execution efficiency and difficult to realise real-time performance when processing large amounts of data.In light of this,we use DirectShow technology to well solve the problems.The video data in RAM can be directly processed based on DirectShow so that the bottleneck of hard disk data reading is stepped across.In this paper we design the real-time video image acquisition system,which uses DirectShow and WPF as the software platform,and includes video image capture and display module,image browsing and processing module,and image storage and management module.Experimental results show that the method can achieve good effect when applying in real-time video image acquisition,and is feasible in engineering application.%当前视频图像的主要问题是当处理的数据量大时,执行效率低,很难实现实时性。
WDM 视频捕获介绍

WDM 视频捕获介绍-孙涛-摘要:该文主要提供一些在Win98,win2K及以上操作系统中,进行Windows Driver Model(WDM)视频捕获的相关知识介绍。
如果你对WDM视频捕获感兴趣,可以来看看这些东西。
欢迎到我的博客/suntaoznz看其他文章!目录Windos下视频捕获简史 (1)WDM和视频捕获 (1)VfWWDM Mapper (2)WDM 视频捕获结构 (2)DirectShow应用程序 (3)DirectShow Filter Graph (3)WDM数据流 (4)视频捕获Minidrivers (4)Pins, Streams, Formats (4)视频流命名约定 (5)DirectShow 视频捕获的接口和属性 (5)捕获数据流类型 (6)流输出数据格式 (6)结束语Windos下视频捕获简史VFW(Video For Windows)1.0版本在1992年11月发布,它是为在Windows3.1下将电影最优化地捕获到磁盘上而发布的。
从那以后,视频捕获技术就越来越受到关注了。
VFW技术同样受到了很多批评,它捕获的数据保存到磁盘上会占用大量磁盘空间,每秒数据量超过20M,同时需要大量的客户端支撑软件,VFW体系架构上的不足在视频会议应用上和PC/TV应用上被暴露无遗,这样就要求一种新的视频捕获技术来弥补这些不足。
VFW的体系结构缺乏为视频会议,电视浏览,视频区域捕获和VBI(Vertical Blanking Interval)数据流提供强而有效的支持。
一些视频卡等设备开发商在设计自己的产品时,针对这些缺陷,对VFW进行了功能扩展。
由于没有统一的标准,我们的应用程序在使用这些扩充的功能时,就必须要写一些基于特定硬件的代码。
这就意味着当要改变捕获驱动程序时,就必须要对显卡的驱动程序进行修改。
WDM和视频捕获WDM 视频捕获设计就是为了来解决VFW体系结构中存在的这些问题。
屏幕录制工具(Windows应用使用C开发)

屏幕录制工具(Windows应用使用C开发)在数字化时代,屏幕录制工具已经成为许多人日常工作和学习中必不可少的工具之一。
屏幕录制工具可以帮助我们捕捉屏幕上发生的活动,并将其转换为视频或GIF文件,方便我们进行教学、演示、问题解答等活动。
本文将介绍一款基于C语言开发的Windows应用屏幕录制工具,旨在提供高效、稳定且易于使用的屏幕录制体验。
一、功能特点1. 屏幕捕捉:该工具可以捕捉屏幕上发生的所有活动,包括鼠标点击、键盘操作、窗口切换等,保证录制的内容完整。
2. 视频编码:为了提高录制效率和视频文件大小,该工具内置了高效的视频编码算法,可以对捕捉到的屏幕活动进行实时编码,并生成高质量的视频文件。
3. 录制控制:用户可以通过简单的界面操作来控制录制的开始、暂停和停止,确保录制过程的控制灵活性。
4. 音频录制:不仅可以捕捉屏幕活动,该工具还支持录制系统声音和麦克风声音,确保录制的视频具备更丰富的音频内容。
5. 截图功能:在录制过程中,用户还可以进行即时截图,捕捉特定瞬间,以便后续使用。
二、技术实现该屏幕录制工具基于C语言开发,并利用Windows操作系统提供的API和库来实现功能。
以下是几个核心实现:1. 屏幕捕捉:利用Windows GDI库中的函数,可以获取屏幕上的图像数据。
通过对屏幕坐标系的计算和像素数据的读取,可以实现对屏幕图像的捕捉。
2. 视频编码:该工具使用C语言调用FFmpeg库来实现视频编码功能。
FFmpeg是一个开源的多媒体处理库,提供了一系列编解码器和格式转换的功能,能够满足快速编码和高质量输出的需求。
3. 音频录制:利用Windows操作系统提供的API,可以实现对系统声音和麦克风声音的录制。
通过对音频设备的初始化和数据采集,可以获取到音频数据,并进行保存或编码处理。
4. 用户界面:通过C语言的图形界面库,可以实现一个简洁美观的用户界面,提供录制控制按钮、选项设置等功能,方便用户进行操作和管理。
Windows平台下视频捕捉的几种实现方法

中 图 法 分 类 号 :P 9 T 31 文 献标 识 码 : A 文 章 编 号 :6 3 1 8 ( 0 6) 2 0 9 — 3 17 — 9 0 2 0 0 — 0 6 0
Vi o m p e so 控 制 压缩 品质 de Co r s in
收稿 日期 : 0 5 1 0 2 o 一l — 7
基 金 项 目 : 庆 市 教 委 资助 项 目( 3 4 3 重 0 10 )
作者 简 介 : 显 荣 (9 1 ) 男 , I 都 人 , 师 , 士 。 刘 1 7一 , 四川 成 讲 硕
Vd a iC p窗 口完成视 频捕 捉 的过 程如 图 1所示 。
创 建 视 频 捕 捉 窗
发 展 , 们经 常要 在计算 机 上 处理视 频 信息 , 建筑 人 如
物 视频 监控 、 物体 运动 检测 、 胞计 数 、 细 车牌识 别 等 。 所有 这些 工作 都要 在 已经得 到 视频 信息 的基 础上 才 能 完成 . 因此 视频 捕 捉 是完 成 多 媒 体 开发 的关 健前 提, 应该 为人 们提 供一 种方 便视 频 的捕 捉技术 , 人 让
・
9 ・ 6
维普资讯
刘显荣: no Wid ws平 台下视 频 捕 捉 的 几种 实现 方 法
2 Di c Sh w r t o e
D rcS o 也 是 微 软 公 司 提 供 的 一 套 在 i th w e
在使 用 D rc hw实 现视 频信 号 的捕 捉时 也是 i t o eS
使 用 过 滤 器 图 来 完 成 的 ,这 种 类 型 图 叫 捕 捉 图 (a tr rp ) C pue a h。根据 可提供 的硬件设 备 和数据 的种 G
基于DirectShow视频及图片捕获软件的开发

我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等。
DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。
DirectShow为多媒体流的捕捉和回放提供了强有力的支持。
运用DirectShow,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。
它广泛地支持各种媒体格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒体数据的回放变得轻而易举。
另外,DirectShow还集成了DirectX其它部分(比如DirectDraw、DirectSound)的技术,直接支持DVD的播放,视频的非线性编辑,以及与数字摄像机的数据交换。
更值得一提的是,DirectShow提供的是一种开放式的开发环境,我们可以根据自己的需要定制自己的组件。
笔者使用visual studio 2005 来开发了基于DirectShow的视频捕获软件,并用开发的软件对映美精相机进行了测试。
本软件不但可以实现对相机的视频捕获,而且还可以抓取图像帧。
软件运行时自动搜索所连接的相机,预览后可以对相机参数进行设置。
下面是软件的主界面。
预览视频后可以对视频格式和图像参数进行设置。
开始预览时,捕获的视频是黑白的,我们将颜色空间设置为UYVY即可捕获彩色视频。
下面是捕获的一帧图像,图像质量虽然没有映美精自带的软件效果好,但已经实现了所需各项基本功能,接下来的工作将会进一步提高软件性能。
另外我们还可以捕获视频,点击“捕获视频”按钮,输入要保持的文件名,注意要以.avi后缀结尾,点确定就开始捕获视频。
从我们开发的软件可以看到,映美精的相机能够很好的支持DirectShow的驱动,我们的软件对映美精相机的识别是如此的容易。
接下来我们将继续开发基于其它驱动的图像捕获软件,为最终实现在一个软件中识别各种相机而努力。
DirectShow视频采集方案

流媒体处理技术以其复杂性和技术性一直受到人们的关注。随着网络技术的不断发展,流媒体在网络上得到了广泛地应用。如何能够简单、有效地进行流媒体处理,已成为一个焦点问题。为此,Microsoft推出了DirectShow,DirectShow是Microsoft推出的基于Windows平台的流媒体处理开发包,它与DirectX一起发布。DirectShow对流媒体的捕捉、回放提供了强大的支持,使用它还可以在基于WDM驱动的采集卡上进行数据捕捉。本节将介绍有关DirectShow的相关知识。
while (pEnumPins->Next(1,&pOutpin,NULL)==S_OK)
{
pOutpin->QueryDirection(&pDir);
if (pDir==dir)
{
return pOutpin;
}
}
return 0;
}
用户可以按下面的方式获得某个过滤器的输入、输出引脚。
IPin * pComOut,*pComIn ;
在开发DirectShow应用程序时,通常需要设计一个过滤图表(Filter Graph),向过滤图表中添加相应的过滤器,最后连接过滤器的引脚就完成了功能的设计。例如,实现一个简单的视频预览功能,需要向过滤图表中添加一个视频捕捉源过滤器和一个Video Renderer过滤器,将视频捕捉源过滤器的输出引脚与Video Renderer过滤器的输入引脚相连就可以了。而在程序中只需要按照设计过滤图表的捕捉添加过滤器并连接过滤器引脚就可以了。在连接过滤器引脚时需要注意:只能是输出过滤器引脚与输入过滤器引脚相连,两个输出过滤器或两个输入过滤器引脚是不能相连的。
为了在程序中使用DirectShow,需要单独安装DirectX,当前DirectX的最新版本为9.0,即DirectX9.0,用户可以从Microsoft的官方网站上免费下载。在安装DirectX之后,程序中需要引用“dshow.h”头文件,并导入“Strmiids.lib”库文件和“quartz.lib”库文件才可以使用DirectShow。代码如下:
基于Windows平台的视频捕捉技术研究

中 图分 类 号 T 2 2 P4
文献标 识 码 A
基于 Wi o s n w 平台的视频捕捉技术研究 d
张艳 珍 . 巩 玉 匡 , 欧 宗 瑛 , 袁 野
( 大连 理 ] 大学 机 械 工 程 学 院 CA : D&CG研 究所 , 大 连 16 2 ) 10 3
摘
要 : 视 频 图像 的 采 集 和 处 理 在 现 代 多媒 体技 术 [ P占重要 的 地 位 介 绍 了在 Wi o s 境 下 .把 C D摄 像 头 n w 环 d C
ia e a r dsu sdnti p pr m g d t ae i se i hs a e.Amo igoj td tcinss mu igtitcnq e a b e mpe ne n u it a c vn be s eet t s h s eh iu h s eni lmetdadp tno c o ye n
式 及 扫 描 速 度 分 为 3 : 1 是 重 复 扫 描 , 隔 取 样 类 第 粪 间
的 方 法 , 数 据 采 集 的速 率 为 几 十 k z 第 2 方 式 是 其 H: 种 由D MA控 制 器 把 AD转 换 的 数 据 传 送 到 外 部 存 储 器 . 1 待 所 有 的数 据 存 储 完 后 再 由 计 算 机 取 走 , 速 度 盯达 其 儿 k z 第 3 是 采 用 帧 存 储 方 式 , H 种 由硬 件 电 路 以 很
维普资讯
第2 3卷 第 3 期
Vo. 1 23 No 3
计算机工程与设计
COM P UTE E R NGI ERI G NE N AND DES GN I
20 0 2正 3月
M a 20 2 r 0
应用Video for Windows进行视频捕捉的开发

来 获得 图像 ,这 也 是 人 们说 的 扫 描 技 术 。 这种 方 法也 可用 开 发 工 具 中带 有 的 O E控 件 实 现 。 L 优 点是 开 发者 实 现起 来 比较 容 易 ,缺点 是 在捕 获 图像 时 速 度较 慢 ,只 能 用 与 简 单 的单 帧 图 像
的捕 捉 ,应 用 范 围较 窄 。
音频 该如 何存 储 在 硬 盘 上 ,以及 在 A I 件 中 V文 交替 存 储 视 频 帧 和 与 之 相 匹 配 的 音 频 数 据 。 V w 使程序 员能 通过 发 送 消 息或 设 置 属 性 来捕 F 获 、播 放 和 编辑 视 频 剪 辑 。在 Widw no s系统 目 录 中 ,已存 在 V w 的所 需 的动 态连 接 文件 以及 F 视 频所需 要 的驱 动 、组件等 。 V w 主要 由 以下 6个 模块组 成 : F
1 引 言 .
文 件 的压缩 比。 缺 点 :使 用 起 来 稍 嫌 麻 烦 。 经 实践证 明 ,推荐 使用 V w 的方 法 。下 面详 细 介 F
绍 V W。 F 2 .V W 概 述 F
目前 ,许 多领 域 中 都 在 使 用 计 算 机 的视 频 技术 ,例 如 :银行 的监 控 系统 ,网络 视频 会 议 , 电信 的可 视 电话 ,教 育 、公 安 行 业 的数 字 化 照 片等 等 ,都 应用 了 视 频 采 集 技 术 。 目前 ,软 件 开发人 员 大 都 采 用 直 接 调 用 T a w i 术 或 使 用 n技 Vdof no s的 办 法 。下 面 来 介 绍 一 下 这 ie rWidw o
使 用 摄 像 头 或 数 码 相 机 ,通 过 视 频 采 集卡 ,使 用 Vdofr no s 术将 镜 头 内容 捕 捉 模 拟 视 频 信 息 转 i dw 技 e o Wi
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Windows的几种视频采集方法设计与实现作者:李钦存王春明段海龙来源:《硅谷》2008年第21期[摘要]分别介绍在Windows操作系统下的三种实时视频数据采集的方法,即基于VFW的实时视频采集,基于DirectShow的实时视频采集和基于视频卡附带软件开发工具箱(SDK)的实时视频采集,并给出实现的核心代码。
[关键词]视频采集 VFW DirectShow SDK中图分类号:TP391文献标识码:A 文章编号:1671-7597(2008)1110067-02随着计算机网络和多媒体计算的迅猛发展,许多应用系统,如可视电话系统、电视会议系统、远程监控系统等要求能够实时获取视频信息;同样,若想进行图像处理也必须进行视频流捕获和单帧图像采集。
因此,如何实时获取视频数据便成为应用中的重要环节和关键前提[2]。
一、基于VFW的实时视频数据采集VFW(Video For Windows)是Microsoft推出的关于数字视频的一个软件包,该软件包能使应用程序数字化并播放从传统模拟视频源得到的视频剪辑。
VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。
软件包引进了一种叫AVI的文件标准,该标准未规定如何对视频进行捕获,压缩仅规定视频和音频该如何存储在硬盘上,在AVI文件中交替存储视频帧和与之相匹配的音频数据。
VFW给程序员提供VBX 和AVICap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。
Windows98以上系统都自动安装配置视频所需的组件,如设备驱动程序,视频压缩程序等[3]。
VFW主要由以下6个模块组成:AVICAP.DLL: 处理视频捕获,为AVI文件输入输出和视频、音频设备驱动程序提供一个编程接口。
MSVIDEO.DLL: 用DrawDib函数处理屏幕上的视频操作。
MCIAVI.DRV: 包含对VFW的MCI命令的解释器。
AVIFILE.DLL: 支持由标准多媒体I/O函数提供的更高的命令来访问AVI文件。
ICM:压缩管理器,管理用于视频压缩/解压的编码器。
ACM:音频压缩管理器,管理用于波形音频压缩/解压的编解码器。
在这里介绍采用窗口类AVICap 实现视频捕获的方法。
AVICap支持实时的视频流捕获和单帧捕获并提供对视频源的控制。
它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高[4]。
同时,它也可将视频捕获到文件。
视频数据的实时采集主要是通过调用AVICap32.dll创建AVICAP窗口类,由AVICAP窗口类中的消息、宏函数、结构以及回调函数来完成。
VFW的视频采集功能函数主要包括捕获视频流至AVI文件(capCaptureSequence)、捕获视频流至缓存(capCaptureSequenceNoFile)、捕获视频流的具体帧至AVI文件(cap-CaptureSingleFrame)、本地预览(capPreview/capOverlay)和捕获单帧预览(capGrabFrame/cap- GrabFrameN-oStop)等。
VFW还提供了回调函数,允许应用程序精确控制视频流的捕获、检测错误、监控状态变化,以及在捕获两帧数据的空隙和每捕获新帧时对实时视频数据进行处理。
具体的采集流程如图1所示。
采集的核心代码[5]:{HWND hWnd=capCreateCaptureWindow(“视频捕获窗口”,WS_CHILD|WS_VISIBLE,//设置指定窗口的风格Rect.left,Rect.top,Rect.Right-Rect.left,Rect.bottom-Rect.top,//设置显式帧窗口的大小NULL,NULL);//创建捕获窗口并将获取的句柄赋予hWnd//注册系统回调函数CapSetCallbackOnError(hWnd,(FARPROC)ErrorCallbackProc;//在采集过程中出错时被调用CapSetCallbackOnStatus(hWnd,(FARPROC)StatusCallbackProc;//在采集窗口发生改变时被调用CapSetCallbackOnFrame(hWnd,(FARPROC)FrameCallbackProc);//在每采集完一帧时调用capDriverConnect( hWnd ,0);//窗口与驱动设备相连接capOverlay(hWnd,TRUE);//将显示设置成Overlay模式,开始捕获视频流capCaptureSequenceNoFile(hWnd);}设置调用函数:LRESULT CALLBACK FrameCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr){//采集到的视频数据放在VIDEOHDR数据块结构中//这样就可以在这里捕获每帧的视频数据作进一步的处理。
如显示在新的窗口或者发送到远端计算机,或//进行相应的图像处理。
}LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText){//在这里作相应的处理}LRESULT CALLBACK StatusCallbackProc(HWND hWnd,int nID,LPSTR lpStatusText){//在这里作相应的处理}二、基于DirectShow的实时视频数据采集DirectShow是微软根据对来自许多不同的媒体资源的流视频和音频的需要,开发的一个解决办法,它设计提供所有高质量的视频回放以及捕获特性。
DirectShow还提供了广泛的支持结构模型,这种模型可以将新的媒体类型轻松地添加到自己的结构中。
DirectShow是一种基于COM技术的多媒体编程接口,它给出了一种全新的多媒体数据处理模型,并封装了采集、压缩和解压缩等一系列算法,为视频监控、视频会议等多媒体应用系统的开发提供了良好的平台[1]。
DirectShow是位于DirectX(DirectDraw,DirectSound,Direct3D等)基础之上的媒体层。
它主要提供播放本地文件或Internet服务器上的多媒体数据,以及从视频采集卡等硬件设备中捕获多媒体流的功能。
它能够播放多种压缩格式的视音频文件(或流),包括MPEG,Quick Time,AVI,WAV以及基于VFW和WDM 的视音频捕获流。
DirectShow的实质是以“过滤器(Filters)”组件为核心的模块化系统。
用各种过滤器构造成不同的过滤器图表(Filter Graph)就可以完成回放采集等不同任务,一个称为“过滤器图表管理器”(Filter Graph Manager)的组件负责Filter之间的连接和媒体流的调度,应用程序通过它来控制Filter Graph。
一般情况下,一个完整的过滤器图表以一个源过滤器开始(Source filter),一个递交过滤器(renderer filter)结束,如果已知一个源过滤器,过滤器图表管理器会根据源过滤器的类型自动生成相应的Filter Graph。
它的过滤器连接示意图如图2所示。
值得说明的是,开发人员在开始编码前,可以使用DirectX SDK提供的GraphEdit应用程序来对选用的过滤器进行测试,按照系统需求选用的过滤器图表能否工作,在GraphEdit程序中就能够测试出来,而且可以不必编写一行代码。
下面介绍用DirectShow来进行实时视频采集需要的一些函数和COM编程的方法。
用IGraphBuilder接口来建立过滤器图表管理器,建立好管理器之后,可以调用IGraphBuilder::AddFilter方法将自己需要的过滤器加入到过滤器图表管理器中。
IGraphBuilder::QueryInterface是查询选定的过滤器组件是否支持某个特定的接口。
用ICaptureGraphBuilder2接口提供的方法来建立采集图像。
其中与视频采集有关的方法有m_pCaptureGraphBuilder::SetFiltergraph,指定一个过滤器图表来生成采集图像。
m_pCaptureGraphBuilder::RenderStream将源程序和接收过滤器连接起来。
使用IVideoWindow接口来控制显示视频的窗口的属性,如高度位置等信息。
CoCreateInstance这个Win32API函数创建并返回COM组件的一个实例,将开发人员自己设定的对象与COM组件联系起来。
如下面的代码:IGraphBuilder*m_pGraphBuilder;hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void **)& m_pGraphBuilder);CoInitialize和CoUninitialize,在使用COM库前必须使用CoInitialize来初始化,使用完毕后用CoUninitialize来释放。
采集的核心代码[5]:HRESULT CaptureVideo(){HRESULThr;IBaseFilter*pBaseFilter=NULL;ImediaControl*m_pMediaControl;IGraphBuilder m_pGraphBuilder;ICaptureBuilder2 *m_pCaptureGraphBuilder;IVideoWindow *m_pViewWindow;//初始化COM库CoInitialize(NULL);/*使用自定义函数GetDeviceInterfaces()获取DirectShow提供的接口,函数主要是利用CoCreateInstance方法建立IGraphBuilder,ICaptureGraphBuilder2的实例,并使用QueryInterface方法查询系统是否支持所选的组件*/hr=GetDeviceInterface();//把采集图表与过滤器图表联系在一起Hr=m_pCaptureGraphBuilder->SetFilterGraph(m_pGraphBuilder);//主要使用ICreateDevEnum接口提供的CreateClassEnumerator方法来对系统已有的采集设备进行枚举,找到可供使用的设备。
hr=FindCaptureDevice(&pBaseFilter);//将上一步找到的视频过滤器加入到过滤器图表管理器中hr=m_pGraphBuilder->AddFilter(pBaseFilter,L"Video Capture");//用RenderStream将视频管理器和预览管理器连接起来hr=m_pCattureGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pBaseFilter,NULL,NULL); //将采集到的视频图像保存到文件中Hr=m_pCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,L”c:\example.avi",&ppf,NULL);//设置视频窗口的样式hr=SetupVideoWindow();//开始预览采集到的视频数据hr=m_pMediaControl->Run();return S_OK;}三、基于视频设备附带的SDK的实时视频数据采集有的开发工作会在特定厂家提供的视频采集卡上来进行,这时就可利用厂家提供的软件开发工具箱SDK来开发应用程序。