您的位置:首页 > 其它

VS2005编译Media Player Classic

2009-11-08 02:02 609 查看
一 编译工具及环境
操作系统:Windows XP SP2、SP3
开发环境:Visual Studio 2005 Professional
版本控制工具:TortoiseSVN
说明:用来下载程序源代码,直接选检出,然后输入
https://guliverkli.svn.sourceforge.net/svnroot/guliverkli/trunk/guliverkli/
这个地址(源代码地址)把代码检出到本地。
SDK:
1. DirectX 9 SDK(需要DirectShow)
说明:DirectX SDK Summer 2004之后DirectShow不被整合到DirectX SDK中而是以Extras
的形式发布,它的最后一个版本为DirectX SDK Extras 2005,2 版。之后它被整合到Windows SDK中。而VS2005的WinSDK中不包含DirectShow。方便起见我下载的老版本DirectX 9.0b SDK。
地址:http://www.directshow.cn/SDK/DX9SDK.rar
2. Windows Media Format SDK 9
地址:http://download.microsoft.com/download/3/0/4/30451651-9e47-4313-89a3-5bb1db003c26/WMFormatSDK.exe

二 开发环境搭建
也就是包含一下刚刚提到的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的开发我把可能用到的都加在了里边。

三 编译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编译成功。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: