最近研究播放器的源码,发现要配置的东西好多,首先是DirectX9.0b SDK,其次要一次编译射手播放器的Samples的工程生成lib库,以下是我在网上找到的可用的步骤:
1. 安装DirectX SDK
DirectX SDK开发包 在opencv的CVCAM模块中有重要作用
第一步 下载directX SDK 9.0b 大约200MB 注意要下9.0b 而不是9.0C哈
地址如下
http://down.gougou.com/down?cid=BEB35A9E0D3DA62C8DB04E1B62AFF22FDC2B8A34
第二步
安装 C:\DXSDK
第三步
在文件夹C:\DXSDK\Samples\C++\DirectShow\BaseClasses中找到BaseClasses.dsw
第四步
在VC6.0下运行在组建|批组建(build|batch)下选中debug 和release 复选框 然后选择(全部重建)rebuild all 即可生成
库文件 库文件有两个 一个是在C:\DXSDK\Samples\C++\DirectShow\BaseClasses\debug 中的strmbasd.lib ;另一个是在C:\DXSDK\Samples\C++\DirectShow\BaseClasses\Release 中的STRMBASE.lib 将这两个文件复制到C:\DXSDK\lib中
第五步
将DirectX SDK库的路径和头文件加入到VC6.0的路径设置里。Tools|Options 菜单Directions标签,在showdirectories for
下拉菜单下列表中选择Include files
在其中加入
C:\DXSDK\Include
C:\DXSDK\Samples\C++\Common\Include
C:\DXSDK\Samples\C++\DirectShow\BaseClasses
第六步
Tools|Options 菜单Directions标签,在showdirectories for 下拉菜单下列表中选择library files
添加路径C:\DXSDK\lib
2. 开发环境搭建
也就是包含一下刚刚提到的SDK目录,下载安装所需SDK,由于源代码的文档中提到
“you may need to add "Debug Unicode" and "Release Unicode" configs to the project file of the directshow baseclasses”,所以需要先编译DirectShow中的BaseClasses程序。
编译时需要在VS2005的包含文件里添加
X:\DXSDK\Include
X:\DXSDK\Samples\C++\DirectShow\BaseClasses
步骤:工具=>选项=>项目和解决方案=>VC++目录=>包含文件
因为BaseClasses代码中都是用<>包含的头,所以我把本身的路径加到了系统中。
编译BaseClasses时大概会发生三类错误:
1. 提示POINTER_64未定义
原因:这是由于PlatformSDK和DirectXSDK中的同名头文件basetsd.h冲突造成的,PlatformSDK中的定义了POINTER_64而DirectXSDK没有定义却默认先编译,导致winnt.h中找不到POINTER_64。
解决办法:在刚提到的包含文件中确保系统文件在上边,然后
右键=>工程=>属性=>C/C++=>常规中清空附加包含目录(因为会优先编译这里的路径)。
2. 返回值默认不为int
原因:VS2005相对于VS2003和VC6编译相对严格,函数无返回值不能默认为int。
解决方法:将提示错误的operator=(LONG);加返回值int,因为我没找到此重载的实现,返回什么无所谓了。或者右键=>工程=>属性=>C/C++=>命令行中附加选项添加/wd4430使其默认返回int。
3. 未定义的局部变量
原因:也是由于VS2005之前版本在for中定义的变量看做是for外定义可以拿到循环以外使用,而VS2005不可以。
解决方法:将其报错地方的定义,拿到for外定义。或者右键=>工程=>属性=>C/C++=>语言中的强制for循环范围中的一致性选否。还有一处static变量加上DWORD定义就可以了。
这样基本就可以编译通过了。
然后将Debug Unicode 和 Release Unicode目录包含到系统中。
步骤:工具=>选项=>项目和解决方案=>VC++目录=>包含库
然后还需要包含几个文件和库,具体如下图
为了以后方便DirectShow的开发我把可能用到的都加在了里边。
3. 编译Media Player Classic
1. 编译顺序
HowToCompile中提到要按照一定顺序编译才可以成功。
而且在调试阶段我统一以Debug Unicode形式编译。
顺序如下:
1. deccs
2. dsutil
3. ui (run \lib\ui.bat to merge them)
4. subpic
5. subtitles
6. filters (for mpc only build those configurations which output a lib, the rest outputs stand- alone filters)
7. apps\mplayerc
2. 编译时遇到的问题和解决方法
按照编译顺序一一解决
① 编译deccs通过。在lib目录里生成decssDU.lib。
② 编译dsutil通过。在lib目录里生成dsutilDU.lib。
③ 编译ui通过。在lib目录里声称sizecbarDU.lib、ResizableLibDU.lib、CmdUIDU.lib、 TreePropSheetDU.lib。
④ 编译subpic通过。在lib目录里生成subpicDU.lib。
⑤ 编译 subtitles出现好多错误。查看源代码发现字符数组定义有问题,缺少 ' 。
解决方法:在CCDecoder.cpp中第127行定义的static WCHAR charmap[0x60]把其初始化 中的?都补上右侧的 ' 。通过之后在lib目录里生成libssfDU.lib和subtitlesDU.lib。
⑥ 编译filters(Debug Unicode Lib形式) 失败。好多提示无法打开文件strmbaseDU.lib。还有许多关于Ap4文件没找到的错误。
解决方法:不知道为什么最新下载的MPC源代码会缺少以前的几个项目如图:
strmbaseDU.lib就是以前BaseClasses生成的,不过没关系这个应该和刚刚编译DirectShow中的BaseClasses是同样的,刚刚已经包含了Debug Unicode只不过那个生成文件名为strmbasd.lib,只要复制一份strmbaseDU.lib就可以了。其他版本的编译同理。AP4文件那个需要把
X:\guliverkli\src\filters\parser\mp4splitter\AP4\Update\v0.6.3\Bento4_0.6.3-001.7z解压后把
Source文件夹拷贝到X:\guliverkli\src\filters\parser\mp4splitter\AP4\ 目录下。再用
X:\guliverkli\src\filters\parser\mp4splitter\AP4\Update\v0.6.3\Source文件夹去覆盖更新一下。
继续编译,FLVSplitter.h中出现两个错误提示找不到VP62.h和VP62.cpp。进入报错代码,注释着//comment this out if you don't have VP62.cpp/h,所以将此行注释掉就可以了,并在项目文件列表中将VP62.h和VP62.cpp从项目中移除。重新编译这个项目,通过。在lib目录中生成FLVSplitterDU.lib、TreePropSheetDU.lib、MP4SplitterDU.lib等等多个lib文件。
⑦编译mplayerc出现三个错误。一个是SubmitNotPlayFileDlg.cpp未找到,另两个是错误D3D9b_SDK_VERSION和MixerPref9_RenderTargetYUV未声明的标识符。
解决方法:找到mpayerc项目中的SubmitNotPlayFileDlg.cpp和SubmitNotPlayFileDlg.h从该项目移除。然后到vmr9.h中找到enum __MIDL___MIDL_itf_vmr9_0012_0001这个枚举在最后添加MixerPref9_RenderTargetYUV = 0x00002000。
最后在d3d9.h中加入#define D3D9b_SDK_VERSION 32 (常量有可能不准确)。
继续编译,提示无法打开文件RadGtSplitterDU.lib,由于这个项目已经没有了,所以去连接器中把包含去掉。步骤:右键mplayerc项目 工程=>属性=>连接器=>输入,在附加依赖项中把RadGtSplitterDU.lib去掉。
继续编译,成功。Mplayerc下的Debug Unicode目录会生成mplayerc.exe。
运行,会出现以下图示,到此Media Player Classic编译成功。