一 編譯工具及環境
操作系統: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編譯成功。

posted on 2010-07-22 21:22
vic.MINg 閱讀(1473)
評論(0) 編輯 收藏 引用 所屬分類:
Open Source