转载网址:http://wenku.baidu.com/view/f1f33c16c5da50e2524d7fa8.html
知识普及:
DirectX9.0b(包含b)以下版本才有directshow,自从DirectX9.0c以后就从DirctX中分离了directshow了,所以要用directshow的人要注意,当然你也可以下载安装extras扩展包来弥补这一缺省。
从网上下了DirectX 9.0 SDK,运行里面的的BaseClasses的时候出现了N多错误,在网上找到了相应的方法。http://blog.csdn.net/cocolovelove/article/details/3532583
1.编译基类源代码
BaseClasses编译生成
路径:<DXSDK>/Samples/C++/DirectShow/BaseClasses
环境:VS2005/VS2008
为了正确编译,需修改以下文件:
(a) ctlutil.h
D:/DXSDK/Samples/C++/DirectShow/BaseClasses/ctlutil.h
编译时提示错误:
BaseClasses/ctlutil.h(278) : error C4430:缺少类型说明符 - 假定为 int。注意: C++不支持默认 int
修改:
//operator=(LONG); //原代码
COARefTime& operator=(LONG);
改完这个之后,出现一堆错误,一个一个来改。
(b) wxdebug.cpp
d:/DXSDK/Samples/C++/DirectShow/BaseClasses/wxdebug.cpp
错误:
1>./wxdebug.cpp(567) : error C4430:缺少类型说明符 - 假定为 int。注意: C++不支持默认 int
改:
//staticg_dwLastRefresh = 0;
staticDWORD g_dwLastRefresh = 0; //lspmodify
(c) winutil.cpp
d:/DXSDK/Samples/C++/DirectShow/BaseClasses/winutil.cpp
错误:
1>./winutil.cpp(2104) : error C2065: “Count”:未声明的标识符改:
//for (UINT Count = 0;Count <Result;Count++)
UINT Count; //lspmodify
for (Count = 0;Count < Result;Count++) {//lspmodify
(d) outputq.cpp
d:/DXSDK/Samples/C++/DirectShow/BaseClasses/outputq.cpp
错误:
1>./outputq.cpp(664) : error C2065: “iDone”:未声明的标识符改:
(这里可能地方与VS报错不一样,需要自己向上找一下)
//for (long iDone = 0;
long iDone; //lspmodify
for (iDone = 0; //lspmodify
在DirectShow 8.0的SDK里面就看到有下面的头文件,在我装的是9.0的,没有找到这些文件。所以编译的时候修改完上面的就可以通过了。但要是装8.0的话就要修改了。
(我是到这部截至了因为我下载的是DirectX9.0b extras,所以如果您与我相同请先向看蓝字部分)
2、头文件修改
(a) winnt.h
d:/Program Files/Microsoft Visual Studio8/VC/PlatformSDK/include/winnt.h
在该文件头部添加:
#define POINTER_64 __ptr64 // add by peter lee
(b) vmr9.h
D:/DXSDK/Include/vmr9.h
MixerPref9_RenderTargetRGB = 0x1000,
MixerPref9_RenderTargetYUV = 0x00002000, //lspadd
3、VS2005/VS2008环境配置(一样的所以就以2008为例)
在vs2008下,选择菜单 Tools -> Options,左栏选择Projectsand Solutions -> VC++ Directories
在弹出的对话框的"Show directories for"(显示以下内容的目录)中选择Include files(包含文件):
- include:
<DXSDK>/Include
<DXSDK>/Samples/C++/Common/Include
<DXSDK>/Samples/C++/DirectShow/BaseClasses
<WMSDK>/WMFSDK9/include
...
再在"Show directories for"中选择 Librariesfiles(库文件):
- lib:
<DXSDK>/lib
<DXSDK>/Samples/C++/Common/Src
<DXSDK>/Samples/C++/DirectShow/BaseClasses/Debug_Unicode
//如果没有编译BaseClasses不会出现这个文件选项
<DXSDK>/Samples/C++/DirectShow/BaseClasses/Release_Unicode
<WMSDK>/WMFSDK9/lib
修改完成啦,哈哈~~~编译通过了~~DirectX9.0只需要做第一步修改就可以了,但8.0就要三步都做完~~~晕倒~~
如果以上修改已经解决你的问题那么恭喜你,如果编译出现下图情况,那么恭喜你也成功了,只不过因为你编译的是lib和.h项目,你应该设置类似capture项目为启动项目,继续您后续的编程。
如果后续编程出问题,请向下看
(Debug_Unicode版)
缺少streams.h的解决方法和DirectShow开发环境的搭建
这个问题困扰我两天了,这是在参考了很多Debug 和Realse 版本的缺少streams.h的方案后,经过大胆尝试后,我是第一个用Debug_Unicode版解决缺少streams.h问题的方法(至少我那时还未看到过有关这方面的详细解决方案),
现在拿出来供有需要的像做视频开发方面的人提供参考,绝对可以帮你省很多时间来处理有关DirectShow开发环境的搭建.
1) 安装directX 9.0bsdk ,我安装在C盘下的DXSDK
2) 打开安装目录下的baseclasses.dsw,进行编译
其中第(2)是最重点的,下面我就主要详细说明这步的操作过程
1. 首先在baseclasses工程project-setting-library下设置output filename,设置为Debug_Unicode\strmbasd_uni.lib,默认的为Debug_Unicode\strmbasd.lib。(这部我没做)
2. 编译工程,编译后会生成Debug_Unicode目录,里面就含有我们要的strmbasd_uni.lib库。把它拷贝到你所要的项目工程目录下即可。(这部我也没做)
3. 在你所在的工程中,打开project-setting-link的Object/library modules下添加如下几个库名,strmbasd_uni.lib strmiids.lib winmm.lib //这部我做了,这个VS与VC++不同VS2008是在右击启动项目——属性——链接(LINK)——输入中的依赖附加项中添加的
3)在VC++的Tools/Option/Directory的Include和Library中分别加入
C:\DXSDK\Include
C:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES
C:\DXSDK\SAMPLES\C++\COMMON\INCLUDE//我的工程中COMMON没有include,我直接添加到C:\DXSDK\SAMPLES\C++\COMMON 也成功了
C:\DXSDK\Lib
C:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\ Debug_Unicode (*)
4)在编译你工程前,在Project\Setting\Link\ 中加入 strmbasd_uni.lib uuid.lib winmm.lib
如果出现:dsound.h": No such file or directory
则在vs目录下搜索添加到工程include目录下
(着重强调你的VS2008中的windsk必须安装的比较完整,否则会缺少很多东西,如果没有在你的VS2008中的安装包搜索,找到补丁安装即可)
(以下参考
http://www.cnblogs.com/pcmax/archive/2008/11/22/1338989.html
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617687&SiteID=1
)
如果出现:
dxtrans.h": No such file ordirectory
#define__IDxtCompositor_INTERFACE_DEFINED__
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
#define __IDxtJpeg_INTERFACE_DEFINED__
#define __IDxtKey_INTERFACE_DEFINED__
#include <Qedit.h>
再修改qedit.h中引用 dxtrans.h的部分,要求注释掉
#include "oaidl.h"
#include "ocidl.h"
//#include "dxtrans.h"
#include "amstream.h"
注意:这样就可以正常编译连接了,如果以前的的程序还是不行,则 rebuild all 一下即可
希望我的整理对您有帮助,我调了两天,把directX的发展和VS2008的基本配置都弄的比较清楚了感觉收获很大。如果还有问题也欢迎邮箱[email protected]探讨
O(∩_∩)O哈哈~