DirectShow采集视频图像,开发环境的搭建,amcap编译运行
实验室要采集USB摄像头数据并显示,下面介绍这两天学习的两种方法。
使用VFW(video 4 windows)类库采集视频
VFW采集视频数据很简单,有大量的API接口调用即可,在实际操作过程中,发现VFW对Win7/Win8支持相当差,接几个USB摄像头后,capDriverConnect()连接失败,虽然网上给了一些解决方法,但都不靠谱,微软论坛找了半天,也没发现根源,故放弃使用此方法。使用DirectShow组件来采集视频
DirectShow是微软开发的的组件,之前和DirectX集成在一起,后来从DirectX中移除,包含Microsoft Windows SDK中,从官网上找了很多资料,下载了半天,也没找到DirectShow,后来干脆从网上下了一个DirectShow压缩包来用。下面具体记录一下怎样编译运行DirectShow中的例子amcap。- 先解压DirectShow SDK到任意目录,此SDK中包含了示例Amcap源码,但并未完全包含我们所需要的库,还需编译BaseClasses工程,才能生成我们需要的基本库baseclasses。
- 在VS2013中导入并编译 DirectShow SDK 安装路径下\ Samples\C++\DirectShow\BaseClasses 工程,可以编译为debug版本,也可以编译release 版本。编译成功后在\Samples\C++\DirectShow\BaceClasses\Debug_Unicode\目录下将产
生相应的库。 - 在VS2013中导入Amcap源码,右键点击工程选择 “属性–>配置属性–>VC++目录”
中进行操作:
*在包含目录中添加
DirectShow\Include;
DirectShow\Samples\C++\DirectShow\BaseClasses;
*在库目录中添加
DirectShow\Lib;
DirectShow\Samples\C++\DirectShow\BaseClasses\Debug_Unicode;
在“配置属性–>链接器目录”中进行操作:
*在附加库目录中添加
DirectShow\Samples\C++\DirectShow\BaseClasses\Debug_Unicode;
DirectShow\Lib;
点击工程“右键–>清理–>生成”,将生成exe可执行文件,即可调试。
在实际的操作过程中可能会遇到一些错误:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\atlcore.h(35): fatal error C1189: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher is recommended.
->网上有很多解决方法,修改stdafx.h等,试了一下不行。最后的解决方案是修改预编译处理。鼠标右键项目属性->配置属性->C/C++->预处理器-> 原本是:
_WINDOWS
WINVER=0x0400
DEBUG
WIN32
_DEBUG
_WIN32_WINNT=0x0400
修改为:
_WINDOWS
WINVER=0x0501
DEBUG
WIN32
_DEBUG
_WIN32_WINNT=0x0501
确定,重新编译。
LINK : fatal error LNK1104: 无法打开文件“atlsd.lib”
->使用VS2013及以上版本会出现此现象,原因是atlsd.lib这个库文件已经移除了,因为我电脑上同时装了VS2012,看里面有这个库文件,所以将VS2013里面的工具集改为VS2012。项目属性->配置属性->常规->平台工具集->visual studio 2012 重新编译OK。strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol “class CFactoryTemplate * g_Templates” (?g_Templates@@3PAVCFactoryTemplate@@A)strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol “int g_cTemplates” (?g_cTemplates@@3HA)
->打开BaseClasses工程,增加”FILTER_DLL” 定义 ,项目属性->配置属性->C/C++->预处理器->预处理器定义 -> FILTER_DLL 。然后再修改BaseClasses项目代码,sysclock.cpp做如下修改:
CFactoryTemplate g_Templates[1] = {
//{&CLSID_SystemClock, CSystemClock::CreateInstance}
{ L"SystemClock", &CLSID_SystemClock, CSystemClock::CreateInstance}
};
重新编译BaseClasses项目,产生新的strmbasd.lib文件,要看好amcap项目lib目录,需要修改amcap项目lib目录里的strmbasd.lib,之后重新编译amcap项目。
我在实验过程中仅遇到这3个问题,解决后amcap跑起来了,后面进行amcap代码学习阶段。