用DirectShow实现视频捕捉

合集下载

基于DirectShow的DV视频实时采集系统的实现

基于DirectShow的DV视频实时采集系统的实现

基于DirectShow的DV视频实时采集系统的实现
薛勇
【期刊名称】《电脑知识与技术》
【年(卷),期】2009(005)024
【摘要】随着计逄机(技)术和视频编码技术的发展,现在DV摄像机已越来越多地进入了大众生活,特别是在教育教学中得到了广泛的应用,迫切需要把DV摄像机中的DV数据采集到计算机中进行浏览和处理为此,笔者在Visual C++6.0环境下,运用DirectShow编程技术,编写了一个DV视频实时采集系统,可以实现DV视频的回放和数据的采集,具有良好的实时性、可扩展性.
【总页数】3页(P6768-6770)
【作者】薛勇
【作者单位】江苏技术师范学院,信息与教育技术中心,江苏,常州,213001
【正文语种】中文
【中图分类】TP37
【相关文献】
1.基于DirectShow RTMP协议的视频采集传输系统的设计与实现 [J], 孙盼;康维新
2.基于ADV7180的视频图像实时采集系统的设计 [J], 蔺志强;孟令军;彭晴晴
3.基于DVB信号的实时采集编码系统设计与实现 [J], 陈华凌;张仁政
4.基于DirectShow的网络视频点播系统的设计与实现 [J], 雷文礼;任新成;张栋;高瑛
5.基于 DirectShow 和 WPF 的实时视频图像采集与处理系统设计与实现 [J], 武凤翔
因版权原因,仅展示原文概要,查看原文内容请购买。

基于DirectShow视频及图片捕获软件的开发

基于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的驱动,我们的软件对映美精相机的识别是如此的容易。

接下来我们将继续开发基于其它驱动的图像捕获软件,为最终实现在一个软件中识别各种相机而努力。

C++摄像头视频捕捉程序

C++摄像头视频捕捉程序

Visual C++编程实现摄像头视频捕捉摘要:本文主要讲述用Directshow进行视频捕捉(捕捉静态图像)的编程思路,并提供针对摄像头编程的一个视频捕捉类CcaptureVideo和一个示例。

前言DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起发布。

DirectShow为多媒体流的捕捉和回放提供了强有力的支持。

用DirectShow开发应用程序,我们可以很方便地从支持WDM驱动模型的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。

DirectShow是基于COM的,为了编写DirectShow应用程序,需要了解COM客户程序编写的基础知识。

DirectShow提供了大量的接口,但在编程中发现还是不够方便,如果能构建一个视频捕捉类把常用的一些动作封装起来,那么就更方便了。

编程思路为了更加容易建立视频捕捉应用程序,DirectShow提供了一个叫做Capture Graph Builder的对象,Capture Graph Builder提供IcaptureGraphBuilder2接口,该接口可以建立和控制Capture Graph。

建立视频捕捉程序,必须首先获取并初始化IcaptureGraphBuilder2接口,然后选择一个适当的视频捕捉设备。

选择好设备后,为该设备创建Capture filter,然后调用AddFilter 把Capture filter添加到Filter Graph。

如果仅仅希望用摄像头来进行实时监控的话,只需要在上面的基础上调用ICaptureGraphBuilder2::RenderStream就可以了:ICaptureGraphBuilder2 *pBuild; // Capture Graph Builder//省略初始化部分代码IBaseFilter *pCap; // Video capture filter.//省略初始化和添加到Filter Graph部分代码pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);DirectShow提供了一个捕捉静态图像的方法:使用Sample Grabber filter。

DirectShow视频采集方案

DirectShow视频采集方案
2.3 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。代码如下:

基于DirectShow的多线程视频采集系统

基于DirectShow的多线程视频采集系统

立体视觉系统是拟人机器人的重要组成部分 ,是近年来
在 Widws n o 平台上处理各种格式的媒体文件 的回放、音视频 采集等高性能要求的多媒体应 用, 提供 了完整的解决方案 。 】
Di cS o 是基于 C M 的应 用系统 ,其核心是被称 为过滤 r th w e O 器的插件模块 。如图 1 所示 ,中央部分是 Di cS o r th w系统 , e 位于 应用层中。过滤器在过滤器图表中配置 ,通过过 滤器 图 表管理器 检查 过滤器之 间的连接 ,并且控制过滤器之 间的数 据流动。 过滤器可以大致分 为 3类 :源过滤器 ,负责获取数据 ; 转换过滤器 , 负责数据的格 式转换 , 然后将数据继 续往下传 ;
维普资讯
第 3 卷 第 2 期 2 0
正2 3

计Leabharlann 算机工程
20 年 1 06 0月
Oc o e 0 6 tb r 2 0
2D
Co p t rEn i e r n m u e gn e ig
多媒 体技 术 及应 用 ・
文章编号:l o 32( o) -o2— 3 文献标识码: 0 — 48 o6 o一2l 0 0 2 2 A
X ON Ch o L y n , I N X a fn I G a , U Qio g T A ioa g
( p rme t fE e to i g n eig, u a i est, h n h i2 0 3 De at n lcr ncEn ie rn F d nUn v ri S a g a 0 43 ) o y
的一个 研究热点 。如何 同步采集机器人 “ 左右眼”的图像 信 息 ,是实现机器 人拟人视觉 的前提条件 。目前常 用视频采集

基于DirectShow的无线音视频采集与传输系统的研究

基于DirectShow的无线音视频采集与传输系统的研究
通 信 技 术
勰字 术 f 技 数

基于 D r S o i c h w的无线音视频采集与传输系统 et 的研究
郑 晓 曦 刘 维
( 邑大学计算机 学院 广东江门 592) 五 200
摘 要 : 中 , 对 基 f3 G线 网络 的视 频 会议 系统 的应 用 , 用Dieth w 架构 , 计音 视频 数 据 的采 集 、 文 针 -G: 采 rcS o 设 编码 、 网络 传输 、 解码 及 回放 的解 决方 案 , 并根 据RT / CP i P RT D, K原理 , 实现 音视 频 的 同步 实时传 输 。 此基 础 上 实现 了无 线音 视频 采 集与 传输 系统 。 在
D rcS o iet h w是Mirsf 了能够简单 、 效地 进行流媒体处 coot 为 有 理 而 推 出 的一 个基 于Wid ws 台 的流 媒 体 处理 开发 包 。 no 平 它对 流 媒 体 的捕 捉 、 回放提供 了强 大的 支持 , 使用 它还 可 以在 基于w DM ( n o e i d1 Wid wsD vc Mo a) e 驱动的各种采集卡上进行数据捕 捉。 基 于它 的优 点我们采用D rcS o ieth w进行视 频采集。 Di cS o r th w主要 由过 滤器 图表 ( ie rp ) e F trG a h 构成 , l 过滤器 图 表 中包含 了各种F l r这些F trg ie , t l ie ̄够按 一定顺序连接在一起 , 构 成一 条流水线 , 最后交 由Fl rGrp n g r i e a h Ma a e统一控制 。 t 过滤器 根据 功能不同分 为三类_:1 l() I 源过滤器(o reFle) S uc i r, t 它 引入 数据到过滤器 图表 中, 数据 来源可 以是文件 、 网络、 照相机 等。 获取 的数据传输至 下一 级过滤器 。2变 换过滤器( a so m () Trn f r F le s, itr )主要 负责数据 的格 式转换 。3 渲染过滤器 ( n e i g () Re d rn Fl r, ie)渲染 过滤器在过滤器 图表里处 于最 后一级 , t 实 现 . D rcS o i th w采用wD e M驱动模型进行 视频捕捉 。 M是 纯3 WD 2 位模型 , 对于不同的设备具有统一 的结构 , 最重 要的是D rc h w i t o eS 与WDM的紧密结合 , 系统 核心提 供了基于WD 在 M的驱动程序 的 过 滤 器 和 接 口 ,大 大 提 高 了 视 频 捕 获 的速 度 和 质 量 。 由 DrcS o i t h w对视频捕获、 e 回放提供 了强大 的支持 , 大大增强 了系统 对不同硬件的通用性和适应性。 因此, i cS o 发环境中 , 在D r th w开 e 通

基于DirectShow的多摄像头视频采集

基于DirectShow的多摄像头视频采集

基于DirectShow的多摄像头视频采集1.为什么使用DirectShow笔者使用的是两个USB摄像头,单摄像头视频采集使用OpenCV的VideoCapture类没有问题,但是双摄像头就有问题,一个正常,另外一个采集不到信息,显示一片灰色。

网上有种解决方法是逆序打开摄像头,结果两个窗口是可以采集到视频信息,但是竟然是同一个摄像头的视频信息,无奈的只能使用DirectShow采集多摄像头视频信息。

先看看什么是DirectShow:DirectShow 是 DirectX 的组件之一, DirectX 软件开发包是 Microsoft 提供的一套在 Windows平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口。

这其中,DirectShow提供了应用程序从适当的硬件中捕捉和预览音、视频的能力。

数据源包括: VCR、 Camera、 TV Tuner、 Microphone 或其他的数据源。

应用程序可以立刻显示捕捉的数据(预览),或是保存到一个文件中。

摄像头采集信息常用的软件AMCap就是基于DirectShow SDK编写的。

查阅一下官方文档,感觉好难的样子,难道要新学一门“快过时”的技术吗?幸好于仕琪老师写了一个CCameraDS类,可直接返回IplImage,使用方便。

2.在VS2010中配置DirectShow并采集双目摄像头视频下载DirectShow相关文件,我已经共享在百度云盘,点击下载。

解压以后copy到D:\opencv里(放在这里为了管理方便)在解决资源管理器中的项目名称处右键\属性\配置属性\VC++目录,引用目录中添加DirectShow的include文件夹,我添加的是D:\opencv\DirectShow\Include在引用目录下面有一个库目录,添加DirectShow的Lib文件夹,我添加的是D:\opencv\DirectShow\Lib;下载CCameraDS类相关文件,点击下载。

基于DirectShow的通用音视频采集方案

基于DirectShow的通用音视频采集方案

采集设备 的 Fl r ie 创建成 功后 ,需 要把它加入 到 Fl r rp t ie a h中去 tG 才能工作 , 为此还需要创建采集用 的 CpueFl r rp 。不 同的采集 a tr ie ah t G 卡需要创建不 同的 C pue ie rp 。 atr lr ah 典型 的采集设备有一个 Peiw Ft G rv e 的输出 Pn和一个 C pue 出 Pn i atr 输 i,前者主要用于视频 图像 的预览 , 后 者主要用于视频数据 的采集. 这种设 备多数 P I U B接 口接入计 算 C 或(S ) 机 。构 建 的 Fl r rp 图 1 示 : ie Ga h如 t 所
f n o s 驱动模 型 的采集设备 的 采集 。Dr t o o Wi w ) r d i c hw系统使 用一种 eS Flr rp ie ah的模型来管理整个数据流的处理过程 ,参与数据处理 的各 tG 个功能模块 叫做 Flr ie,各个 Fl r Fh r rp t ie 在 ie Ga h中按一定的顺序连接 t 形成一条具有特定功能的链 路。 ie 分为 3 ,o reFl r 主要负责 Fl r t 类 S uc ies t 数据 的输入 , 据源可以是文件 , tme 计算机里 的采集卡 , 数 Ie t n 数字摄像 机等 。Tas r Fl r 主要 负责数据格式的转换 , rnf m ie o ts 例如数据流的分离合 成, 解码编码等。R n e n i r主要负责将数据送给声卡 , ed r g F t s i l e 显卡进 行 多媒体 的演示 , 或者输出到文件进行存储 。上述 Fl r连接在一起 , ies t 交
科技信息
计 算机 与 网络
基 于 D rcS o 硇 通 用 音 顽频 采 集方 案 i th w e
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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主要负责数 据的最终去向,我们可以将数据送给声卡、显卡进行多媒 体的演示,也可以输出到文件进行存储。
相关文档
最新文档