看来DirectShow真的是从DirectX中分离出去了,可以装一个DirectX 的Extract的包,里面就是DirectShow,也可以装一个Platform SDK,里面同样也包含DirectShow。
我们的集成开发环境选择了Visual C++ 6.0 With SP6,但默认情况下,它不包括DirectShow的开发包。为此,我专门上微软的网站下载了DirectX SDK(April 2007版),但安装完成后,在编程中依然发现说找不到Dshow.h的头文件。开始以为是环境没配置好,但发现配置好环境后,问题依旧。搜索整个硬盘,确实是不存在这个文件。
查阅相关的资料后,得出以下的结论:现在的DirectShow SDK 不被整合在DirectX SDK中而是以Extras 的形式发布.DirectShow SDK的最后一个版本是在2005.2版的DirectX SDK Extras中。
也就是说DirectShow从DirectX中分离出去了,需要额外的安装。可以安装DirectX Extras (http://download.csdn.net/download/jason_gideon/4057316),也可以安装一个Platform SDK,该SDK包含有DirectShow的部分。
安装好后,其实主要是解压释放。我们需要在VC的选项里设置一下。在Tools->Option的选项卡Directories中增加相应项目。在Include files增加DirectX,DirectShow的Include路径,在Library files中增加DirectX,DirectShow的Lib路径。很重要的一点就是这些路径必须要放置在原有库文件路径后面,因为它的搜索顺序是从上到下,因为这些DirectX,DirectShow的库文件中要调用到系统基本的库,但这些库由于在顺序在它们之后,未被初始化,会造成引用错误,切记。
环境配置好之后,开始编程。编写完相关代码后,在运行时出现以下错误:
2007/04/27
--------------------Configuration: MediaPlayer - Win32 (WCE x86) Release--------------------
Linking...
MediaPlayerDlg.obj : error LNK2019: unresolved external symbol _CLSID_FilterGraph referenced in function "protected: void __thiscall CMediaPlayerDlg::OnPlay(void)" (?OnPlay@CMediaPlayerDlg@@IAEXXZ)
MediaPlayerDlg.obj : error LNK2019: unresolved external symbol _IID_IGraphBuilder referenced in function "protected: void __thiscall CMediaPlayerDlg::OnPlay(void)" (?OnPlay@CMediaPlayerDlg@@IAEXXZ)
X86Rel/MediaPlayer.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
MediaPlayer.exe - 3 error(s), 0 warning(s)
从反馈信息上看,是由于链接库有问题造成的。经过调试,解决办法是要在Project ->Setting里的Link里增加一个库文件:strmiids.lib。
DirectX 9.0 SDK 开发包以及扩展包下载(February 2005) http://dev.csdn.net/article/62/62941.shtm。直接到微软官网下的话,需要validation确认。
http://download.microsoft.com/download/7/b/9/7b92308a-ec8d-4016-8d45-2f91dd130bf2/dxsdk_feb2005.exe
dshow.h找不到,下个dxsdk extras就可以了。
qedit.h里面dxtrans.h missing的问题很诡异,March2008的版本依然存在这个问题,看看这篇文章http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617687&SiteID=1
①Remove anything to do with "dxtrans.h" and "IDXEffect" .
Say, for file "qedit.h"
//#include "dxtrans.h" -- Line 498
// IDxtCompositor //: public IDXEffect -- Line 837
// IDxtAlphaSetter //: public IDXEffect -- Line 1151
// IDxtJpeg //: public IDXEffect -- Line 1345
// IDxtKey //: public IDXEffect -- Line 1735
Now, everything compiles and works fine.
②
这篇介绍direcX的配置:http://www.veryhuo.com/a/view/37533.html
You can get by with less edits of qedit.h (commenting out the missing interfaces can be error prone).
Comment out the include of dxtrans.h.
Before you include qedit.h, add the following #defines:
#define
__IDxtCompositor_INTERFACE_DEFINED__
#define
__IDxtAlphaSetter_INTERFACE_DEFINED__
#define
__IDxtJpeg_INTERFACE_DEFINED__
#define
__IDxtKey_INTERFACE_DEFINED__
#include
<qedit.h>