由於FFMpeg是基於Linux開發的開源項目,原始碼和Windows下最常見的Visual Studio提供的C/C++編譯器不相容,因此它不能使用MSVC++編譯。要想使用FFMpeg,最先要解決的問題就是在Windows下配置一個類似Linux的編譯環境,將FFMpeg編譯為二進位庫以後,再利用其進行進一步開發。
MSVC++並不嚴格的遵循C標準,所以整個編譯過程必須使用MSys+MinGW系統來完成。如果選擇編譯動態連結程式庫(dll),這些庫將和其他的動態連結程式庫一樣在使用上沒什麼差別,可以使用MSVC++來連結這些庫到自己的程式,只有這種情況下MSVC++是被支援的。
FFmpeg在Windows系統下的編譯過程如下:
準備MSys+MinGW系統
1)安裝MSys
到http://sourceforge.net/project/showfiles.php?group_id=2435下載檔案:
bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
msysCORE-1.0.11-2007.01.19-1.tar.bz2
(可能會有版本變化,以下同)
解壓msysCORE-1.0.11-2007.01.19-1.tar.bz2,比如解壓到D:/msys(以下內容都使用該路徑描述)。
解壓bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,產生一個名為bash-3.1的目錄,在該目錄下有一個子目錄名為bin,其他的目錄不需要關心。複製bin目錄中的所有檔案到D:/msys/bin,提示是否要覆蓋sh.exe的時候,選擇是。
到“D:/msys/postinstall”目錄下執行pi.bat,在出現的提示中輸入n斷行符號後,按任意鍵退出即可。
2)安裝MinGW
同樣是到http://sourceforge.net/project/showfiles.php?group_id=2435下載檔案:
binutils-2.17.50-20060824-1.tar.gz
gcc-core-3.4.5-20060117-1.tar.gz
gcc-g++-3.4.5-20060117-1.tar.gz
w32api-3.9.tar.gz
mingw-runtime-3.12.tar.gz
把它們全部解壓到D:/msys/mingw。
3)修改“msys.bat”
用文字編輯器開啟D:/msys/msys.bat,由於打算用MSVC++編譯器,所以需要有.lib檔案才能連結到FFmpeg的庫,這些.lib檔案可以使用微軟的工具鏈中lib命令產生。為此,機器上必須已經安裝了微軟的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路徑替換成機器上vcvars32.bat實際存在的路徑,比如我的在“D:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/bin”,於是就添加:
call "D:/Program Files/Microsoft Visual Studio .NET 2003/Vc7/bin/vcvars32.bat"
4)系統整合
複製D:/msys/etc/fstab.sample為D:/msys/etc/fstab,用文字編輯器開啟D:/msys/etc/fstab編輯。(需要使用一個支援Unix換行風格的編輯器,比如Notepad++),把下面這行:
d:/mingw /mingw
改為:
d:/msys/mingw /mingw
完成以上步驟,MSys+MinGW系統就配置完成了。
用SVN方式擷取FFmpeg
由於FFmpeg的原始碼存放在SVN倉庫裡,所以必須使用命令列程式或是圖形介面程式來訪問。為了方便,我使用TortoiseSVN這個圖形介面程式,因為它和Windows資源管理員結合的非常好。
首先到http://sourceforge.net/project/showfiles.php?group_id=138498下載TortoiseSVN並安裝,安裝結束後需要重新啟動才可以使用。如果希望使用中文版本,可以下載LanguagePack-version-win32-zh_CN.exe,這樣軟體就變成熟悉的中文介面了。
由於TortoiseSVN完全整合到了Windows資源管理員中,所以我們只要開啟資源管理員,在希望存放代碼的目錄上右擊選擇“SVN檢出...”就可以啟動TortoiseSVN。我把FFmpeg原始碼儲存在“D:/ffmpeg”目錄下,所以右擊該目錄,選擇“SVN檢出...” ,然後在出現的對話方塊中填寫如下內容:
圖1
點擊確定就會開始下載過程,TortoiseSVN會把最新版本的FFmpeg原始碼下載到本地目錄中,等待下載結束,就可以開始編譯過程。
由於FFmpeg的維護人員較多,下載的版本難免會有錯誤,甚至於當前下載的版本根本就無法編譯,所以要經常更新。更新的方法很簡單,右擊FFmpeg所在的目錄,選擇“SVN更新”即可。
編譯
首先通過MSys安裝目錄下的msys.bat啟動MSys,這時會出現一個命令列視窗,它是一個運行著bash的rxvt程式,如:
圖2
這是一個類似Linux的shell並且在Windows上運行,就像是在使用一個真正的Linux shell。不過使用這個shell時需要注意:
→目錄名使用正斜杠來分割,而不是Windows所使用的反斜線(比如說要寫成"D:/ffmpeg"而不是"D:/ffmpeg")。
→盤符(例如"C:/")可以從根目錄處訪問(像這樣"/C/")。
→檔案名稱或目錄名中如果帶有空格,必須用雙引號括起(例如這樣"/C/Program Files",帶有雙引號)。
下面切換到存放FFmpeg原始碼的目錄,方法是輸入:"cd /D/ffmpeg"。
接下來要配置FFmpeg,選擇編譯時間包含的庫,對於如何加入對第三方庫的支援,請看後續描述,這裡先輸入:
./configure --enable-memalign-hack
--enable-memalign-hack選項是FFmpeg在Windows上編譯成功所必須指定的,待配置完成後,將回到命令提示字元,看到所示的畫面:
圖3
如果沒有錯誤的話,就可以"make"具有準系統的FFmpeg了,在提示符後輸入:"make"。
編譯的過程將持續很長時間。如果一切正常,結束後將返回提示符,並有如下的輸出畫面:
圖4
這時程式已經編譯好了,在存放FFmpeg原始碼的目錄下可以找到ffmpeg.exe這個檔案。
之後,如果希望把FFmpeg安裝到系統中,可以執行安裝步驟:"make install",這將會複製所有產生的重要檔案到MSys的local檔案夾下。
由於我只是調用FFmpeg,所以沒有安裝,而是把ffmpeg.exe複製到需要的目錄下,作為一個模組使用。
如果希望使用FFmpeg包含的libavcodec庫開發多媒體檔案處理常式,還需要編譯libavcodec的dll動態連結程式庫,編譯過程和上述過程稍有差別,如下所述:
首先切換到FFmpeg的原始碼目錄,在開始編譯前先使用"make distclean"清理上一次留下的中間檔案,然後向configure指令碼多傳遞兩個參數:
./configure --enable-shared --disable-static --enable-memalign-hack
最後執行"make"命令就可以了。
這種編譯方式能夠得到供MSVC++使用的檔案,從而使用MSVC++進行進一步開發。
連結
在FFmpeg目錄下有三個子目錄名字分別為:libavutil、libavcodec和libavformat,如果在前述步驟中成功產生了動態連結程式庫,那麼在這三個目錄下都有一個SLIBNAME_WITH_MAJOR.lib這樣的檔案,例如我產生的是avcodec-51.lib、avformat-51.lib 和 avutil-49.lib,MSVC++可以從這些檔案中知道dll的匯出函數。
現在通過包含FFmpeg的標頭檔,和使用上述三個lib檔案進行連結,就能夠編寫具備FFmpeg功能的應用程式了。
加入對第三方庫的支援
我以加入對mp3lame的支援為例,說明加入第三方庫的方法。
首先需要下載mp3lame,這裡有兩個方案可以選擇:
→到http://sourceforge.net/project/showfiles.php?group_id=290下載lame-3.97.tar.gz,使用以下命令編譯並安裝到MinGW的庫中:
./configure --prefix=/static --disable-shared --enable-static
make
make install
或者將mp3lame編譯為動態連結程式庫:
./configure --prefix=/shared
make
make install
→到http://oss.netfarm.it/mplayer-win32.php下載已經編譯的mp3lame庫,解壓後複製到“D:/msys/mingw”檔案夾下。
接下來和前述步驟類似,切換到存放FFmpeg原始碼的目錄,在傳遞配置參數時要加入“--enable-libmp3lame” ,即使用以下命令配置:
./configure --enable-static --enable-shared --enable-memalign-hack --enable-libmp3lame
配置後顯示的資訊如:
圖5
可以看到這時libmp3lame已經為enabled,下面只要使用"make"命令編譯就可以了。
最終我的FFmpeg配置為:
--enable-gpl --enable-pp --enable-swscaler --enable-pthreads --enable-liba52 --enable-avisynth --enable-libdts --enable-libfaac --enable-libfaad --enable-libgsm --enable-libmp3lame --enable-libnut --enable-libogg --enable-libtheora --enable-libvorbis --enable-x264 --enable-xvid --enable-amr_nb --enable-amr_wb --cpu=i686 --enable-memalign-hack --extra-ldflags=-static
===============華麗的分隔線=========
本文參考了http://www.aurora-x.net/wiki/CompileFFmpegWindows和FFmpeg工程組的有關內容,並針對已經過時的部分稍加修改,感謝網路上無私奉獻的朋友們。星塵☆回憶tag:blogger.com,1999:blog-399668078016494547.post-35850969380399542382007-05-21T22:08:00.000+08:002007-05-21T23:33:28.932+08:00為了寫畢業論文,我不得不把繁瑣至極的FFmpeg編譯過程又重複了一遍。累啊!
另外一篇文章:
1、下載
SVN 用戶端 TortoiseSVN
http://nchc.dl.sourceforge.net/sourceforge/tortoisesvn/TortoiseSVN-1.4.8.12137-win32-svn-1.4.6.msi
MinGW + MSYS
http://sourceforge.net/project/showfiles.php?group_id=2435
MinGW-5.1.3.exe (安裝時,根據選項會自動下載相關編譯器等)
MSYS-1.0.11-20071204.tar.bz2 (解壓bin裡面的檔案,覆蓋到安裝好的MSYS相應目錄)
bash-3.1-MSYS-1.0.11-1.tar.bz2 (解壓bin裡面的檔案,覆蓋到安裝好的MSYS相應目錄)
coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2 (需要bin裡面的pr.exe,拷貝到MSYS相應目錄,configure時候會用到這個工具)
http://gd.tuwien.ac.at/gnu/mingw/?fisel=0-9,a-z,A-Z
MSYS-1.0.11-2004.04.30-1.exe (MSYS安裝程式)
2、安裝
安裝 MinGW-5.1.3.exe
安裝 MSYS-1.0.11-2004.04.30-1.exe
配置 MSYS 的 etc 下的 fstab,指定 MinGW 的位置
3、擷取 FFmpeg 源碼
用 TortoiseSVN 將 FFmpeg 源碼 checkout 到本地
svn://svn.mplayerhq.hu/ffmpeg/trunk
4、編譯
./configure ....................................(各種參數)
make
make install