本文的內容幾乎全部來自於FFmpeg on Windows,但是由於國內的網路封鎖,很難訪問這個網域名稱下的內容,因此我一方面按照我自己的理解和實踐做了翻譯,另一方面也是為了能提供一個方便的參考方法。
註:
- 對於compile和build這兩個詞,本文統一的使用編譯這個詞,根據上下文讀者應能區分語義上的差別。
本文的目的是提供一切與FFmpeg在Windows下的相關協助。它最初是一個針對用MSys+MinGW系統編譯的手把手的教程,現在也增加了如何在你的項目中連結FFmpeg所產生的庫(C++,C#)。
我們不討論Cygwin,因為它的工作方式基本上與Unix系統相一致。 開始之前,首先要明確以下幾點:
- 由於MSVC++並不嚴格的遵循C標準,因此FFmpeg不能使用MSVC++來編譯,而且將來也不會支援。所以整個編譯過程必須使用MSys+MinGW系統來完成。
- 如果你選擇編譯動態連結程式庫(dll),這些庫將和其他的動態連結程式庫一樣在使用上沒什麼差別。你可以使用MSVC++來連結這些庫進入到你的程式,只有這種情況下MSVC++是被支援的。
介紹本指南是十分冗長的。如果你已經以前曾有過編譯開源軟體的經驗,你可以嘗試讀一下這篇。它要簡短的多,只需要一些小的微調就能正常工作。
但是如果你遇到了任何問題,在你向ffmpeg的郵件清單報告錯誤時請先仔細的通讀本文,它是非常直觀的,不少地方的細節甚至可能過於詳細了。我們試圖涵蓋一切可能出錯的地方,如果你精確的遵照文中的方法,你不會在Windows環境下的FFmpeg上有任何問題。 盡你的努力去解決你所遇到的問題,絕大多數的FFmpeg開發人員不使用Windows,所以他們幫不了你什麼。
預備這裡的內容可能和本文沒有什麼關係,但是我不想留下任何可能出錯的地方。對於絕大多數人來說,這一部分可以跳過。 你需要一個解壓的工具軟體支援“*.tar.gz”和“*.tar.bz2”檔案。你將需要把這些壓縮包解壓縮到指定的目錄下。如果你已經有這樣的程式了,並且知道如何解壓到特定目錄下,請閱讀準備MSys+MinGW系統。 這裡我將示範如何使用7-Zip或WinRAR來解壓縮。推薦使用7-Zip,因為它是開源且免費的。
準備MSys+MinGW系統擷取最新的MSys+MinGW系統。注意以下幾個包的版本要求:
- 不要使用2.0.4的bash,這個是有缺陷的,2.05b的bash用來編譯FFmpeg沒有問題,但是更推薦3.1版本。
- 使用msys-1.0.dll-SNAP-1.0.11-2006.04.23
- 不要使用binutils-2.15.91-20040904-1,它無法正確的連結。
如果你已經安裝配置完畢,那麼請閱讀下一部分用SVN方式擷取FFmpeg,否則的話請依次執行下面的步驟。
- 安裝MSys
- 安裝MinGW
- 整合MinGW和MSys
用SVN方式擷取FFmpeg如果你已經知道如何擷取FFmpeg的原始碼,那麼請閱讀下一部分編譯。 由於FFmpeg的原始碼存放在SVN倉庫裡,你必須使用命令列程式或是圖形介面程式來訪問。我個人推薦TortoiseSVN,因為它和Windows資源管理員結合的非常棒,所以我只介紹使用TortoiseSVN的方法。 編譯
連結
- 用MSVC++連結DLL庫
- 用MSVC++建立output_example.exe
編譯FFplay你必須事先安裝了SDL-devel。
- 解壓該軟體包。
- 將lib下的所有檔案複製到C:/msys/mingw/lib。
- 將include下的所有檔案複製到C:/msys/mingw/include。
- 將bin下的i386-mingw32msvc-sdl-config複製到C:/msys/mingw/bin,並重新命名為sdl-config。
- 將bin下的SDL.dll複製到C:/msys/mingw/bin。
[Copy to clipboard]
CODE:
SDL.dll必須在ffplay.exe德PATH路徑中,程式才能啟動。在MSys環境下mingw/bin在PATH環境變數中,因此運行ffplay.exe不會有問題。但如果你想在MSys外部運行,則應SDL.dll複製到和ffplay.exe同一個目錄下。
現在你可以按照前面的方式靜態或動態重新編譯FFmpeg,在運行configure指令碼後,它將正確的找到SDL和ffplay。
對第三方庫的支援
你必須完全的理解了編譯動態庫部分。
在向FFmpeg的二進位檔案中添加其他的庫時,你必須首先考慮庫是以靜態還是動態連結到FFmpeg中。不要把這個和FFmpeg本身是靜態/動態連結程式庫搞混,你可以把靜態將第三方庫連結到FFmpeg中,但是FFmpeg的庫本身是動態載入的dll庫。
考慮這種情況:你想要更換xvidcore卻不希望重新編譯FFmpeg,那你就應該把xvidcore編譯成動態連結程式庫。
其次你要考慮的是這些第三方庫被安裝到MSys系統中的什麼位置上。
對於絕大多數的是庫,如果你把它們安裝到預設路徑,你就得向FFmpeg的configure指令碼傳遞額外的參數,這樣才能在編譯的時候找到這些庫。
如果你把這些庫安裝到gcc的預設include和lib路徑下,就不需要額外指定這些參數了。如果你希望把動態庫和靜態庫分開儲存,那就不得不指定路徑。這樣的路徑被稱為你所安裝的庫的prefix。 如果你把庫安裝在了非gcc的預設尋找路徑,你必須向FFmpeg的configure指令碼傳遞這些路徑資訊。
[Copy to clipboard]
CODE:
--extra-ldflags=-L<prefix>/lib --extra-cflags=-I<prefix>/include
類似這樣:
[Copy to clipboard]
CODE:
./configure --enable-memalign-hack --enable-mp3lame -–extra-ldflags=-L/usr/local/lib --extra-cflags=-I/usr/local/include
在MSys下gcc的預設路徑是 /mingw另外,如果你把這些庫的dll安裝後,確保你的應用程式能在PATH環境變數中找到相應的dll。 我將展示下面這些庫的安裝:
- zlib
- mp3lame
- xvidcore
- libogg
- libvorbis
- faad
- faac
- amr_nb
- amr_wb
- libdts
- libgsm
- x264
引用原文:http://www.aurora-x.net/wiki/CompileFFmpegWindows