DirectShow采集视频图像,开发环境的搭建,amcap编译运行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/buynow123/article/details/49965493

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。

    1. 先解压DirectShow SDK到任意目录,此SDK中包含了示例Amcap源码,但并未完全包含我们所需要的库,还需编译BaseClasses工程,才能生成我们需要的基本库baseclasses。
    2. 在VS2013中导入并编译 DirectShow SDK 安装路径下\ Samples\C++\DirectShow\BaseClasses 工程,可以编译为debug版本,也可以编译release 版本。编译成功后在\Samples\C++\DirectShow\BaceClasses\Debug_Unicode\目录下将产
      生相应的库。
    3. 在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代码学习阶段。

AMCap源码:http://download.csdn.net/detail/buynow123/9289189

猜你喜欢

转载自blog.csdn.net/buynow123/article/details/49965493