DirectShow视频采集方案

合集下载

基于DirectShow技术实现视频采集

基于DirectShow技术实现视频采集

第37卷第2期(总第144期)2008年6月火控雷达技术Fire Control Radar TechnologyVol.37No.2(Series 144)J un.2008 收稿日期:2007-12-12 作者简介:郭昊,男,1979年生,助理工程师,研究方向为雷达软件开发。

文章编号:1008-8652(2008)02-097-04基于Direct Show 技术实现视频采集郭 昊(西安电子工程研究所 西安 710100)【摘要】 介绍Direct Show 技术的基本概念,提出了基于Direct Show 技术采集视频数据的软件设计方案,文中详细叙述了软件开发的实现框架。

关键词:Direct Show ;视频捕获;过滤器;过滤器图表中图分类号:TP274+12 文献标志码:AImplementation of Video C apture B ased on DirectShow T echnologyGuo Hao(X i ’an Elect ronic Engi neeri ng Research I nstit ute ,X i ’an 710100)Abstract :In t his paper ,t he basic concept of Direct Show technology is int roduced.A software design scheme based on Direct Show technology for video capt ure is p resented.Meanwhile ,t he implementation f rame for developing t he software is described in detail.K eyw ords :Direct Show ;video capt ure ;filter ;filter grap h1 引言为了支持多媒体信息的采集、压缩、解压和回放,针对Windows 平台,微软提供了两种多媒体开发框架:一种是Video for Windows (简称V FW ),另一种是Direct Show 。

基于DirectShow的视频监控采集系统

基于DirectShow的视频监控采集系统

能 :视频 采集模块完成将视频 采集设 备获取 的视频数
据 存 人 指 定 的文 件 存 储 设 备 中 , 图 2所 示 。 如
视频监控采集 系统就是人们利用视觉来获取信 息的一
种通信方式 , 较 之其他信息传递方式具有 内容丰富 、 它 直 观 及 方 便 等 特 点 所 以 . 频 采 集 系 统 被 广 泛 应 用 于 视 金融 、 通 、 院 、 交 医 电力 、 关 、 防 乃 至 住 宅 社 区等 领 海 国
@ 现 计 机 21. 代 算 008 o
系统运行流程为 : ( ) 建 一个 Fl rG a hMa a e 组 件 ; 1创 ie rp n g r t
( 频 采 集 设 备 的 C SD 为 C SD Vi e I p t vc . 视 LI LI d o n u De ie
2 软 件 设 计
21 系统 流 程 .
系统是在 Vsa C +6 i l + . u 0环境下 . 利用 面 向对象编
程方 法 设 计 开 发 的 。
作 者 简介 : f  ̄
(93 ) 男 , 建 福 州人 , 理 实 验 师 , 18 一 , 福 助 工程 硕 士 , 究 方 向 为 软件 设 计 与 软 件 工 程 研

r] - 审口 _
— —
1 . ......... . . ...... . . . .
监控采集 系统
UB s
—— 文件存储设备
域 。设计 开发一套视频监控采集 系统 具有很强 的市场
价 值
图 1 系 统 硬件 架 构
1 总体 设 计
11 设 计 思路 . 系统 的总体设计 目标就是构建一个高质 量 、可靠 性好 、 控制灵活 和易于扩展架构 的视频监控采集 系统 。

用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);

基于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++]DirectShow检测音视频输入设备及其采集参数

[C++]DirectShow检测音视频输入设备及其采集参数

[C++]DirectShow检测⾳视频输⼊设备及其采集参数创建CLR类库项⽬(CSharpDirectShow),编写托管的DirectShow类库,右键项⽬属性-->链接器--> 输⼊-->附加依赖项;添加静态库⽂件Strmiids.lib和Quartz.lib;定义头⽂件CSharpDirectShow.h,包含头⽂件dshow.h,定义如下⽅法:#pragma once#include <dshow.h>using namespace System;using namespace System::Runtime::InteropServices;public ref class DirectShow{public:///<summary>///在当前线程上初始化COM库,并将并发模型标识为单线程单元(STA)///</summary>///<returns></returns>static Boolean ComInit();///<summary>///关闭当前线程上的COM库,卸载该线程加载的所有DLL,释放该线程维护的所有其他资源,并强制关闭该线程上的所有RPC连接///</summary>static void ComUinit();///<summary>///获取视频输⼊设备///</summary>///<param name="devices"></param>///<returns></returns>static Int32 GetVideoInputDevices([Out]array<VideoInputDsDevice^>^% devices);///<summary>///获取⾳频输⼊设备///</summary>///<param name="device"></param>///<returns></returns>static Int32 GetAudioInputDevices([Out]array<AudioInputDsDevice^>^% device);};其中,初始化COM库只能在STA线程调⽤,控制台程序直接调⽤会返回失败,在Winform和WPF等应⽤程序应该在第⼀次使⽤时初始化COM 库;当前线程初始化COM库和关闭COM库:Boolean DirectShow::ComInit(){HRESULT hr = CoInitialize(NULL);return hr == S_OK || hr == S_FALSE;}void DirectShow::ComUinit(){CoUninitialize();}1、创建视频输⼊设备的枚举器IEnumMonikerHRESULT DirectShow::EnumerateDevices(REFGUID category, IEnumMoniker** ppEnum){// 创建系统设备枚举器ICreateDevEnum* pDevEnum;HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));if (SUCCEEDED(hr)){// 为类别创建枚举数.hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0);if (hr == S_FALSE)hr = VFW_E_NOT_FOUND; // 类别是空的,视为错误pDevEnum->Release();}return hr;}Int32 DirectShow::GetVideoInputDevices([Out]array<VideoInputDsDevice^>^% devices){devices = nullptr;IEnumMoniker* pEnum;HRESULT hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum); // 创建视频输⼊设备枚举器if (FAILED(hr))return hr;hr = EnumerateVideoInputDevices(pEnum, devices); // 枚举视频输⼊设备pEnum->Release();return hr;}2、调⽤IEnumMoniker::Next()⽅法枚举设备,调⽤IPropertyBag::Read⽅法读取设备属性,以获取设备的友好名称和设备标识字符串:HRESULT DirectShow::EnumerateVideoInputDevices(IEnumMoniker* pEnum, [Out]array<VideoInputDsDevice^>^% devices){HRESULT hr = S_FALSE;devices = nullptr;List<VideoInputDsDevice^>^ list = gcnew List<VideoInputDsDevice^>();IMoniker* pMoniker;while (pEnum->Next(1, &pMoniker, NULL) == S_OK){IPropertyBag* pPropBag;hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));if (FAILED(hr)){pMoniker->Release();continue;}VideoInputDsDevice^ device = gcnew VideoInputDsDevice();VARIANT var;VariantInit(&var);// 获取设备友好名hr = pPropBag->Read(L"FriendlyName", &var, 0);if (FAILED(hr))hr = pPropBag->Read(L"Description", &var, 0);if (SUCCEEDED(hr)){device->FriendlyName = System::String(var.bstrVal).ToString();VariantClear(&var);}// 获取设备Moniker名LPOLESTR pOleDisplayName = reinterpret_cast<LPOLESTR>(CoTaskMemAlloc(MAX_MONIKER_NAME_LENGTH * 2));hr = pMoniker->GetDisplayName(NULL, NULL, &pOleDisplayName);if (SUCCEEDED(hr)){device->MonikerName = System::String(pOleDisplayName).ToString();array<VideoParams^>^ params;hr = EnumerateVideoParams(pMoniker, params); // 枚举设备的采集参数if (SUCCEEDED(hr))device->Params = params;}CoTaskMemFree(pOleDisplayName);list->Add(device);pPropBag->Release();pMoniker->Release();}devices = list->ToArray();return S_OK;}3、枚举视频输⼊设备的采集参数:HRESULT DirectShow::EnumerateVideoParams(IMoniker* pMoniker, [Out]array<VideoParams^>^% params){params = nullptr;IBaseFilter* pFilter;HRESULT hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);if (FAILED(hr))return hr;IEnumPins* pinEnum;hr = pFilter->EnumPins(&pinEnum);if (FAILED(hr)) {pFilter->Release();return hr;}List<VideoParams^>^ list = gcnew List<VideoParams^>();IPin* pPins;while (pinEnum->Next(1, &pPins, NULL) == S_OK){PIN_INFO pinInfo;hr = pPins->QueryPinInfo(&pinInfo);if (FAILED(hr) || pinInfo.dir != PINDIR_OUTPUT){pPins->Release();continue;}IEnumMediaTypes* mtEnum;hr = pPins->EnumMediaTypes(&mtEnum);if (FAILED(hr)){pPins->Release();continue;}AM_MEDIA_TYPE* mt;while (mtEnum->Next(1, &mt, NULL) == S_OK){VideoParams^ param = nullptr;if (mt->formattype == FORMAT_VideoInfo){VIDEOINFOHEADER* pVih = reinterpret_cast<VIDEOINFOHEADER*>(mt->pbFormat);param = gcnew VideoParams();param->FrameWidth = pVih->bmiHeader.biWidth;param->FrameHeight = pVih->bmiHeader.biHeight;param->AverageFrameRate = pVih->AvgTimePerFrame == 0 ? 0 : 10000000 / pVih->AvgTimePerFrame;}else if (mt->formattype == FORMAT_VideoInfo2) {VIDEOINFOHEADER2* pVih = reinterpret_cast<VIDEOINFOHEADER2*>(mt->pbFormat);param = gcnew VideoParams();param->FrameWidth = pVih->bmiHeader.biWidth;param->FrameHeight = pVih->bmiHeader.biHeight;param->AverageFrameRate = pVih->AvgTimePerFrame == 0 ? 0 : 10000000 / pVih->AvgTimePerFrame;}if (param && param->AverageFrameRate > 1){Boolean isExit = false;for each (VideoParams ^ item in list){if (item->FrameWidth == param->FrameWidth && item->FrameHeight == param->FrameHeight && item->AverageFrameRate == param->AverageFrameRate) {isExit = true;break;}}if (!isExit)list->Add(param);}}pPins->Release();}pFilter->Release();params = list->ToArray();return S_OK;}调⽤代码及结果:var ret = DirectShow.GetVideoInputDevices (out VideoInputDsDevice[] videoInputDevices);if (ret == 0) {Console.WriteLine ("视频输⼊设备:");foreach (var videoInputDevice in videoInputDevices) {Console.WriteLine ($"{videoInputDevice.FriendlyName}\t{videoInputDevice.MonikerName}");if (videoInputDevice.Params.Length > 0) {Console.WriteLine ("像素宽度\t像素⾼度\t1秒平均帧数");foreach (var param in videoInputDevice.Params) {Console.WriteLine ($"{param.FrameWidth}\t{param.FrameHeight}\t{param.AverageFrameRate}");}}Console.WriteLine ();}}ret = DirectShow.GetAudioInputDevices (out AudioInputDsDevice[] audioInputDevices);if (ret == 0) {Console.WriteLine ("⾳频输⼊设备:");foreach (var audioInputDevice in audioInputDevices) {Console.WriteLine ($"{audioInputDevice.FriendlyName}\t{audioInputDevice.MonikerName}");if (audioInputDevice.Params.Length > 0) {Console.WriteLine ("⾳频格式\t通道数\t采样速率\t块对齐\t位数");foreach (var param in audioInputDevice.Params) {Console.WriteLine ($"{param.Format}\t{param.Channels}\t{param.SampleRate}\t{param.BlockAlign}\t{param.BitsPerSample}"); }}Console.WriteLine ();}}。

基于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视频采集系统

DirectShow视频采集系统目前,多媒体技术飞速发展,各行业对多媒体技术的应用也越来越广泛,传统的视频采集技术存在着一定的局限性,不能很好的应用于当前的视频系统。

本文提出了一种基于DirectShow的视频采集系统,克服现状。

本文采用的一种基于DirectShow的视频采集系统支持多种格式的视频文件的捕捉和回放,也支持使用Windows驱动模型(WDM)设备或过去的VFW设备。

在开发过程中是基于组件对象模型(COM),通过编写COM客户程序来实现视频的采集回放等功能。

在具体实现过程中通过编写Filter来实现各功能模块,最后把各功能模块通过Filter Graph组建起来。

标签:DirectShow 视频采集COM一、引言随着多媒体技术的不断发展,与之相关的软件与硬件层出不穷,现在与多媒体视频会议(Video Conference)、视频对话相关的软硬件正成为人们关注的热点应用。

而在这些应用中无不涉及视频数据的采集。

传统的视频采集技术存在诸多的局限性,无法很好地应用于当前的各类视频系统。

针对这一现状,本文提出了一种先进的基于DirectShow的视频采集系统。

该系统充分利用DirectShow与WDM视频采集卡的良好集成特性,采用组件对象模型的系统架构,克服了传统视频采集技术的不足,在实际应用中取得了满意的效果。

二、DirectShow技术微软DirectShow是微软windows平台上的流式媒体体系结构。

DirectShow 提供媒体流的高质量的捕捉与回放。

它支持多种格式,包括高级流格式,活动图片专家组格式,音频-视频交叉格式,第三层mpeg格式(mp3)和wav文件格式。

他也支持使用windows驱动模型设备或老的windows视频设备的捕捉。

DirectShow 与其他DirectX技术集成于一体,自动感觉和使用视频和音频硬件加速,同时也支持没有硬件加速的系统。

DirectShow简化了媒体回放,格式转换和捕捉任务。

基于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)。
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。代码如下:
图2.12添加视频捕捉源过滤器窗口
提示:如果系统中没有安装摄像头及其驱动程序,该节点下将不会有视频捕捉源过滤器。
(3)在“DirectShow Filters”节点下选择“Video Renderer”过滤器,将其添加到图表中,如图2.13所示。
图2.13添加“Video Renderer”过滤器窗口
//查找引脚
IPin* CKinescopeDlg::FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir)
{
IEnumPins* pEnumPins;
IPin* pOutpin;
PIN_DIRECTION pDir;
pFilter->EnumPins(&pEnumPins);
varName.vt = VT_BSTR;
pProp->Read(L"FriendlyName", &varName,0);
CString str = varName.bstrVal;
if (str.Find("Microsoft Video 1",0)!= -1)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCompress);
//枚举视频设备
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);
IEnumMoniker *pClassEnum = NULL;
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);
pMoniker->Releaseum->Release();
而下面的代码则用于判断系统中是否安装了指定的视频压缩器。
ICreateDevEnum *pDevEnum = NULL;
(4)利用鼠标将视频捕捉源过滤器的“Capture”引脚与“Video Renderer”过滤器的“VMR Input0”引脚相连,如图2.14所示。
图2.14连接过滤器引脚窗口
(5)单击工具栏中的“ ”按钮运行过滤图表,将显示一个视频预览窗口,如图2.15所示。
图2.15视频预览窗口
2.3.3
使用Graph Edit工具,用户可以非常方便地获得与某一系统设备相关的过滤器。但是,在程序中该如何获得这些过滤器呢?
while (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag* pProp= NULL;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)&pProp);
VARIANT varName;
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
ULONG cFetched;
while (pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
(2)在“DirectShow Filters”节点下将“Video Render”过滤器添加到图表中,如图2.17所示。
pMoniker->Release();
break;
}
VariantClear(&varName);
}
pClassEnum->Release();
2.3.4
每一个过滤器(Filter)至少应有一个引脚(Pin),或者是输入引脚或者是输出引脚。有些过滤器还拥有多个引脚,即又输入引脚又有输出引脚。但是过滤器的输入、输出引脚并不是对应的,有些过滤器可以有多个输入引脚,而只有一个输出引脚或者没有输出引脚。在程序中为了连接过滤器间的引脚,通常需要获得过滤器的各个引脚。用户可以使用IEnumPins接口来枚举某一个过滤器的输入、输出引脚。过滤器IBaseFilter提供了一个EnumPins方法用于生成一个IEnumPins接口实例,这样,通过调用IEnumPins的Next方法便可以访问各个引脚了。下面的代码定义了一个FindPin函数,用于获得某个过滤器的输入或输出引脚。
pComIn = FindPin(pCompress,PINDIR_INPUT);
pComOut = FindPin(pCompress,PINDIR_OUTPUT);
2.3.5
使用Graph Edit工具,用户可以利用鼠标非常方便地连接两个过滤器间的引脚。但是在程序中却没这么简单了。首先需要按照2.3.4节介绍的方法获得两个过滤器的输入、输出引脚,然后将第一个过滤器的输出引脚连接到第二个过滤器的输入引脚,其中,连接两个引脚需要调用IGraphBuilder接口的ConnectDirect方法。下面的代码演示了如何连接两个过滤器的引脚。
图2.10 Graph Edit工具
下面笔者介绍如何使用Graph Edit工具设计过滤图表,过滤图表的功能是实现视频的预览功能。具体步骤如下:
(1)在图2.4中单击“Graph/Insert Filters”菜单项打开“添加过滤器”窗口,如图2.11所示。
图2.11添加过滤器窗口
(2)在“Video Capture Sources”节点下选择一个视频捕捉源过滤器,单击“Insert Filter”按钮将其添加到过滤图表中,如图2.12所示
(1)启动Graph Edit工具,在Graph Edit工具中单击“Graph \Insert Filters”菜单项打开“添加过滤器窗口”,在“Video Capture Sources”节点下选择一个视频捕捉源过滤器,单击“Insert Filter”按钮将其添加到过滤图表中,如图2.11所示。
在上面的描述中,ICreateDevEnum实例的CreateClassEnumerator方法的第一个参数确定枚举的系统设备。例如,第一个参数为CLSID_VideoInputDeviceCategory,表示将要枚举系统中的视频捕捉卡,为CLSID_VideoCompressorCategory,表示枚举系统中的视频压缩器。下面的代码演示了如何枚举系统中的视频捕捉卡。
用户可以采用枚举的方式列举系统中安装的设备。以列举系统中的视频捕捉设备为例,首先定义一个设备列举接口ICreateDevEnum的一个指针,调用CoCreateInstance方法创建ICreateDevEnum实例,然后定义一个列举监视器IEnumMoniker的一个指针,调用ICreateDevEnum实例的CreateClassEnumerator方法创建IEnumMoniker实例,最后以循环的方式调用IEnumMoniker实例的Next方法遍历系统设备,调用IEnumMoniker实例的BindToObject方法将系统设备绑定到过滤器上。
#pragma comment (lib,"Strmiids")
#pragma comment (lib,"quartz")
#include <dshow.h>
2.3.2 Filter
为了方便用户设计过滤图表,DirectX提供了一个Graph Edit工具。用户可以单击“开始”菜单下的“Microsoft DirectX 9 SDK\DirectX Utilities\Graph Edit”菜单项打开Graph Edit工具,如图2.10所示。
相关文档
最新文档