天天看點

FFMPEG在Windows平台編譯的傻瓜教程1、編譯環境的搭建:2、編譯FFMPEG的依賴庫3、編譯ffmpeg4、後記

在開始這篇博文之前,我心裡一直忐忑不安七上八下。因為從最初的安裝編譯環境開始一直到最終編譯完成,這整個工程堪稱規模宏大,而且路途中陷阱重重,稍不注意就有可能前功盡棄。在将從前編譯出的庫删掉之後,我心裡甚至有些許懷疑自己還能不能再次成功編譯出來。不過既然走到了這一步,就是爬,也得爬到終點!閑話到此,開始進入正題。

在開始之前,首先确定目前系統沒有安裝過mingw。方法是打開cmd指令行,鍵入mingw32-make.exe,回車。系統應該顯示無法識别指令,這就說明目前系統是“幹淨”的,可以繼續下面的安裝步驟。

在windows平台下編譯ffmpeg,通常的方法是采用Mingw+Msys的方法。不過在這裡為了友善,也為了以後可以更友善地學習其他的一些知識,我決定安裝CodeBlocks這個IDE,其官網在:http://www.codeblocks.org/。在download->binary界面中可以找到該IDE對于各個平台的不同版本,我們要找的是windows平台下內建了Mingw的版本,也就是需要下載下傳安裝codeblocks-13.12mingw-setup.exe或者codeblocks-13.12mingw-setup-TDM-GCC-481.exe這兩個版本中的一個。

FFMPEG在Windows平台編譯的傻瓜教程1、編譯環境的搭建:2、編譯FFMPEG的依賴庫3、編譯ffmpeg4、後記

安裝過程就不用多解釋了,基本上一路next就可以。隻是需要注意最好将其安裝在某磁盤分區根目錄下,如我們将安裝位置定位D:\CodeBlocks。

FFMPEG在Windows平台編譯的傻瓜教程1、編譯環境的搭建:2、編譯FFMPEG的依賴庫3、編譯ffmpeg4、後記

接下來便是開始安裝了。在安裝快結束的時候會出現編譯器自動檢測,選擇預設的GNU GCC Compiler即可。安裝完成後,便出現了CodeBlocks的啟動界面,如下圖所示。看慣了Visual

Studio還有Xcode絢麗卻又複雜的界面後,感覺CodeBlocks的簡潔清新卻又是别有一番風味。

FFMPEG在Windows平台編譯的傻瓜教程1、編譯環境的搭建:2、編譯FFMPEG的依賴庫3、編譯ffmpeg4、後記

安裝完成後,打開安裝目錄就可以看到codeblocks根目錄下已經有了mingw檔案夾,說明我們已經安裝完成。下一步需要配置系統環境變量,将mingw的目錄添加到其中。具體方法是打開“控制台\系統和安全\系統”,選擇“進階系統設定”,選擇“環境變量”,在“系統變量”中添加下面兩行路徑:

D:\CodeBlocks\MinGW\bin;

D:\CodeBlocks\MinGW\libexec\gcc\mingw32\4.8.1;

完成後,我們将Path環境變量中的值拷貝出來,下面就是目前系統中定義的一些環境變量值:

FFMPEG在Windows平台編譯的傻瓜教程1、編譯環境的搭建:2、編譯FFMPEG的依賴庫3、編譯ffmpeg4、後記

至此,Codeblocks和Mingw就已經安裝完成。

install步驟,如下圖所示。

FFMPEG在Windows平台編譯的傻瓜教程1、編譯環境的搭建:2、編譯FFMPEG的依賴庫3、編譯ffmpeg4、後記

選擇Y,enter。随後詢問是否安裝了Mingw,依然選擇Y,enter。随後MSys會要求你輸入Mingw的安裝路徑,輸入d:/CodeBlocks/MinGW(注意斜杠的方向)。完成後找到msys.bat檔案,用記事本打開并在開頭添加以下腳本:

call  "D:\Visual Studio 2010 Ultimate\VC\vcvarsall.bat"  

這裡的路徑是本機安裝VS2010的路徑,各人可能有所不同。儲存之後,編譯環境就宣告安裝配置完成了。

想要成功編譯出ffmpeg,需要提前安裝的依賴庫非常非常多,而且有些還非常複雜。現在我們開始一個個嘗試編譯安裝。

cd zlib-1.2.8

make -f win32/Makefile.gcc

編譯完成後,在zlib-1.2.8生成了zlib1.dll、libz.a檔案。然後調用以下指令将相關檔案複制到Mingw響應的目錄:

cp -iv zlib1.dll /mingw/bin  

cp -iv zconf.h zlib.h /mingw/include  

cp -iv libz.a /mingw/lib  

檢查相關目錄,相應的檔案已經成功複制過去了。

make(這一步會出現fchmod和fchown的編譯錯誤,無視之,因為我們隻需要libgsm.a庫檔案即可)

mkdir /mingw/include/gsm

cp inc/gsm.h /mingw/include/gsm

cp lib/libgsm.a /mingw/lib

同樣,檢查相關目錄,頭檔案gsm.h和庫檔案libgsm.a已經成功複制。

./configure --prefix=/mingw --enable-expopt=full

make

make install

檢查相關目錄,/mingw/include下建立了一個lame存放頭檔案,而/mingw/lib中已經包含了libmp3lame.a、libmp3lame.dll.a、libmp3lame.la三個庫檔案,說明編譯成功。

./configure --prefix=/mingw

在目錄中建立一個檔案名為faac-1.28.diff,内容如下:

然後執行:

patch -p1 < faac-1.28.dll

./bootstrap

這樣編譯可以成功。

随後,需要将該目錄下的幾個檔案(config/config.status/configure/configure.in)中含有的“-mno-cygwin”字元删掉,否則會出現編譯錯誤。

然後執行

cp -iv \=build/xvidcore.dll.a /mingw/lib/libxvidcore.dll.a

檢查目标檔案,libxvidcore.dll.a已經成功複制。

configure --prefix=/mingw --enable-w32thread --enable-shared --disable-opencl

SDL是可以選裝的部分,如果不安裝SDL,我們依然可以生成ffmpeg.exe和ffprob.exe,但是不能生成ffplay.exe。

安裝SDL的過程比較簡單,從http://www.libsdl.org/download-1.2.php下載下傳SDL-devel-1.2.15-mingw32.tar。解壓後,需要将makefile做一些小修改,将CROSS_PATH路徑改為CROSS_PATH

:= /mingw。在msys指令行中執行:

 make cross

結束後,在mingw的include目錄分别生成了SDL目錄存放頭檔案,在lib目錄存放庫檔案。

與編譯依賴庫類似,進入代碼目錄,依次執行下列指令:

./configure --prefix=/mingw --enable-shared

--disable-static --enable-gpl --enable-nonfree --enable-postproc --enable-avfilter --enable-runtime-cpudetect --enable-memalign-hack --enable-bzlib --enable-libfaac --enable-libgsm --enable-libmp3lame --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --disable-debug

--enable-pthreads

但是系統會提示pr: command not found。我們需要在http://code.google.com/p/mingw-lib/downloads/detail?name=coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2&can=2&q=下載下傳 coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2這個檔案,并将bin目錄下的pr.exe複制到/msys1.0/bin目錄下。

系統提示找不到libxvid,是以暫時把"--enable-libxvid"去掉,重新configure,成功。

下面執行:

執行成功,在/mingw/bin檔案夾下我們成功看到了編譯出來的dll以及可執行程式!

FFMPEG在Windows平台編譯的傻瓜教程1、編譯環境的搭建:2、編譯FFMPEG的依賴庫3、編譯ffmpeg4、後記

再次嘗試libxvid。從msys/local/include中将xvid.h複制到mingw/include中,在configure指令中加上--enable-libxvid,再次configure,現在發現成功了。執行make/make install也一切正常。

經過了曠日持久的研究和調試,終于成功地将ffmpeg庫編譯出來。但是事情到此并沒有徹底結束,依然存在着一個問題沒弄明白。在第一次嘗試編譯的時候,我所使用的是codeblocks-13.12mingw-setup-TDM-GCC-481.exe這個IDE,但是在最後make

ffmpeg的時候,在libavutil/time.c這個檔案的編譯過程中總是出現錯誤,提示“Storage size of  'ts' isn't known”(如下圖)。到現在仍然不知道這是因為什麼引起的。在今天換用了codeblocks-13.12mingw-setup.exe之後便可以正常編譯通過了。這究竟是什麼問題呢?這兩個IDE的版本究竟有多大差別?由于對這部分知識不熟悉,現在這些問題仍然像未解之謎一樣難以得知,仍待以後繼續學習。

FFMPEG在Windows平台編譯的傻瓜教程1、編譯環境的搭建:2、編譯FFMPEG的依賴庫3、編譯ffmpeg4、後記

繼續閱讀