没有合适的资源?快使用搜索试试~ 我知道了~
基于DirectShow视频及图片捕获软件的开发
4星 · 超过85%的资源 需积分: 9 30 下载量 80 浏览量
2012-02-18
10:32:49
上传
评论
收藏 359KB DOC 举报
温馨提示
试读
22页
基于DirectShow视频及图片捕获软件的开发 有详细的说明文档及源代码,对于刚用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
的驱动,我们的软件对映美精相机的识别是如此的容易。接下来我们将继续开
发基于其它驱动的图像捕获软件,为最终实现在一个软件中识别各种相机而努
力。我们将逐步开放我们的源代码,以便更多的同行一起来探讨相机的图像采
集技术。
下面是详细的软件开发过程。
一、
安装
DirectShow
和
visual studio 2005
首先我们安装 DirectShow SDK,它有许多版本,作者使用的是 2003 年
发布的 dx90bsdk.exe,安装在 D 盘的 DXSDK 下。软件下载地址为 http://download.
microsoft.com/download/b/6/a/b6ab32f3-39e8-4096-9445-d38e6675de85/dx90bsdk.exe。
然后安装好 visual studio 2005。安装完以后我们将进行开发环境的配置。
二、开发环境配置
开发环境的配置主要有两个工作要做:一是在使用 Directshow SDK 开发
自己的程序时需要的 DirectShow 的有关静态库的配置,二是 visual C++开
发环境的配置。
1、 生成 DirectShowSDK 开发库
使用 DirectShow SDK 开发用户自己的程序需要几个静态链接库:
quartz.lib、strmbasd.lib、STRMBASE.lib 和 strmiids.lib。中间两个 lib 需要用户自己编译
生成,而其他两个微软已经提供。下表列出了使用 DirectShow SDK 开发程序所有要使
用的库。
!库名 !功能说明
!Strmiids.lib
定义了 DirectShow 标准的输出类标识(CLSID)和接口标识(IID)
Strmbasd.lib
流媒体开发用到的库,Debug、Debug_Unicode 版本
Strmbase.lib
流媒体开发用到的库,Release、Release_Unicode 版本
Quartz.lib
定义了导出函数 AMGetErrorText
Winmm.lib
使用 Windows 多媒体编程用到的库
基于 VC++2005 开发软件使用 DirectShowSDK,首先需要用户编译 DirectShow 自带的源代码工程 baseclasses,以生成 DirectShowSDK 的不同版本的库。同
时由于 DirectShowSDK 是早期的 VC 开发软件,所以使用 VC++2005 编译 DirectShowSDK 会出现很多编译问题。下面列出了详细的编译过程和问题分析、
解决方法。
1.1 编译工程 baseclasses 工程
启动 VS2005,选择“文件”→“打开”→“项目/解决方案”命令,在弹出的对话
框中打开“BaseClasses”项目。
打开“baseclasses.sln”项目。如果 VS2005 有提问,则默认同意或确定。
现在就开始编译该项目。按“F7”快捷键可以编译生成项目。初次编译 VS2005
会报很多错误或者警告,有的需要我们手工修改程序,或者修改 VS2005 环境
配置或编译选项;有的是一类问题,解决方法也有很多种。具体解决方法请参
考路锦正的《Visual C++音频/视频处理技术及工程实践》第 225 页-229 页。
1.2 Visual C++开发环境配置
有了 DirectShow SDK 库,用户就可以使用这些库来开发自己的程序了。
为了能让 VC++自动搜寻到 SDK 库和头文件,还需要对 VC++的开发环境进
行配置。添加库或路径的时候,根据你的要求添加
Debug、Release、Debug_Unicode、Release_Unicode 版本的库所在路
径。下面假定添加非 Unicode 版本的库或路径。
首先确定 VC2005 是否已经包含了库和头文件所在的路径,因为在安装
VC2005 时,它会自动添加该目录。如果没有,则需要用户手工添加。
1. 更改添加的 include 内容:
D:\DXSDK\Include
D:\DXSDK\Samples\C++\DirectShow\BaseClasses
D:\DXSDK\Samples\C++\Common\Include
添加过程如下。选择“工具”→“选项”命令,在“项目和解决方案下”选择“VC+
+目录”,在下拉框中选择“包含文件”选项,将上面的三个 Include 内容添加
进去。
2. 更改添加 lib 路径
要添加的 lib 内容:
D:\DXSDK\Lib
D:\DXSDK\ Samples\C++\DirectShow\BaseClasses\Debug
D:\DXSDK\ Samples\C++\DirectShow\BaseClasses\
Debug_Unicode
D:\DXSDK\ Samples\C++\DirectShow\BaseClasses\Release
D:\DXSDK\ Samples\C++\DirectShow\BaseClasses\
Release_Unicode
添加过程和 Include 内容相似,只是在下拉框中选择“库文件”选项。
3. 添加链接库支持
上面的设置是在 VC2005 的开发环境的目录(Directories)中,添加用
户在开发中可能用到的库或头文件“路径”,需要明确的事文件夹,而不是具体
的文件。所以,要使用相关的库支持,还要用户明确地把要使用的库包含、添
加到开发环境中。
基于 DirectShow SDK 开发流媒体应用程序,一般需要链接 strmiids.lib
和 quartz.lib,前者定义了 DirectShow 标准的类标识符 CLSID 和接口标识
IID,后者定义了导出函数 AMGetErrorText(如果应用程序中没有使用这个函
数,也可以不链接这个库)。
在编译生成 DirectShow 的 BaseClasses 库
strmbasd.lib、STRMBASE.lib 时,由于该工程是生成库而不是应用程序,所
以在编译该项目时 VC++2005 没有“链接器”选项。但是在开发其他应用可执
行程序时,需要添加 DirectShow SDK 库的支持。添加路径:项目→属性→配
置属性→链接器→输入→附加依赖项,输入 strmiids.lib quartz.lib,库名之
间用空格分开。另外,在程序中使用 DirectShow SDK 类或接口的代码程序中,
还要添加#include<dshow.h>。
在添加链接库时,除了以上配置 VC 的开发环境外,也可以在源程序文件
开头部分,直接语句编程引入#pragma comment(lib,”strmiids.lib”)。
如果程序中没有使用 dshow.h,而是包含了 stream.h,则库文件需要链接
strmbased.lib、winmm.lib,在源程序文件开头添加:
#pragma comment(lib,”strmbasd.lib”)
#pragma comment(lib,”winmm.lib”)
#include <streams.h>
不过,编译器会报出以下的错误。
error C2146:语法错误为缺少“;”(在标识符“m_pString”的前面)。
问题定位在 wxdebug.h(329)中。经分析得知,由于某种原因,编译器认
为 PTCHAR 没有定义,那用户可以在类外定义:typedef WCHAR
*PTCHAR; 再编译项目。
三、开发过程
DirectShow SDK 的视频采集经典技术是使用 ICaptureGraphBuilder2 标准接口,利用其方
法 RenderStream 自动建立、连接滤波器链表。RenderStream 方法在预览、捕获视频时引脚的
类型分为 PIN_CATEGORY_PREVIEW 和 PIN_CATEGORY_CAPTURE,媒体类型均为
MEDIATYPE_Video。此实例要完成的目的有两个:一是实时预览采集的视频数据;二是在预览图
像的同时,实时地把捕获数据保存到文件中。首先我们使用 GraphEdit 模拟实现该过程。
1、 GraphEdit 模拟实现
步骤一、添加"Video Capture Sources"视频捕获设备,如图 1 所示。
!
图
1
、添加视频捕获设备
步骤二、视频捕获滤波器只有一个 Pin,而我们要求在预览数据的同时还能够保存数据,即需要
一个组件把捕获的流分成两个。DirectShow SDK 为此提供了 Smart Tee 滤波器,把捕捉的视频
流分成两个流供使用。在 GraphEdit 中单击"DirectShow Filters"按钮,插入"Smart Tee"滤波器,
如图 2 所示
!
图
2
添加
Smart Tee
滤波器
步骤三、采集捕捉的视频数据保存到文件,以 AVI 格式写文件。插入"AVI Mux"滤波器,如图
3 所示。‘
剩余21页未读,继续阅读
yankaihappy
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页