DirectShow从静止图像pin中捕捉图片

合集下载

基于DirectShow视频帧实时捕捉的设计与实现

基于DirectShow视频帧实时捕捉的设计与实现
第2 8卷 第 1期
21 0 1年 1月
计 算机 应 用与软 件
Co u e p i ai n n o t r mp t rAp lc to sa d S f wa e
Vo. 8 No 1 12 .
J n. 01l a 2
基 于 Di cS o 视 频 帧 实 时 捕 捉 的设 计 与 实 现 r th w e
t ea t li d afl so ie te m n li di te m . o d lwih mu tme i e rvd o sr a i mu tme a sra The t i n,heGDIf c in o i d wsi nv ke o r nd rt ma e fa s, un to fW n o si o d t e e hei g r me
CAPTURI NG BAS ED oN RECTS DI Ho W
Z uY n u Z o h n b Wa gX n x g X eL i Z o ig h ih a h uS a g o n igi i e n h uQ n
( ol efC m ue c ne C og igU i rt,h nqn 0 0 0,hn ) C lg o p t Si c ,h nqn nv sy C og ig4 0 3 C ia e o r e ei
染 , 后 按 照 MP G 最 E 2标 准 合 成 A I 频 文 件 并 可 以实 时重 放 。 V视 关键词 Drc hw技 术 i to eS A I MP G 多媒 体 流 V E2
DES GNI I NG AND M PLEM ENTI I NG REAL. M E DEo TI VI FRAM E
件 视 频 流 得 到 的 视 频 帧 是 黑 色 的 , 黑 屏 问 题 ; 何 设 计 抓 即 如

基于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中利用samplegrabber捕获摄像头每一帧图像并转为bmp文件

directshow中利用samplegrabber捕获摄像头每一帧图像并转为bmp文件

directshow中利用samplegrabber捕获摄像头每一帧图像并转为bmp文件关于怎样枚举设备、建立Filter Graph等问题,我就不多说了,说也说不清楚,因为我也是才接触DirectShow。

网上这类资料还是很多,百度知道的比我多多了。

这里主要介绍一下自己在学习了StillCap例子之后,实现利用SampleGrabber捕获摄像头每一帧图像的过程。

过程中遇到的印象深刻的问题会在下一篇博文中介绍。

废话不说了,开门见山吧。

大致思路与代码如下:1、从ISampleGrabber实例化一个sample grabber,充当一个Transform Filter[cpp] viewplaincopy?CComPtr<ISampleGrabber>m_pSampleGrabber;2、设置相关参数,将Grabber注册并且加入到m_pGB这个Filter Graph中[cpp] viewplaincopy?//////////////////////////////////////////////////////////////////////////Add SampleGrabber // create a sample grabber // hr =m_pSampleGrabber.CoCreateInstance( CLSID_SampleGrabber ); if( !m_pSampleGrabber ) { MessageBox(NULL, L"Could not create SampleGrabber (is qedit.dll registered?)", L"", MB_OK); return hr; } CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pSampleGrabber ); // force it to connect to video, 24 bit // CMediaType VideoType;VideoType.SetType( &MEDIATYPE_Video ); VideoType.SetSubtype( &MEDIASUBTYPE_RGB24 ); VideoType.SetFormatType(&FORMAT_VideoInfo); hr = m_pSampleGrabber->SetMediaType( &VideoType ); // shouldn't fail if (FAILED(hr)) { MessageBox(NULL, L"不能初始化SampleGrabber媒体类型。

基于Directshow的VMR视频捕获的实现

基于Directshow的VMR视频捕获的实现

时 , 捉 图像 帧 , 捕 然后 从 颜 色空 间 RG 转换 到 Y 4 0 12 , B UV 2 /4 0 供视 频 图像 处 理 算 法作 直接 处 理 。 如 : 码 、 别 等 。 比 编 识
关键词 : VMR ; rcso 视 频 捕 获 Di t w; e h
中 图分 类 号 : P 1 T 31
文 献标 识 码 : A
文 章编 号 :0 9 3 4 (0 0 2 — 1 0 0 1 0 — 0 42 1 )5 7 1 — 2
TheR e lz ton h de ai a i oft e Vi o Capt e Ba e lD ie tho ' ur s d Oi r cs w s VM R ZEN G ua h n. H —s a So N G u Y
I SSN 1 0 — 0 4 09 34
E ma l e u @C C .e . — i d f C Cn t a : c
h t : w w.n s e.a t / w dz. t p/ n c T l 8 — 5 - 6 0 6 5 9 94 e: 6 5 1 5 9 9 3 + 6O 6
Ke r s VM R ; i cs o v d o cp u e y wo d : dr t w; ie a t r e h
随 着 多媒 体 技 术 的 不断 发 展 , 于 视 频 技 术 的项 目已广 泛 应 用 于 数 字 监 控 、 视 电话 等 领 域 , 些 领 域 最 首 要 的 问题 是 实 时 图 基 可 这 像 捕 获 , 得 良好 的 视 频 图 像 以 供 数字 图像 处 理 , 典 的 D r t o ie n e 视频 捕 获 技 术 存 在 诸 多 局 限 性 , 对 这 一 现 象 , 获 经 i es w v or dr e h d e 针 本 文 提 出 了一 个 基 于 Dre hw 的 V i to es MR技 术 的 视频 捕 获 方 案 , 获 图 像 帧 , 换 颜 色空 间 , 视 频 图 像处 理算 法 处 理 。 捕 转 供

浅谈DirectShow技术捕获视频流中帧图像

浅谈DirectShow技术捕获视频流中帧图像

浅谈DirectShow 技术捕获视频流中帧图像肖长健(江苏联合职业技术学院盐城生物工程分院,江苏 盐城 224731)摘 要:利用微软公司提供 DirectShow 接口技术,实现了多媒体文件或视频流中视频帧图像的捕获,并提取出有用的图 像帧信息。

关键词:DirectS how 技术;filter ;视频流;视频帧图像捕获Brief T alk on Capturing Images from Video Streams by DirectShow TechnologyXIAO Chan g-ji an(Yancheng Biology Engineering High School, Jiangsu Union Technical Institute, Yancheng, Jiangsu 224731, China )Abstract : Making use of DirectShow interface technology provided by Microsoft C orporation, the capturing video images from multimedia files or video streams is realized, and useful image frames information is extracted. Key words :DirectShow technolog y ;filter ;video streams ;video images capture0 引言本文以 Direct Show 技术为基础,通过对媒体文件或多媒体 流中的视频流的处理,从多媒体文件视频流中捕获视频帧图像,提取出所需要的最好、最有价值的图像帧信息。

利用 Direct Sho w 技术从视频流中捕获帧图像,捕获精度可达到 1 帧。

1 DirectShowD ir ec t X M e d i a 是微软公司发布的专用于开发多媒体应用的 程 序 接 口 ,包 括 D ir ec t A n i m a ti on 、D ir ec t Sho w 、M e d i a P l a y e rC on tr o l 、D ir ec t X T r a n s f o r m 和D ir ec t 3D R e t a i n e d M od e 。

directshow的中文资料之设备列举和捕捉接口

directshow的中文资料之设备列举和捕捉接口

directshow的中文资料之设备列举和捕捉接口第一篇:directshow的中文资料之设备列举和捕捉接口directshow的中文资料之设备列举和捕捉接口这篇解释和示例如何通过DirectShow的接口去初始化和访问系统的硬件设备。

代表性的,DirectShow应用程序使用下面类型的硬件。

音/视频捕捉卡音频或视频回放卡音频或视频压缩或解压卡(象MPEG解码器)下面将以AV设备作参考。

如何列举设备包括在DirectShow SDK中的接口,类,和例子提供了音/视频捕捉和回放的功能。

因为文件源过滤器和filter graph manager处理了内在的工作,所有,添加捕捉功能到一个应用程序中,只需添加很少的代码。

你可以通过列举系统硬件设备和得到设备列表完成特别的任务(例如:所有的视频捕捉卡的列表)。

DirectShow自动为win32和Video for Windows 设备实例化过滤器。

要AV设备工作,首先,你必须检测当前系统存在的设备。

ICreateDevEnum接口建立指定类型的列表。

提供你需要的检测和设置硬件的功能。

访问一个指定的设备有三步,详细的说明和代码如下:建立系统硬件设备的列表首先,申明一个列表指针,然后通过CoCreateInstance 建立。

CLSID_SystemDeviceEnum是我们想建立对象的类型,IID_ICreateDevEnum是接口的GUID。

ICreateDevEnum *pCreateDevEnum;CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(void**)&pCreate DevEnum);其次,建立一个特别类型的硬件设备的列表(例如视频捕捉卡)申明一个IEnumMoniker接口,并把他传给ICreateDevEnum::CreateClassEnumerator 方法。

DirectShow编程实现摄像头视频捕捉

DirectShow编程实现摄像头视频捕捉
第二步、调用RenderStream依次把Still pin、Sample Grabber和系统默认Renderer Filter连接起来。
第三步、配置Sample Grabber以捕获数据。
视频捕捉类CCaptureVideo的具体实现
// CCaptureVideo视频捕捉类头文件/////////////////////////////////////////////////////////////////////#if !defined(AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_)#define AFX_CAPTUREVIDEO_H__F5345AA4_A39F_4B07_B843_3D87C4287AA0__INCLUDED_/////////////////////////////////////////////////////////////////////// CaptureVideo.h : header file/////////////////////////////////////////////////////////////////////#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include <atlbase.h>#include <windows.h>#include <dshow.h>#ifndef SAFE_RELEASE#define SAFE_RELEASE( x ) /if ( NULL != x ) /{ /x->Release( )

DirectShow流媒体数据的采集及图片的捕获

DirectShow流媒体数据的采集及图片的捕获

DirectShow流媒体数据的采集及图片的捕获DirectShow流媒体数据的采集及图片的捕获建议你用DirectShow它可以帮你从视频采集设备中取得数据,并通过Sample Grabber过滤器进行抓图DirectShow流媒体数据的采集及图片的捕获用DirectShow来使用摄像头,一般要求摄像头的驱动是WDM 格式的,当然,一些比较老的驱动格式DirectShow也可支持。

在DirectShow中,有一个Sample Grabber过滤器,它是一个可以被插入流的过滤器,它有自己的缓冲,存放采样。

我们就可以用它来从一个视频文件中简单的扑获一桢。

DirectShow通过图形过滤管理器(Filter Graph Manager)来与上层应用程序和下层的驱动进行联系。

DirectShow通过捕获过滤器(Capture Filter)来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象。

1、创建图形过滤管理器Filter Graph如上面原理所述,首先要创建Filter Graph:CComPtr< IGraphBuilder > m_pGraph;hr=m_pGraph.CoCreateInstance( CLSID_FilterGraph );2、连接设备还要创建系统枚举器组件对象:CComPtr<ICreateDevEnum>pCreateDevEnum;pCreateDevEnum.CoCreateInstance( CLSID_ SystemDeviceEnum );然后使用接口方法CreateClassEnumerator ()为指定的Filter注册类型目录创建一个枚举器,并获得IenumMoniker接口:CComPtr< IEnumMoniker > pEm;pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &p Em, 0 );接着在调用BindT oObject()以后,可以将设备标识生成一个DirectShow Filter,将其加到Filter Graph中就可以参与工作了。

DirectShow在视频捕获中的应用

DirectShow在视频捕获中的应用

#T 6 7 / # $ ’ / 5 < , % 8 % / 9‘ 5 , 7 < 9 0 1 % Y5 8. , < 1 5 9 7 < 9 + , 7/ % ,8 9 , 7 . M 5 7 2 5 .% -b 5 2 % Y 8Z & . 9 / % , M’ c 9 3M M . K 7 8 9 1 7 9 . 8 K% / < , 7 . 9 5 9 , 7 . M 5 7 2 5 . . & 5 < . 9 5 % 8M % , 7 7 / / 5 < 5 7 9 X 5 8 % & . 9 5 & 5 < . 9 5 % 8 / , % M 38 3M Z Z : 3. Z Z $ $ . , 2 Y . , 72 5 / / 7 , 7 < 7 8. 28 < 1 , % 5 e . 9 5 % ’ c 9 5 8 5 9 , % 2 + < 7 25 9 1 7 < % M & 7 V 5 9 5 7 8% /2 . 9 .9 , . 8 % , 9 8 1 : Z Z . 8Y 7 & & . 88 % M 7% 9 1 7 , 9 1 5 8 . , 9 5 < & 71 % Y9 %< . 9 + , 76 5 2 7 %2 . 9 . / , % M.4 0 O< . M 7 , .Y 5 9 1‘ 5 , 7 < 9 0 1 % Y$ Z $ $ 9 7 < 1 5 + 7 8 5 < & + 2 5 , 7 6 5 7 Y$ 6 5 2 7 % < % M , 7 8 8 5 % . 2Y , 5 9 5 5 2 7 %2 . 9 . 5 9 % / 5 & 7 ’ 0 % M 7 5 M % , 9 . 9 [ 3Z Z 36 Z < % 2 7 / , . M 7 9 9 % 5 M & 7 M 7 9 9 1 7 8 7 9 . 8 K 8 5 -T 5 < , % 8 % / 9$ 5 8 + . &Djj’ ( 7 9 5 8 . & 8 %Z , % 6 5 2 7 2 ’ 3 Z #$ % 8 " ) # 4 7 5 2 7 %D . 9 + , 7 ‘ 5 , 7 < 9 0 1 % Y% D GT Z 1+ 9 7 , 7 9的 普 及 和 多 媒 体 技 术 的 发 展 $ !! 随着c 基于 c 如在线直播 & 视频 会 9 7 , 7 9的多媒体应用 $ 议& 远程教育 & 远程医疗 & 网络电话 & 网络监控等如 雨后春笋般涌出 ’ 在这些应用中 $ 视频捕获是一项 重要的基础工作 ’ 就软件实现来说 $ 目前要实现计

DShow中实现抓图的几种方法

DShow中实现抓图的几种方法

DShow中实现抓图的几种方法1.加入Sample Grabber Filter当我们加入Sample Grabber Filter的时候,我们可以直接调用其接口(interface)ISampleGrabber。

该接口可以获取经过该Filter的单独的Media Samples。

详情请参见DXSDK。

1.1 派生出自己的Sample Grabber从ISampleGrabberCB中派生出自己的类,然后实现其虚函数,详情请参见SDK中的示例程序(DXSDKROOT\Samples\C++\DirectShow\Editing\GrabBitmaps)。

1.2 直接调用Sample Grabber Filter的接口如果我们在播放的过程中动态的加入Filter的话,操作和效率都不乐观。

所以我采用下面的方法:该方法传递的是时间,不是在播放的时候动态加入Filter然后截图,而是另外打开源文件进行操作。

A)。

申明以下接口:A)。

申明以下接口:#001 IGraphBuilder *pGraph = NULL; //for graph builder #002 IMediaControl *pControl = NULL; //media control #003 IMediaSeeking *pSeeking = NULL; //media seeking #004 IMediaEventEx *pEvent = NULL; //media envent#005 IBaseFilter *pNullFilter =NULL;//for holding the Sample grabber FilterB)。

初始化接口:#001 JIF(CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC,#002 IID_IGraphBuilder, (void **)&pGraph));#003#004 JIF(CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC,#005 IID_IBaseFilter, (void**)&pNullFilter)); #006 JIF(pGraph->QueryInterface(IID_IMediaControl,(void**)&pControl));#007 JIF(pGraph->QueryInterface(IID_IMediaSeeking, (void**)&pSeeking));#008 JIF(pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent));C)。

DirectShow从静止图像pin中捕捉图片

DirectShow从静止图像pin中捕捉图片

1.关于视频捕捉(About Video Capture in Dshow)1视频捕捉Graph的构建一个能够捕捉音频或者视频的graph图都称之为捕捉graph图。

捕捉graph图比一般的文件回放graph图要复杂许多,dshow提供了一个Capture Graph Builder COM组件使得捕捉graph图的生成更加简单。

C apture Graph Builder提供了一个ICaptureGraphBuilder2接口,这个接口提供了一些方法用来构建和控制捕捉graph。

首先创建一个Capture Graph Builder对象和一个graph manger对象,然后用filter graph manager 作参数,调用ICaptureGraphBuilder2::SetFiltergraph来初始化Capture Graph Builder。

看下面的代码把HRESULT InitCaptureGraphBuilder(IGraphBuilder **ppGraph, // Receives the pointer. ICaptureGraphBuilder2 **ppBuild // Receives the pointer.){if (!ppGraph || !ppBuild){return E_POINTER;}IGraphBuilder *pGraph = NULL;ICaptureGraphBuilder2 *pBuild = NULL;// Create the Capture Graph Builder.HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pGraph); if (SUCCEEDED(hr)){而// Create the Filter Graph Manager.hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void**)&pGraph);if (SUCCEEDED(hr)){// Initialize the Capture Graph Builder.pBuild->SetFiltergraph(pGraph);// Return both interface pointers to the caller.*ppBuild = pBuild;*ppGraph = pGraph; // The caller must release both interfaces.return S_OK;}Else{pBuild->Release();}}return hr; // Failed}2.Direcshow中视频捕捉的FilterPin的种类捕捉Filter一般都有两个或多个输出pin,他们输出的媒体类型都一样,比如预览pin和捕捉pin,因此根据媒体类型就不能很好的区别这些pin。

DirectShow获取一张图片

DirectShow获取一张图片

DirectShow:图片的抓取 zz在播放媒体文件的过程中,有一个很有用的功能,就是在当前播放的位置抓取图,实现这种图片抓取功能的方法很多,我们这里只介绍常用的两种。

第1种方法最简单,它使用1BasicVideo::GetCurrentImage接口方法,代码如下。

boolSnapshotBitmap(IBasicVideo*pBa8icVideo,ê? constchar*OutFile) if (pBasicVldeo){long bitmapSize=0;ê?//首先获得图像大小if(SUCCEEDED(pEasicVidee->GetcurrentImage(&bitmapSize,ê?0))){bool pass=false;ê?//分¤?配?图ª?像?帧?内¨²存ä?unsignedchar*buffer=newunsignedchar[bitmapSize];//获?取¨?图ª?像?帧?数ºy据Yif(SUCCEEDED(pBasicVideo->GetCurrentImage(&bitmapSize,(long*)buffer)) ){BITMAPFILEHEADER hdr;ê?LPBITMAPINFOHEADER ipbi;ê?ipbi=(LPBITMAPINFOHEADER)buffer;ê?int nColors=1<<ipbi->biBitCount;ê?if(nColors>256)//always is”¡ÀBM”¡Àhdr.bfType =((WORD)(‘?M’¡¥<<8)|’¡¥B’¡¥);ê?hdr.ê?bfSize =bitmapSize+sizeof(hdr);ê?hdr.ê?bfReservedl =0;hdr.ê?bfReserved2 =0;ê?hdr.ê?bfOffBits =(DWORD)(sizeof(BITMAPFILEHEADER)+lpbi->biSize+nColors*sizeof(RGBQUAD));CFilebitmapFile(outFile,ê?CFile:êo:êomodeReadWrite |CFile:êo:êomodeCreate | CFile:êo:êotypeBinary);ê?//写¡ä入¨?位?图ª?文?件t头ª¡¤bitmapFile.ê?Write{&hdr,ê?sizeof【?BITMApFILEHEADER));//写¡ä入¨?图ª?像?帧?数ºy据Y(包㨹括¤¡§BITMAPINFOHEADER信?息¡é)bitmapFile.ê?Write(buffer,ê?bitmapSize);ê?bitmapFile.ê?Close();ê?pas8=true;}delete[]burfer;ê?return Pass;}returnfalse ;值得注意的是,IBasieVideo接口应该从Filter Graph Manager上获得,但真正实现在Renderer Filter 上。

C#DirectShow预览摄像头并截图

C#DirectShow预览摄像头并截图

C#DirectShow预览摄像头并截图C# DirectShow预览摄像头并截图,供⼤家参考,具体内容如下本事例通过Windows DirectX Filtergraph ⼀些列管道将电脑所接⼊视频采集设备的视频流播放到制定区域,通过ISampleGrabberCB接⼝的BufferCB回调函数截取图⽚。

⽤此⽅法预览图像cpu占⽤率极低,⽐其其他事件绑定并逐帧显⽰图像性能更佳。

UI布局:代码如下:using System;using System.Drawing;using System.Windows.Forms;using DirectShowLib;using System.Runtime.InteropServices;using Types;using System.Drawing.Imaging;namespace Test{public partial class FormDirect : Form, ISampleGrabberCB{private int _previewWidth = 640;private int _previewHeight = 480;private int _previewStride = 0;private int _previewFPS = 30;private volatile bool isGrab = false;IVideoWindow videoWindow = null;IMediaControl mediaControl = null;IFilterGraph2 graphBuilder = null;ICaptureGraphBuilder2 captureGraphBuilder = null;DsROTEntry rot = null;public FormDirect(){InitializeComponent();}private void button2_Click(object sender, EventArgs e){//截图isGrab = true;}private void button3_Click(object sender, EventArgs e){string button_text = button3.Text;if (button_text.Equals("Start Webcam")){button3.Text = "Stop Webcam";StartCamera();}else{button3.Text = "Start Webcam";StopCamera();}}private void StartCamera(){DsDevice[] devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);if (devices.Length == 0){MessageBox.Show("No USB webcam connected");button3.Text = "Start Webcam";return;}else{CaptureVideo(devices[0]);}}private void StopCamera(){button3.Text = "Start Webcam";CloseInterfaces();}public void CaptureVideo(DsDevice device){pictureBox1.Image = null;int hr = 0;IBaseFilter sourceFilter = null;ISampleGrabber sampleGrabber = null;try{// Get DirectShow interfacesGetInterfaces();// Attach the filter graph to the capture graphhr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder);DsError.ThrowExceptionForHR(hr);// Use the system device enumerator and class enumerator to find// a video capture/preview device, such as a desktop USB video camera.sourceFilter = SelectCaptureDevice(device);// Add Capture filter to graph.hr = this.graphBuilder.AddFilter(sourceFilter, "Video Capture");DsError.ThrowExceptionForHR(hr);// Initialize SampleGrabber.sampleGrabber = new SampleGrabber() as ISampleGrabber;// Configure SampleGrabber. Add preview callback.ConfigureSampleGrabber(sampleGrabber);// Add SampleGrabber to graph.hr = this.graphBuilder.AddFilter(sampleGrabber as IBaseFilter, "Frame Callback");DsError.ThrowExceptionForHR(hr);// Configure preview settings.SetConfigParams(this.captureGraphBuilder, sourceFilter, _previewFPS, _previewWidth, _previewHeight);// Render the previewhr = this.captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, sourceFilter, (sampleGrabber as IBaseFilter),null);DsError.ThrowExceptionForHR(hr);SaveSizeInfo(sampleGrabber);// Set video window style and positionSetupVideoWindow();// Add our graph to the running object table, which will allow// the GraphEdit application to "spy" on our graphrot = new DsROTEntry(this.graphBuilder);// Start previewing video datahr = this.mediaControl.Run();DsError.ThrowExceptionForHR(hr);}catch{MessageBox.Show("An unrecoverable error has occurred.");}finally{if (sourceFilter != null){Marshal.ReleaseComObject(sourceFilter);sourceFilter = null;}if (sampleGrabber != null){Marshal.ReleaseComObject(sampleGrabber);sampleGrabber = null;}}}public void CaptureVideo(){pictureBox1.Image = null;int hr = 0;IBaseFilter sourceFilter = null;ISampleGrabber sampleGrabber = null;try{// Get DirectShow interfacesGetInterfaces();// Attach the filter graph to the capture graphhr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder);DsError.ThrowExceptionForHR(hr);// Use the system device enumerator and class enumerator to find// a video capture/preview device, such as a desktop USB video camera.sourceFilter = FindCaptureDevice();// Add Capture filter to graph.hr = this.graphBuilder.AddFilter(sourceFilter, "Video Capture");DsError.ThrowExceptionForHR(hr);// Initialize SampleGrabber.sampleGrabber = new SampleGrabber() as ISampleGrabber;// Configure SampleGrabber. Add preview callback.ConfigureSampleGrabber(sampleGrabber);// Add SampleGrabber to graph.hr = this.graphBuilder.AddFilter(sampleGrabber as IBaseFilter, "Frame Callback");DsError.ThrowExceptionForHR(hr);// Configure preview settings.SetConfigParams(this.captureGraphBuilder, sourceFilter, _previewFPS, _previewWidth, _previewHeight);// Render the previewhr = this.captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, sourceFilter, (sampleGrabber as IBaseFilter),null); DsError.ThrowExceptionForHR(hr);SaveSizeInfo(sampleGrabber);// Set video window style and positionSetupVideoWindow();// Add our graph to the running object table, which will allow// the GraphEdit application to "spy" on our graphrot = new DsROTEntry(this.graphBuilder);// Start previewing video datahr = this.mediaControl.Run();DsError.ThrowExceptionForHR(hr);catch{MessageBox.Show("An unrecoverable error has occurred.");}finally{if (sourceFilter != null){Marshal.ReleaseComObject(sourceFilter);sourceFilter = null;}if (sampleGrabber != null){Marshal.ReleaseComObject(sampleGrabber);sampleGrabber = null;}}}public IBaseFilter SelectCaptureDevice(DsDevice device){object source = null;Guid iid = typeof(IBaseFilter).GUID;device.Mon.BindToObject(null, null, ref iid, out source);return (IBaseFilter)source;}public IBaseFilter FindCaptureDevice(){int hr = 0;#if USING_NET11UCOMIEnumMoniker classEnum = null;UCOMIMoniker[] moniker = new UCOMIMoniker[1];#elseIEnumMoniker classEnum = null;IMoniker[] moniker = new IMoniker[1];#endifobject source = null;// Create the system device enumeratorICreateDevEnum devEnum = (ICreateDevEnum)new CreateDevEnum();// Create an enumerator for the video capture deviceshr = devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, out classEnum, 0);DsError.ThrowExceptionForHR(hr);// The device enumerator is no more neededMarshal.ReleaseComObject(devEnum);// If there are no enumerators for the requested type, then// CreateClassEnumerator will succeed, but classEnum will be NULL.if (classEnum == null){throw new ApplicationException("No video capture device was detected.\r\n\r\n" +"This sample requires a video capture device, such as a USB WebCam,\r\n" + "to be installed and working properly. The sample will now close.");}// Use the first video capture device on the device list.// Note that if the Next() call succeeds but there are no monikers,// it will return 1 (S_FALSE) (which is not a failure). Therefore, we// check that the return code is 0 (S_OK).#if USING_NET11int i;if (classEnum.Next (moniker.Length, moniker, IntPtr.Zero) == 0)#elseif (classEnum.Next(moniker.Length, moniker, IntPtr.Zero) == 0)#endif{// Bind Moniker to a filter objectGuid iid = typeof(IBaseFilter).GUID;moniker[0].BindToObject(null, null, ref iid, out source);}else{throw new ApplicationException("Unable to access video capture device!");}// Release COM objectsMarshal.ReleaseComObject(moniker[0]);Marshal.ReleaseComObject(classEnum);// An exception is thrown if cast failreturn (IBaseFilter)source;public void GetInterfaces(){int hr = 0;// An exception is thrown if cast failthis.graphBuilder = (IFilterGraph2)new FilterGraph();this.captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();this.mediaControl = (IMediaControl)this.graphBuilder;this.videoWindow = (IVideoWindow)this.graphBuilder;DsError.ThrowExceptionForHR(hr);}public void CloseInterfaces(){if (mediaControl != null){int hr = mediaControl.StopWhenReady();DsError.ThrowExceptionForHR(hr);}if (videoWindow != null){videoWindow.put_Visible(OABool.False);videoWindow.put_Owner(IntPtr.Zero);}// Remove filter graph from the running object table.if (rot != null){rot.Dispose();rot = null;}// Release DirectShow interfaces.Marshal.ReleaseComObject(this.mediaControl); this.mediaControl = null;Marshal.ReleaseComObject(this.videoWindow); this.videoWindow = null;Marshal.ReleaseComObject(this.graphBuilder); this.graphBuilder = null;Marshal.ReleaseComObject(this.captureGraphBuilder); this.captureGraphBuilder = null;}public void SetupVideoWindow(){int hr = 0;// Set the video window to be a child of the PictureBoxhr = this.videoWindow.put_Owner(pictureBox1.Handle);DsError.ThrowExceptionForHR(hr);hr = this.videoWindow.put_WindowStyle(WindowStyle.Child);DsError.ThrowExceptionForHR(hr);// Make the video window visible, now that it is properly positionedhr = this.videoWindow.put_Visible(OABool.True);DsError.ThrowExceptionForHR(hr);// Set the video positionRectangle rc = pictureBox1.ClientRectangle;hr = videoWindow.SetWindowPosition(0, 0, _previewWidth, _previewHeight);DsError.ThrowExceptionForHR(hr);}private void SetConfigParams(ICaptureGraphBuilder2 capGraph, IBaseFilter capFilter, int iFrameRate, int iWidth, int iHeight) {int hr;object config;AMMediaType mediaType;// Find the stream config interfacehr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, capFilter, typeof(IAMStreamConfig).GUID, out config);IAMStreamConfig videoStreamConfig = config as IAMStreamConfig;if (videoStreamConfig == null){throw new Exception("Failed to get IAMStreamConfig");}// Get the existing format blockhr = videoStreamConfig.GetFormat(out mediaType);DsError.ThrowExceptionForHR(hr);// copy out the videoinfoheaderVideoInfoHeader videoInfoHeader = new VideoInfoHeader();Marshal.PtrToStructure(mediaType.formatPtr, videoInfoHeader);// if overriding the framerate, set the frame rateif (iFrameRate > 0){videoInfoHeader.AvgTimePerFrame = 10000000 / iFrameRate;}// if overriding the width, set the widthif (iWidth > 0){videoInfoHeader.BmiHeader.Width = iWidth;}// if overriding the Height, set the Heightif (iHeight > 0){videoInfoHeader.BmiHeader.Height = iHeight;}// Copy the media structure backMarshal.StructureToPtr(videoInfoHeader, mediaType.formatPtr, false);// Set the new formathr = videoStreamConfig.SetFormat(mediaType);DsError.ThrowExceptionForHR(hr);DsUtils.FreeAMMediaType(mediaType);mediaType = null;}private void SaveSizeInfo(ISampleGrabber sampleGrabber){int hr;// Get the media type from the SampleGrabberAMMediaType media = new AMMediaType();hr = sampleGrabber.GetConnectedMediaType(media);DsError.ThrowExceptionForHR(hr);if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero)){throw new NotSupportedException("Unknown Grabber Media Format");}// Grab the size infoVideoInfoHeader videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader)); _previewStride = _previewWidth * (videoInfoHeader.BmiHeader.BitCount / 8);DsUtils.FreeAMMediaType(media);media = null;}private void ConfigureSampleGrabber(ISampleGrabber sampleGrabber){AMMediaType media;int hr;// Set the media type to Video/RBG24media = new AMMediaType();media.majorType = MediaType.Video;media.subType = MediaSubType.RGB24;media.formatType = FormatType.VideoInfo;hr = sampleGrabber.SetMediaType(media);DsError.ThrowExceptionForHR(hr);DsUtils.FreeAMMediaType(media);media = null;hr = sampleGrabber.SetCallback(this, 1);DsError.ThrowExceptionForHR(hr);}public int BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen){if (isGrab){Bitmap v = new Bitmap(_previewWidth, _previewHeight, _previewStride,PixelFormat.Format24bppRgb, pBuffer);//v.RotateFlip(RotateFlipType.Rotate180FlipX);v.RotateFlip(RotateFlipType.Rotate90FlipX);this.BeginInvoke((MethodInvoker)delegate{pictureBox2.BackgroundImage = v;isGrab = false;});}return 0;}public int SampleCB(double SampleTime, IMediaSample pSample){//throw new NotImplementedException();return 0;}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

【引用】教你十种屏幕抓图方法

【引用】教你十种屏幕抓图方法
点击下载
该软件主程序和汉化补丁的安装都很简单,与我们平时安装软件完全类似。安装成功后启动该软件,主界面如图4所示:
(一)滚屏捕捉
在抓图过程中,经常遇到图片超过桌面尺寸的情况,想查看全部内容必须滚动窗口,要想把该对象全部捕捉下来就需要使用SnagIt来完成:单击“滚动窗口”,在主界面的右侧会看到“捕获”按钮已经准备好了,不过使用该按钮不太方便,下面已经提示了全局的快捷键Ctrl+Shift+P。当目标窗口为当前窗口时,只要按下此组合键就可激活捕捉功能。根据操作提示,用鼠标左键单击一下目标窗口,然后将鼠标移动到滚动条上,该滚动条会自动向下移动,当移动到最底端时会自动停止并直接将捕捉结果保存入“捕获预览”界面,此时就可或编辑或直接另存了。
提示:当不需要此软件的时候,可以输入“PP/R”从内存中卸载即可。
十、虚拟机:无所不抓
前面我们介绍了Windows和DOS下的抓图方法,但还有一些截图无法实现,比如BIOS设置界面、BIOS刷新界面、Windows系统安装过程等图片。由于这些图片并没有在桌面操作系统下运行,因此只能借助于虚拟机软件来进行了。
【引用】教你十种屏幕抓图方法
十种屏幕抓图方法
说起屏幕截图,相信大家都不会陌生:网易博客中的众多教程类日志哪篇不是图文并茂?但是对于刚刚接触电脑的朋友来说,对如何进行抓图还摸不着头脑,以为需要什么高深的技术或什么专业的软件,甚至还以为需要动用DC来帮忙呢。其实抓图的方法有很多种,但种种都很简单,下面Q仔给大家介绍几种方法,相信你也能抓出“美”图来!
(二)捕捉影片画面
QQ除了可以捕捉静态的图片功能,还可以捕捉静态影片、动态影片。不过,为了得到更好的捕捉效果,可以先进行一下设置:在“捕捉屏幕”下拉菜单中选择“影片截图设置”,可详细设置截取动态图片的宽度,每次捕获帧数,每帧的时间间隔及动态图片的播放速度(如图6)。建议只要稍微进行一下调整就可以了,如果调整的过多,虽然影片的效果好了,但是系统的资源占有、传输的速度肯定慢的。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.关于视频捕捉(About Video Capture in Dshow)1视频捕捉Graph的构建一个能够捕捉音频或者视频的graph图都称之为捕捉graph图。

捕捉graph图比一般的文件回放graph图要复杂许多,dshow提供了一个Capture Graph Builder COM组件使得捕捉graph图的生成更加简单。

C apture Graph Builder提供了一个ICaptureGraphBuilder2接口,这个接口提供了一些方法用来构建和控制捕捉graph。

首先创建一个Capture Graph Builder对象和一个graph manger对象,然后用filter graph manager 作参数,调用ICaptureGraphBuilder2::SetFiltergraph来初始化Capture Graph Builder。

看下面的代码把HRESULT InitCaptureGraphBuilder(IGraphBuilder **ppGraph, // Receives the pointer. ICaptureGraphBuilder2 **ppBuild // Receives the pointer.){if (!ppGraph || !ppBuild){return E_POINTER;}IGraphBuilder *pGraph = NULL;ICaptureGraphBuilder2 *pBuild = NULL;// Create the Capture Graph Builder.HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pGraph); if (SUCCEEDED(hr)){而// Create the Filter Graph Manager.hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void**)&pGraph);if (SUCCEEDED(hr)){// Initialize the Capture Graph Builder.pBuild->SetFiltergraph(pGraph);// Return both interface pointers to the caller.*ppBuild = pBuild;*ppGraph = pGraph; // The caller must release both interfaces.return S_OK;}Else{pBuild->Release();}}return hr; // Failed}2.Direcshow中视频捕捉的FilterPin的种类捕捉Filter一般都有两个或多个输出pin,他们输出的媒体类型都一样,比如预览pin和捕捉pin,因此根据媒体类型就不能很好的区别这些pin。

此时就要根据pin的功能来区别每个pin了,每个pin都有一个GUID,称为pin的种类。

如果想仔细的了解pin的种类,请看后面的相关内容Working with Pin Categories。

对于大多数的应用来说,ICaptureGraphBuilder2提供了一些函数可以自动确定pin的种类。

预览pin和捕捉pin视频捕捉Filter都提供了预览和捕捉的输出pin,预览pin用来将视频流在屏幕上显示,捕捉pin用来将视频流写入文件。

预览pin和输出pin有下面的区别:1 为了保证捕捉pin对视频桢流量,预览pin必要的时候可以停止。

2 经过捕捉pin的视频桢都有时间戳,但是预览pin的视频流没有时间戳。

预览pin的视频流之所以没有时间戳的原因在于filter图表管理器在视频流里加一个很小的latency,如果捕捉时间被认为就是render时间的话,视频renderFilter就认为视频流有一个小小的延迟,如果此时render filter试图连续播放的时候,就会丢桢。

去掉时间戳就保证了视频桢来了就可以播放,不用等待,也不丢桢。

Video Port pinVideo Port是一个介于视频设备(TV)和视频卡之间的硬件设备。

同过Video Port,视频数据可以直接发送到图像卡上,通过硬件的覆盖,视频可以直接在屏幕显示出来。

Video Port就是连接两个设备的。

使用Video Port的最大好处是,不用CPU的任何工作,视频流直接写入内存中。

如果捕捉设备使用了Video Port,捕捉Filter就用一个video port pin代替预览pin。

预览pin的种类GUID为PIN_CATEGORY_PREVIEW捕捉pin的种类GUID为PIN_CATEGORY_CAPTUREvideo port pin的种类GUID为PIN_CATEGORY_VIDEOPORT一个捕捉filter至少有一个Capture pin,另外,它可能有一个预览pin 和一个video port pin,或者两者都没有,也许filter有很多的capture pin,和预览pin,每一个pin都代表一种媒体类型,因此一个filter可以有一个视频capture pin,视频预览pin,音频捕捉pin,音频预览pin。

3.预览视频(Previewing Video)为了创建可以预览视频的graph,可以调用下面的代码ICaptureGraphBuilder2 *pBuild; // Capture Graph Builder// Initialize pBuild (not shown).IBaseFilter *pCap; // Video capture filter./* Initialize pCap and add it to the filter graph (not shown). */hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);4.如何捕捉视频流并保存到文件(Capture video toFile)1)将视频流保存到AVI文件下面的图表显示了graph图图2AVI Mux filter接收从capture pin过来的视频流,然后将其打包成AVI流。

音频流也可以连接到AVI Mu x Filter上,这样mux filter就将视频流和视频流合成AVI流。

File writer将AVI流写入到文件中。

可以像下面这样构建graph图IBaseFilter *pMux;hr = pBuild->SetOutputFileName(&MEDIASUBTYPE_Avi, // Specifies AVI for the target file.L"C:\\Example.avi", // File name.&pMux, // Receives a pointer to the mux.NULL); // (Optional) Receives a pointer to the file sink.第一个参数表明文件的类型,这里表明是AVI,第二个参数是制定文件的名称。

对于AVI文件,Set OutputFileName函数会创建一个AVI mux Filter 和一个File writer Filter ,并且将两个filter添加到grap h图中,在这个函数中,通过File Writer Filter 请求IFileSinkFilter接口,然后调用IFileSinkFilter::SetFile Name方法,设置文件的名称。

然后将两个filter连接起来。

第三个参数返回一个指向AVI Mux的指针,同时,它也通过第四个参数返回一个IFileSinkFilter参数,如果你不需要这个参数,你可以将这个参数设置成NULL。

然后,你应该调用下面的函数将capture filter 和AVI Mux连接起来。

hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, // Pin category.&MEDIATYPE_Video, // Media type.pCap, // Capture filter.NULL, // Intermediate filter (optional).pMux); // Mux or file sink filter.// Release the mux filter.pMux->Release();第5个参数就是使用的上面函数返回的pMux指针。

当捕捉音频的时候,媒体类型要设置为MEDIATYPE_Audio,如果你从两个不同的设备捕捉视频和音频,你最好将音频设置成主流,这样可以防止两个数据流间drift,因为avi mux filter为同步音频,会调整视频的播放速度的。

为了设置master 流,调用IConfigAviMux::SetMasterStream方法,可以采用如下的代码:IConfigAviMux *pConfigMux = NULL;hr = pMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfigMux); if (SUCCEEDED(hr)){pConfigMux->SetMasterStream(1);pConfigMux->Release();}SetMasterStream的参数指的是数据流的数目,这个是由调用RenderStream的次序决定的。

例如,如果你调用RenderStream首先用于视频流,然后是音频,那么视频流就是0,音频流就是1。

添加编码filterIBaseFilter *pEncoder; /* Create the encoder filter (not shown). */ // Add it to the filter graph.pGraph->AddFilter(pEncoder, L"Encoder);/* Call SetOutputFileName as shown previously. */// Render the stream.hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,pCap, pEncoder, pMux);pEncoder->Release();2)将视频流保存成wmv格式的文件为了将视频流保存成并编码成windows media video (WMV)格式的文件,将capture pin连到WM ASF Writer filter。

相关文档
最新文档