DMO 播放器经验总结
操作系统: Window XP
IDE : VS2005
播放器主要用到 DirectX 中的 DirectShow API ,而微软最新的 DirectX SDK 已经将 DirectShow 剥离出来,以 Extras 的形式发布,后来集成了一部分 SDK 到 Windows SDK 中,也就是说后来的环境(比如 vs2005 、 vs2008 环境下)比较难配置,极有可能不稳定,产生这样那样的错误。所以最好使用如下 SDK 安装包(网上找到的,感谢那位分享资源的网友,我在官网上没有找到合适的 SDK ):
DirectX 9.0 SDK :
http://cid-a76c4a4a3032ded0.skydrive.live.com/browse.aspx/.Public/DirectX%209.0%20SDK
将下载的 SDK 官解压出来(如放在 dx9sdk_setup 目录中),双击 Microsoft DirectX 9.0 SDK.msi ,安装目录 C:/DXSDK ,然后一路默认安装。
打开 C:/DXSDK/Samples/C++/DirectShow/BaseClasses/baseclasses.sln ,在 VS2005 中打开此文件,提示你进行必要的工程转换,尽管转换就好了。
编译之前需要做一些配置,工具 -> 选项 -> 项目和解决方案 ->VC++ 目录,设置环境变量:
¨ 包含文件:
C:/DXSDK/Include
C:/DXSDK/Samples/C++/DirectShow/BaseClasses
C:/DXSDK/Samples/C++/DirectShow/Common
C:/DXSDK/Samples/C++/Common/Include
编译时会报一些错误:
¨ C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'
解决办法 :自己在 winnt.h 上加入定义 #define POINTER_64 __ptr64 ,但感觉办法不是很妥当,但苦于暂时没有找到更合适的办法。
¨ error C4430: missing type specifier - int assumed. Note: C++ does not support default-int error C4430: 缺少类型说明符 - 假定为 int 。注意 : C++ 不支持默认 int 。
分析 :错误发生在: operator=(LONG); 这条语句中,这是因为在 VC6 中,如果没有显示的指定返回值类型,编译器将其视为默认整形;但是 VS2005 不支持默认整形。
解决办法 :
办法一 :解决这个问题不能修改每个没有显示指示返回值类型的函数地方,可以用 wd4430 来解决;具体的在工程选项中的 c++/Command Line 中添加 /wd4430 即可,如下图。
方法二 :直接在将 operator=(LONG); 语句改成 LONG operator=(LONG);
¨ error C2065: 'Count' : 未声明的标识符
分析 :此错误发生在 for 循环中, VC6 中 for 循环中定义的变量相当于在 for 外面定义,可以在 for 之外地方使用;但是 VS2005 的 for 循环中定义变量相当于域 {} 变量,只能在 for 循环中使用。
解决办法 :要解决这个问题,可以通过修改 vs2005 的工程选项: ”Project Option”->“ C++ ”-> “Language” -> “Force Comformance in For Loop Scrope” 设置为 No 即可,如下图。
完成上面的设置, BaseClasses 工程基本可以编译通过了,接着分别编译 Debug 和 Release 两个版本。
下面配置“库文件”环境变量( 工具 -> 选项 -> 项目和解决方案 ->VC++ 目录 ):
C:/DXSDK/Lib
C:/DXSDK/Samples/C++/DirectShow/BaseClasses/Debug
C:/DXSDK/Samples/C++/DirectShow/BaseClasses/Release
至此, DirectShow 程序就可以编译通过了。
Windows XP 操作系统中只支持少数的音视频格式,安装终极解码后可以支持大多数的音视频格式。
以 DXSDK 中的 DMO 程序( C:/DXSDK/Samples/C++/DirectShow/Players/PlayDMO )开始学习如何编写一个 DMO 播放器。