VS2005编译Media Player Classic

 

 

一 编译工具及环境

操作系统:Windows XP SP2SP3

开发环境: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中。而VS2005WinSDK中不包含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未定义

原因:这是由于PlatformSDKDirectXSDK中的同名头文件basetsd.h冲突造成的,PlatformSDK中的定义了POINTER_64DirectXSDK没有定义却默认先编译,导致winnt.h中找不到POINTER_64

解决办法:在刚提到的包含文件中确保系统文件在上边,然后

右键=>工程=>属性=>C/C++=>常规中清空附加包含目录(因为会优先编译这里的路径)。

2. 返回值默认不为int

原因:VS2005相对于VS2003VC6编译相对严格,函数无返回值不能默认为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.libResizableLibDU.libCmdUIDU.lib、   TreePropSheetDU.lib

 

  ④ 编译subpic通过。在lib目录里生成subpicDU.lib

 

  ⑤ 编译 subtitles出现好多错误。查看源代码发现字符数组定义有问题,缺少 

  解决方法:在CCDecoder.cpp中第127行定义的static WCHAR charmap[0x60]把其初始化   中的?都补上右侧的 ' 。通过之后lib目录里生成libssfDU.libsubtitlesDU.lib

 

  ⑥ 编译filtersDebug 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.hVP62.cpp。进入报错代码,注释着//comment this out if you don't have VP62.cpp/h所以将此行注释掉就可以了,并在项目文件列表中将VP62.hVP62.cpp从项目中移除。重新编译这个项目,通过。在lib目录中生成FLVSplitterDU.libTreePropSheetDU.libMP4SplitterDU.lib等等多个lib文件。

 

  编译mplayerc出现三个错误。一个是SubmitNotPlayFileDlg.cpp未找到,另两个是错误D3D9b_SDK_VERSIONMixerPref9_RenderTargetYUV未声明的标识符。

解决方法:找到mpayerc项目中的SubmitNotPlayFileDlg.cppSubmitNotPlayFileDlg.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编译成功。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值