DirectShow环境配置(VC6)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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),在以后将用到。

修改后好用的 directshow实务精选 AVCHAT程序 陆其明《directshow实务精选》中的AVCHAT程序 有几处错误 好不容易都改好了 分享一下 立即下载

相关推荐

vc6+Directshow+captureVideo摄像头编程开发笔记

该笔记介绍了VC6+Directshow+captureVideo摄像头编程开发中的环境配置和开发例子。旨在给需要的同志一个参考。写的不好或者是有错误的地方还请指出。谢谢!

DirectShow实务精选》实例源代码说明

======================================================================= Chapter02 | ----------     FilterImageGrabber:即时抓图的Filter。这是一个Trans-In-Place Filter,Filter注册名为“HQ Image Grabber”,仅支持RGB32/24/

csafu的专栏 1542

VC 打开摄像头 (使用DirectShow)

通过使用MFC中的CImage和DirectShow来打开摄像头,预览并保存图像。 代码不再维护。

DirectX的安装与配置(VC6.0)

首先安装下载好的DirectX,记住其安装目录 在创建DirectX的程序时创建Project选择win32 applicantion目录创建程序: 下面进行开发环境配置: 1.指定头文件和库文件的位置,在VC6.0中选择Tool->Options->Directories 在Show directories for:Library files中加入Direct的lib路径 ...

weixin_34378969的博客 568

Win7下设置DirectShow编译环境小结(特别的x64位环境)

1. 下载DirectShow 由于现在directShow没有和direcxtx一起发布,而是和windows sdk 打包发布了,Windows SDK 7.1 地址:http://www.microsoft.com/download/en/details.aspx?id=8442,或者到百度盘下载:http://pan.baidu.com/s/1i3TkpGp 按系统类型下载。

dijkstar的专栏 5779

VC6.0下directshow环境配置

      最近在学习directshow技术,刚开如看陆其明的directshow开发指南这本书还没有只是看了电子版,今天配置了下开发环境,在网上和书上看的分享下。    用 DirectShow SDK 作开发的环境变量配置,一 基本需求   1 include “DShow.h”   2 link StrmBase.lib(如果是 debug版本需要link StrmBasd.l

海贝的专栏 1590

VC编程报告——DirectShow环境配置VC6

  最近有一个C++视频开发项目,写个心得稍稍记录一下,以免以后忘记了。本文虽然是原创,但是整合了网上所有遇见的情况做了一个中和以及个人的一些经历写了这篇,请阅读者多多指教。  1.简介:  DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动

风中的索莉逖亚 3398

DirectshowVC6.0的环境配置

首先在本机上安装好VC6.0和Microsoft DirectX 9.0 SDK,再进行如下配置: 1、在配置之前,首先进“\DXSDK\Samples\C++\DirectShow\BaseClasses”,编译此工程,生成strmbasd.lib和strmbasd.dll文件; 2、在工程中添加要调用的.h、.lib文件的路径:打开VC6.0,选择在VC的菜单中选择Tools -> Opt

游子的足迹 1513

DirectShow编程环境配置(VC6.0)

以DirectX9为例:1、安装安装DX9SDK,安装目录一般位于C:/DXSDK;2、增加包含文件与库文件用VC打开工程C:/DXSDK/Samples/C++/DirectShow/BaseClasses/baseclasses.dsw,菜单Tools->Options->Directories->include files项增加(1)C:/DXSDK/INCLUDE

点点滴滴 898

vc6.0下配置Directx9.0b

vc6.0下配置Directx9.0b

VC++6.0 控制摄像头源代码,采用 DirectxShow 效率很高

VC++6.0 控制摄像头源代码,采用 DirectxShow 效率很高,和大家共享,希望对大家有帮助! (VC++6.0 to control the camera source code, using DirectxShow efficient, and share, we want to help!)

VC编程报告——DirectShow环境配置VC6)(转载)

最近有一个C++视频开发项目,写个心得稍稍记录一下,以免以后忘记了。本文虽然是原创,但是整合了网上所有遇见的情况做了一个中和以及个人的一些经历写了这篇,请阅读者多多指教。   1.简介:   DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或...

weixin_34409822的博客 161

DirectShow环境配置及常见错误解决方案

        最近有一个C++视频开发项目,写个心得稍稍记录一下,以免以后忘记了。本文虽然是原创,但是整合了网上所有遇见的情况做了一个中和以及个人的一些经历写了这篇,请阅读者多多指教。1.简介:  DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格 式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WD

SunJerdege 1486

VC6配置DIRECTSHOW开发环境

VC6配置DIRECTSHOW开发环境 2010年04月27日 星期二 9:02 转载 jiwenxu.blog.163.com/blog/static/5282222120095204949874/#comment=fks_082075083083081064087095080095081084089065086084084066 首先,安装好VC6,

autumn20080101的专栏 774

vc6 连接 XD SDK

首先,安装�C6,以及DIRECTSDK,我选择的是DirectX 9.0 SDK Update - (Summer 2004)   蛭 飧霭姹炯 闪�IRECTSHOW。(当然,这句话是听来的,真实与否我也不知道O(∩_∩)O~) 然后呢,用编译器把DX(DIRECTSDK简称,下同)目录下,Samples\C++\DirectShow\BaseClasses 的项目编译一下,得到开发用

bahaya的专栏 659

DirectShow环境配置

最近有一个C++视频开发项目,写个心得稍稍记录一下,以免以后忘记了。本文虽然是原创,但是整合了网上所有遇见的情况做了一个中和以及个人的一些经历写了这篇,请阅读者多多指教。  1.简介:  DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或早

珍爱生命 远离C++ 2400
下一篇: CCaptureVideo类的bug以及修改方法
某某9
博客等级 码龄18年 442粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值