本文主要記錄在64位Windows 7下,編譯64位ffmpeg的過程。
1.資源準備
(1). MSYS http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/
(2). MinGW-w64 http://www.drangon.org/mingw/
(3). SDL http://www.libsdl.org/download-1.2.php
(4). x264 http://www.videolan.org/developers/x264.html
(5). FFmpeg http://www.ffmpeg.org/download.html
MinGW-w64中已經包含Yasm,因此不需要額外準備Yasm。
2.軟體安裝
(1). MinGW+Msys安裝
下載MSYS,解壓到E:/ffmpeg64/msys目錄。
下載MinGW-w64,解到E:/ffmpeg64/msys/mingw64目錄。
啟動msys.bat,開啟類似於Linux的終端,並匯入mingw64的環境變數。
echo 'export PATH=.:/local/bin:/mingw64/bin:/bin' > .profile source .profile
(2). SDL安裝
下載SDL1.2.14,解壓到E:/ffmpeg64/SDL-1.2.14目錄。
進入SDL-1.2.14目錄,依次執行:
./configure --host=x86_64-w64-mingw32 make make install
編譯過程中,出現如下錯誤:
檢視SDL_dx5video.c原始碼,如下圖所示,可以看出啟用預定義NONAMELESSUNION,則會引用u1、u2的結構,出現上述錯誤。
解決方法是去除預定義NONAMELESSUNION,具體程式碼修改參考:http://hg.libsdl.org/SDL/rev/eada7e321df6
另一種簡便的解決方法是更換SDL庫,換成SDL-1.2.15或SDL-2.0.3。由於ffplay.c主要是利用SDL-1.2的介面實現,若使用SDL-2.0.3,則需要修改ffplay.c的原始碼,因此,本文利用SDL-1.2.15重新編譯,生成SDL庫,安裝過程和安裝SDL-1.2.14一樣。
完成編譯過程,但在安裝(make install)出現如下錯誤,提示“系統找不到指定的檔案”,但是/bin/install和sdl-config都是存在。
查詢相關資料後,發現出錯的原因可能是終端在解釋路徑出錯,如:http://mingw-users.1079350.n2.nabble.com/Problem-with-ranlib-while-running-make-install-for-SDL-td3282130.html。當MinGW+Msys和Cygmin同時存在時,會出現路徑衝突的問題,在Cygmin中,根目錄"/"被解釋為當前目錄的根目錄,即”E:/",Cygmin會將"/bin/install"解釋為"E:/install",因而出現“系統找不到指定的檔案”的錯誤。
解決方法:修改Makefile檔案,重新設定install的路徑。
(3). x264安裝
下載x264,解壓到E:/ffmpeg64/x264目錄下。
進入x264目錄,依次執行:
./configure --host=x86_64-w64-mingw32 --enable-shared make make install
(4). FFmpeg安裝
下載FFmpeg1.2,解壓到E:/ffmpeg64/ffmpeg1.2
進入ffmpeg目錄,依次執行:
./configure --enable-gpl --enable-libx264 --enable-shared --enable-static --arch=x86_64 --extra-cflags='-I/local/include -I/local/cross-tools/i386-mingw32/include/SDL' --extra-ldflags='-L/local/lib -L/local/cross-tools/i386-mingw32/lib' make make install
--extra-cflags用於指定標頭檔案路徑,--extrac-ldflags用於指定庫檔案路徑。
注意:一定要指定SDL庫和x264庫的標頭檔案和庫檔案路徑。
(5). 驗證安裝
驗證生成ffmpeg工具是否可執行,利用ffplay播放視訊檔案,檢視是否可以正常播放。
驗證生成的動態庫和可執行程式是否是64位,利用dumpbin檢視動態庫和可執行程式的屬性資訊。