DirectShow环境配置(VC6)

1. 简介:

   DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。DirectShow整合了其它的DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。

   2. 环境安装:

  因为我系统比较多,所以我在三个系统上做了个简单的配置,我每套系统的配置都写下来,以方便读者自己参考:

   1.Windows XP x32 下:(中文)

OS 版本: Windows XP SP3 Professional

Windows SDK 版本: Windows XP SP2 FULL

DirectX SDK DirectX 9.0 SDK Update - (Summer 2004)

   2.Windows Vista x64 :(英文)

OS 版本: Windows Vista x64 SP1 Ultimate

Windows SDK 版本: Windows 2003 SP1 RTM

DirectX SDK DirectX 9.0 SDK Update - (Summer 2004)

   3.Windows Server 2008 :(英文)

OS 版本: Windows Server 2008 Enterprise Edition x32

Windows SDK 版本: Windows SDK for Windows 2008 and .NET Framework 3.5 SP1

DirectX SDK DirectX 9.0 SDK Update - (Summer 2004)

   注:这里选择 DirectX 9.0 SDK Update - (Summer 2004) 的版本是因为这个版本是 DirectX SDK 中最后一个整合了 DirectShow 的版本,我个人觉得这个版本配置稍稍简单,其他版本我没有尝试过,应该问题不会太大。

   还有,开发平台都是 VC6.0 ,这个平台我测试过,在 Windows XP Windows Vista Windows Server 2008 以及 Windows 7 下边都可以安装,只是有一点需要注意,在下边三个系统安装的时候需要注意一点:

   Windows Vista Windows 2008 Windows 7

   在安装 VC6.0 的时候需要让你选择需要安装的组件,在选择安装组件的时候,有一个选项是“企业工具”

(英文“ Enterprise Toos ”),选中过后点击右边的“修改选项”或者“ Change Option ”,里面有一个项是: Visual Studio Analyzer ,去掉这个选项就可以在这三个平台安装 VC6.0 了。当然一般不会有人在这三个系统安装 VC6.0 ,但对于怀念这个平台的人可以试试,嘿嘿,仅作为参考。

   3. 编译 BaseClasses

   单独提取编译 BaseClasses 的章节,希望对所有编译 BaseClasses 的兄弟有帮助。

   1 )首先打开 VC6.0 ,新建一个项目,项目类型选择 Win32 Static Library ,这里需要说明一下,如果要使用 VC6.0 的来编译 BaseClasses ,因为该版本下边没有 VC6.0 的工程文件,所以最好自己创建工程文件,来完成编译过程,创建一个 Win32 Static Library 项目;

   2 )设置相关参数:

  这里应该是不需要,为了保证编译好的 Lib 的名字和网上大部分配置相同,点击 Project->Settings ,在 Library 标签里面设置相关的输出, Output file name :默认是项目名称,本人是这样修改的:

   Debug 版本: Debug/strmbasd.lib

   Release 版本: Release/strmbase.lib

  然后就可以编译了!!兴奋中,期待的版本吻合的 baseclasses lib 快出来了。

   3 )错误信息:

  别高兴太早,这里会有一个编译错误,错误信息如下:

   wxutil.cpp(277) : error C2065: 'COINIT_DISABLE_OLE1DDE' : undeclared identifier

  这个问题我搜了网上很多地方,后来发现了一个替代解决方案,变量未定义,但是有办法解决,找到源代码 wxutil.cpp 277 行:

   hr = (*pCoInitializeEx)(0,COINIT_DISABLE_OLE1DDE );

  将变量 COINIT_DISABLE_OLE1DDE 改成整数 4

   hr = (*pCoInitializeEx)(0,4);

   这样就可以编译通过了,在编译的时候记得编译两个版本,版本的切换在菜单 Build->Set Active Configuration 里面可以切换激活版本,就可以编译两个不同的版本到项目对应的目录下。然后把编译好的两个文件夹 Debug Release 放到对应的 BaseClasses 文件夹下边:

   DirectX SDK 安装目录 / Samples/C++/DirectShow/BaseClasses 下边就可以了。

   4. 配置 DirectShow 针对所有项目的环境:

  因为有些头文件是 Windows SDK 下边的,所以建议最好装一个 Windows SDK ,否则缺少头文件会在 Link 过程报错。

  打开 Tools->Option…->Directories 里面:

  首先选择 Include files

   DirectX SDK 安装目录 /Include

   DirectX SDK 安装目录 / Samples/C++/ Common

   DirectX SDK 安装目录 / Samples/C++/DirectShow/BaseClasses

   Windows SDK 安装目录 /Include

   VS6.0 安装目录 /VC98/INCLUDE

   VS6.0 安装目录 /VC98/MFC/INCLUDE

   VS6.0 安装目录 /VC98/ALT/INCLUDE

  然后选择 Library files

   DirectX SDK 安装目录 /Lib

   DirectX SDK 安装目录 / Samples/C++/DirectShow/BaseClasses /Debug

   DirectX SDK 安装目录 / Samples/C++/DirectShow/BaseClasses /Release

   Windows SDK 安装目录 /LIB

   VS6.0 安装目录 /VC98/LIB

   VS6.0 安装目录 /VC98/MFC/LIB

  网上很多文章都写了这段,但是我不清楚 Debug 版本和 Release 版本为什么都要放上去,索性就和他们一样放了两个版本的目录。

   注:顺序不能错,蓝色部分是原来就有的,红色是添加的, Include 中第二项 Common 那个好像可以不需要,我只是一个个例,做参考,所以写上去。

   5. 项目设置 

  创建一个项目过后,首先要引入项目所需要的库文件:

  选择 Project->Settings->Link 标签,然后在选项 Object/library modules: 中输入以下的几个 Lib

   Debug strmbasd.lib strmiids.lib quartz.lib

   Release strmbase.lib strmiids.lib quartz.lib

  注:网上参考资料如果要引用头文件 streams.h 才需要 BaseClasses 相关内容,如果不引用不需要前面两个库,我没有验证过,而且如果引入头文件 streams.h ,还需要另外两个库 uuid.lib winmm.lib ,我的基本配置: strmbasd.lib strmiids.lib quartz.lib uuid.lib winmm.lib 几个库文件

  然后随便找个例子试试,我使用的例子是一个采集摄像头视频数据的例子,如果编译通过可以运行就证明环境没有问题。

   6. 遇到的问题

   1 winnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'

   2 error C4430: missing type specifier - int assumed. Note: C++ does not support

default-int

   3 error C2065: 'Count' : undeclared identifier

   这三个问题是在 VS2005 中编译的时候遇到的,这个参考 BLOG

  http://hi.baidu.com/jsufcz/blog/item/f2bfb18f9f2bddfc503d92ee.html

   第一类问题的解决: project->BaseClasses properties->configuration->C/C++ -> General-

>Additional Include Directories 里面的内容( .,../../../../include )删掉,重新编译,

PVOID64 的错误消失,原因如下:

POINTER_64 是一个宏,在 64 位编译下起作用,它包含在 SDK 目录下的 BASETSD.H 中( Microsoft Visual Studio 8/VC/PlatformSDK/Include/basetsd.h(23):#define POINTER_64 __ptr64 ),但

DXSDK 自己也带了一个 basetsd.h ,里面没有定义 POINTER_64 ,从而导致出错,只需要改变 include

files 的优先级即可。。当然,也可以改写 winnt.h 中的代码,将

typedef void *PVOID;

typedef void * POINTER_64 PVOID64;

改成

typedef void *PVOID;

typedef void * POINTER_64;

typedef void * PVOID64;

  第二类问题的解决:错误发生在: operator=(LONG); 函数定义中,这是因为在 VC6 中,如果没有显示的指定返回值类型,编译器将其视为默认整形;但是 vs2005 不支持默认整形,解决这个问题不能修改每个没有显示指示返回值类型的函数地方,可以用 wd4430 来解决;具体的在工程选项中的 c++/Command Line 中添加 /wd4430 即可。

  第三个错误发生在 for 循环中, vc6 for 循环中定义的变量相当于在 for 外面定义,可以在 for 之外地方使用;但是 vs2005for 循环中定义变量相当于域 {} 变量,只能在 for 循环中使用。要解决这个问题,可以通过修改 vs2005 的工程选项:” Project Option ”——“ C++ ”——“ Language ”——“ Force Comformance in For Loop Scrope 设置为 No 即可。完成上面的设置, BaseClass 工程基本可以编译通过了。

   4 wxutil.cpp(277) : error C2065: 'COINIT_DISABLE_OLE1DDE' : undeclared identifier

    此问题见上边的解决方案,是使用VC6.0在编译BaseClasses的时候遇到的错误。

  本人在配置过程是以 AVChat 例子来进行的环境测试:

   5 uuid.lib(objidl_i.obj) : fatal error LNK1103: debugging information corrupt; recompile module

  这个问题是因为两个 uuid.lib 的冲突

  解决:

  把 WindowsSDK uuid.lib 移除并备份,注:不要移错了, DirectXSDK 下的 uuid.lib不要 移除,否则编译又会有错,移除或者重命名 uuid.lib ,改掉其后缀名,反正使得 uuid.lib 文件不在 Windows SDK 下边就可以了。

   6 )注:这是警告信息,不是错误:

    LINK : warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library

   总结一下,消除这种警告信息就在同样的位置:

  选择 Project->Settings->Link 标签,下拉选择 Input ignore libraries 中加上报警告的 lib 名称。

   7 strmif.h(1018) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE'

  此问题比较常见,此问题是 Include 配置的时候的顺序问题,如果把 Windows SDK 的顺序配置到了前边那么这个问题就会存在,如果顺序严格按照上边的配置顺序来,此问题就有可能没有了,这个问题会导致编译通不过,是一个很常见的问题。

   8 error LNK2001: unresolved external symbol _CLSID_FilterGraph

  此问题是因为链接下边缺少库文件: strmiids.lib quartz.lib ,这个问题追溯到上边引入头文件 streams.h 的时候没有添加此库就可能出现此问题。

   9 )error LNK2001: unresolved external symbol "class ATL::CAtlBaseModule ATL::_AtlBaseModule" (?_AtlBaseModule@ATL@@3VCAtlBaseModule@1@A)

   此问题是因为头文件 #include <initguid.h> 过后,缺少了包 atls.lib ,把 atls.lib 包引入就应该可以编译通过。

   另编译时出现了 DWORD_PTR 或者其他什么类型未定义之类的错误,是因为微软把 BASETSD.H DirectX SDK 发行包里拿掉了,这个文件在 Platform SDK 里有,在 VC Include 路径中把 Platform SDK include 路径提到最前面就可以了。 Platform SDK ,最后一个支持 VC6 Platform SDK February 2003 Edition

/

/

下面是配置过程:
1,使用VC向导生成一个具体项目,如Win32 Dynamic-Link;

2,包含头文件streams.h;

3,在VC的菜单中选择Project|Settings|C/C++,在弹出的对话框中的Category中选择Code generation,然后在Calling convention中选择_stdcall;

4,使用多线程语言运行时库,即在VC的菜单中选择Project|Settings|C/C++,在弹出的对话框中的Category中选择Code generation,然后在Use run-time library中,Debug版选择Debug Multithreaded,Release版选择Multithreaded。

5,配置必要的链接库文件,即在VC的菜单中选择Project|Settings|Link,在弹出的对话框中的Category中选择General,然后在Object/library modules中输入如下代码:

     Debug版本    strmbasd.lib, msvcrtd.lib, winmm.lib

     Release版本 strmbase.lib, msvcrt.lib, winmm.lib

并且选中Ignore all default libraries。

DirectShow SDK建议,DirectShow应用程序应该至少连接库文件strmiids.lib和quartz.lib。前者定义了DirectShow标准的CLSID和IID,后者定义了导出函数AMGetErrorText(如果应用程序中没有使用到这个函数,也可以不连接这个库)。如果程序里包含了头文件streams.h,则一般库文件还要连接strmbasd.lib、uuid.lib、winmm.lib。

6,将DirectX SDK的Include和Lib目录配置到VC的系统目录中去,并且放在标准的VC目录之前,以保证编译器能够拿到最新版本的源文件。选择Tools|Options|Directories,在弹出的对话框中的Show directories for中选择Include files,配置如下(假设DirectX SDK安装在D:/DXSDK目录下,VC安装在C:/Program Files下):

     D:/DXSDK/Include

     D:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES

     D:/DXSDK/SAMPLES/C++/COMMON/INCLUDE

     C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE

     C:/Program Files/Microsoft Visual Studio/VC98/MFC/INCLUDE

     C:/Program Files/Microsoft Visual Studio/VC98/ATL/INCLUDE

再在Show directories for中选择Library files,配置如下:

     D:/DXSDK/Lib

     D:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES/DEBUG

     D:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES/RELEASE

     C:/PROGRAM FILES/MICROSOFT SDK/LIB

     C:/Program Files/Microsoft Visual Studio/VC98/LIB

     C:/Program Files/Microsoft Visual Studio/VC98/MFC/LIB

7,因为DirectShow应用程序是一种COM客户程序,因此在调用任何COM函数之前调用CoInitialize()(或CoInitializeEx)函数进行COM库的初始化(一般是在应用程序启动的时候调用一次),在结束COM库使用时调用CoUninitialize()函数进行反初始化(一般是在应用程序退出前调用一次)。
----------------------------
配置时的问题【一定要注意】
1。include和lib的路径前后顺序一定要“非常严格按照上面顺序排列”,否则
   1.1 DXSDK/Include和VC98/INCLUDE有头文件名是重名的,例如control.h,strmif.h。所以要优先选择DXSDK的文件声明。
   2.1 DXSDK/Lib和VC98/LIB对 DWORD_PTR 这个数据类型的声明顺序出现编译上连接的歧异!!!!

2。BASECLASSES/DEBUG和BASECLASSES/RELEASE目录和目录里面是内容是没有的,如果你在应用程序中使用了BASECLASSES里面的class,function,filter,interface,就要先用VC编译baseclasses.dsw,编译时请分别选定DEBUG和RELEASE,因为baseclasses.dsw有4个版本,而且默认下都不是DEBUG和RELEASE。编译后生成两个重要文件:strmbasd.lib(Debug),STRMBASE.lib(Release),在以后将用到。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值