`
javamvp
  • 浏览: 38905 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

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

阅读更多

  最近有一个C++视频开发项目,写个心得稍稍记录一下,以免以后忘记了。本文虽然是原创,但是整合了网上所有遇见的情况做了一个中和以及个人的一些经历写了这篇,请阅读者多多指教。

  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 SDKDirectX 9.0 SDK Update - (Summer 2004)

  2.Windows Vista x64:(英文)

OS版本:Windows Vista x64 SP1 Ultimate

Windows SDK版本:Windows 2003 SP1 RTM

DirectX SDKDirectX 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 SDKDirectX 9.0 SDK Update - (Summer 2004)

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

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

  Windows VistaWindows 2008Windows 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

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

  3)错误信息:

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

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

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

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

  将变量COINIT_DISABLE_OLE1DDE改成整数4

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

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

  Debugstrmbasd.lib strmiids.lib quartz.lib

  Releasestrmbase.lib strmiids.lib quartz.lib

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

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

  6.遇到的问题

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

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

default-int

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

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

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

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

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

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

  解决:

  把WindowsSDKuuid.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标签,下拉选择Inputignore libraries中加上报警告的lib名称。

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

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

  8error LNK2001: unresolved external symbol _CLSID_FilterGraph

  此问题是因为链接下边缺少库文件:strmiids.libquartz.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.HDirectX SDK发行包里拿掉了,这个文件在Platform SDK里有,在VCInclude路径中把Platform SDKinclude路径提到最前面就可以了。Platform SDK,最后一个支持VC6Platform SDKFebruary 2003 Edition

  7.总结:

  此篇为本人在配置DirectShow里面的全过程,希望对大家有帮助,里面的错误,有些错误是我自己碰到的,有些错误是我自己碰到的,有些错误是在别人BLOG里面看到了过后做了个试验。如果还有些什么问题或者其他错误的话希望大家发我邮件:silentbalanceyh@126.com

   

分享到:
评论

相关推荐

    VC与Labview、Matlab编程论文资料[2].rar

    这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...

    VC与Labview、Matlab编程论文资料

    这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...

    VC与Labview、Matlab编程论文资料[4].rar

    这是VC与Labview、Matlab编程论文资料,全部为pdf格式,讲述有VC编程技巧、也有VC与Labview混合编程, VC与matlab混合编程,有365个,约500M,分成4个【独立】压缩包,如果想要全部的论文则需要下载全部压 缩包,...

    从USB摄像头采集图像的VC源代码图象采集

    6. **多线程编程**:为了实现非阻塞的用户界面,图像采集通常在后台线程进行,这需要掌握多线程编程技巧。 7. **文件保存**:捕获的图像可能需要保存为常见的图片格式(如.jpg、.bmp等),这就需要使用到文件I/O...

    vc多媒体视频资源下载

    9. **编译与调试**:在VC++环境中,使用IDE(集成开发环境)进行代码编写、编译和调试,理解如何配置项目设置和调试器是必要的技能。 10. **错误处理**:任何软件都可能出现错误,因此了解如何在代码中添加适当的...

    某公司VC视频核心代码.zip

    【描述分析】:“VC源码”作为描述,简洁明了地指出了文件内容的核心——这是使用VC编写的一系列源代码文件。源码通常包含了程序设计的逻辑和实现细节,对于学习、理解和修改软件的内部工作原理非常有价值。 【标签...

    duomeiti.rar_duomeiti_vc 播放器_影音_暴风影音

    本项目以“duomeiti.rar_duomeiti_vc 播放器_影音_暴风影音”为标题,旨在通过VC++编程语言,构建一个具备暴风影音等专业播放器功能的多媒体播放器。这个项目不仅涵盖了多媒体播放的基本技术,还展示了如何编写详尽...

    VC++开发手机软件(PDF+源码).

    1.2.1 Visual Studio 2005的Visual C++——Windows CE开发环境概述 1.2.2 示例程序HelloWorld 1.3 Windows CE附带远程工具概述 第2章 图形编程 2.1 设备环境类 2.2 图形对象类(GDI) 2.3 绘制各种图形 2.4...

    仿Winamp界面多媒体播放器

    【标签】中的"VC源码"强调了项目使用的编程环境和语言,即Visual C++,这是一个集成开发环境(IDE),集成了编译器、调试器和其他工具,适合编写Windows应用程序。"winmap"指的是被模仿的对象——Winamp播放器。...

    自定义皮肤界面播放器

    6. **播放功能**:虽然标题主要强调了界面自定义,但播放器的核心功能——音频或视频播放也是关键。这可能涉及使用DirectShow、Media Foundation或其他媒体框架来处理多媒体数据的解码和播放。 7. **事件处理**:...

    媒体播放器

    安装完成后,我们需要配置开发环境,以便支持MFC库,这将为我们提供用于创建图形用户界面的类库。 二、MFC框架介绍 MFC是微软为Windows平台提供的一个C++类库,它封装了Windows API,简化了Windows应用程序的开发。...

Global site tag (gtag.js) - Google Analytics