from: http://www.cnblogs.com/windwithlife/archive/2009/05/31/1492728.html
終于完成了了第二個Client side原型(for Wince),其中花掉我最多時間的就是ffmpeg的對WINCE的移植。其中有大半時間是由于網上的一些不完整及不正確信息所誤導,但是沒有這些零星的信息,我可能花費更多的時間。現在我把自己的移植過程分享給大家,我盡量做到事無巨細,也好讓大家少走彎路,省去我們程序員們的時間。那可是大把的銀子與信心浪費。呵呵,書歸正傳。
???? 一,第一個想法,仍像從前移植平臺代碼一樣,先找到這種跨平臺代碼的自己的特定平臺的make文件或工程:
可惜沒有發現ffmpeg 有for windows 及 for wince的make 及工程。再細讀 ffmpeg的官方網站,讓人仰天大笑,其中說到,由于VC/Visual studio 開發環境的編譯器,對C99支持不好,而ffmpeg又是follow這些C語言規范寫的,因此,不支持VC/VS的編譯器。這比一些跨平臺項目說windows OS is silly OS, not popular POSIX 從而不支持的說法更有趣。其實,從IT行業而言,這些理由都不是那么的合邏輯,也不夠嚴謹。但代碼是別人寫的。我們又能如何呢?呵呵。
??? 二,曲徑通幽,既然ffmpeg不支持windows的編譯器,那我們還有一個曲折的辦法,它不是支持POSIX嘛 ,也就是支持linux/unix嘛 ,那我們就有了我們的辦法,我們的windows平臺上的linux編譯器(算一種交叉編譯吧,呵呵)于是大家想到了Cyxwin及 Mingw+Msys,其它,Cyxwin中編譯出windows的平臺上可用的庫,還是調用了Mingw的編譯器,于是我們就直接研究Mingw +Msys吧,但是這個東東有一個致命的弱點,就是要安裝,分別要更新一堆組件,更新到什么版本呢,天知道,都用最新的吧。去相關的網站去下載他們(http://)不過Mingw的 sourceforge 網站真不是人去的,里面亂放,而且目錄沒有一個明確的索引,網站又慢,我是花了一天時間才找齊,后來發現ffmpeg有一個說明網頁,可以明確下載。請參看(http://ffmpeg.arrozcru.org/wiki/index.php?title=MSys_MinGW)其中下載地址我再列一下,以方便大家:
Mingw: http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=240780&release_id=595197
Mingw插件更新:
????????? http://prdownloads.sourceforge.net/mingw/binutils-2.18.50-20080109-2.tar.gz?download
????????? http://prdownloads.sourceforge.net/mingw/mingwrt-3.15.1-mingw32-dll.tar.gz?download
????????? http://prdownloads.sourceforge.net/mingw
??????????http://prdownloads.sourceforge.net/mingw/w32api-3.13-mingw32-dev.tar.gz?download
最穩定的gcc編譯器for mingw插件:
???????? http://prdownloads.sourceforge.net/mingw/gcc-core-3.4.5-20060117-1.tar.gz?download
?????????http://prdownloads.sourceforge.net/mingw/gcc-g++-3.4.5-20060117-1.tar.gz?download
至于安裝過程,網上搜一下,不會有問題can't miss it
?????? MSys:http://prdownloads.sourceforge.net/mingw/MSYS-1.0.11-2004.04.30-1.exe?download
相關插件更新:
???????http://prdownloads.sourceforge.net/mingw/MSYS-1.0.11-20080821-dll.tar.gz?download
?????? http://prdownloads.sourceforge.net/mingw/bash-3.1-MSYS-1.0.11-snapshot.tar.bz2?download
?????? http://prdownloads.sourceforge.net/mingw/coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2?download
?????? http://prdownloads.sourceforge.net/mingw/make-3.81-MSYS-1.0.11-2.tar.bz2
?????? 至一Msys的安裝及與Mingw整合在一起,網上查一下,can't miss it,
三 , 開始for windows的ffmpeg編譯。這個ffmpeg論壇上倒有相關的指導。請參照:
http://ffmpeg.arrozcru.org/wiki/index.php?title=Static
這里有一個靜態庫的編譯。按向導完成編譯成靜態lib庫,可以址接進行編譯鏈接到 windows項目中(only for windows平臺,not for wince),好放到一個新的window項目中,編譯成功,鏈接,一堆的庫找不到,哈哈,仰天大笑,用工具一查相關引用,原來這些找不到函數,還在mingw的庫中,也就是說要在項目中用ffmpeg的靜態庫,你還要搭上一堆mingw的庫,就像現在市場上的搭配銷售。再笑,我先找個地方睡半天,緩解我的想扁人的沖動。
睡醒之后,換種用法,我編動態庫,這下你不會不把我的所有函數給我加到我的DLL里吧,再換了一些ffmpeg的./configure參數。搞定。生成了動態庫,及lib.用到項目里,編譯通過。不過,這只是萬里長征第一步,我還要最痛苦的for wince的庫。
四,for wince 的ffmpeg:
????? 從linux的代碼用mingw編成 for windows那是人家mingw的任務,我們也只繞了一道彎,for wince的mingw不存在呀,怎么辦,忽然想到linux上的交叉編譯,人家可以在linux用定制的gcc交叉編譯器弄出for wince的庫,那我們何不在Mingw上搞出for wince的庫,一查,網上果然僅有的解決方案,也就是交叉編譯成for wince 的ffmpeg,所用交叉編譯器,大家可以看仔細了,
網上有絕大多數的相關貼子給的交叉編譯器是不正確的(下載的地址不正確)真搞不懂網上一堆人轉載別人的文章,也不去驗證一下,轉載干嘛?,我就是由于用了網上這些人轉載地址去下載編不正確的編譯器,浪費了3天的時間,無功而返。記住,下載的交叉編譯器是 cegccmingw 下載地址是:()
進行編譯。編譯最新的庫,會有一些匯編通不過。自己對匯編不熟悉,不過要是在linux上交叉編譯應該沒問題,有興趣的話,可以自己試那個環境,那樣的話,用的交叉編譯器就應該是cegcc.
沒辦法,為了節省我的時間,我可是要在兩周內完成三個平臺的原型開發的。就拿了2007年的ffmpeg來編。其中也改了不少東西才編譯能通過,首先,./configure 之后,在生成的config.mak中,要修改“SLIB_EXTRA_CMD=-lib /machine:i386 /def:$(@:.dll=.def)”為“SLIB_EXTRA_CMD=-lib /machine:arm /def:$(@:.dll=.def)”,及 “EXTRALIBS= -lm”改為“EXTRALIBS= -lm -lws2.lib”,其中編譯過程中采取了perror禁用,有seek函數禁用與替換(由于沒有用zlib,linux平臺估計會沒有問題).細節,可以有時間再寫,有興趣的話,可以加我MSN。
編譯成功后。用在C++環境中。測試普通函數通過,不過在視頻編換時,效率不高。
換了一下網上的別人編譯的ffmpeg庫,(網上有一個下載,不過此SDK在wince上用時,用在C++項目中有問題。頭文件中有重復定義,解決辦法是放在.c文件中,由Cpp文件來調用,這樣可以規避這些問題,但這樣就存在了一些全局變量.這樣的頭文件是不能用在Sybmian平臺的。
?
另外一種思路就是不用ffmpeg.用Xvid解 mpeg4(測試下來效率好像要高于ffmpeg,畢竟是專門for mpeg4),用xh264解 H264,拿過他們的源代碼一看,還是人家這跨平臺,現成的for windows平臺的工程make文件,這才是真正的跨平臺。當然想要更多功能,ffmpeg地位還是無人能及。
如果有人對編解碼做簡單的跨平臺移植有興趣,可以加我MSN一起學習探計,相互學習,搞技術嘛,大家一起共享信息,會省掉多少人的多少個不眠之夜,我就是因為一些信息的不準確,害得我移了一周,每天可都工作到凌晨2點多。
好了,今天就寫到這里,至于Symbian平臺的移植,改天再寫。