本文的內容幾乎所有來自於FFmpeg on Windows,可是因爲國內的網絡封鎖,很難訪問這個域名下的內容,所以我一方面按照我本身的理解和實踐作了翻譯,另外一方面也是爲了能提供一個方便的參考方法。
注:php
1. 對於compile和build這兩個詞,本文統一的使用編譯這個詞,根據上下文讀者應能區分語義上的差異。html
本文的目的是提供一切與FFmpeg在Windows下的相關幫助。它最初是一個針對用MSys+MinGW系統編譯的手把手的教程,如今也增長了如何在你的項目中連接FFmpeg所產生的庫(C++,C#)。
咱們不討論Cygwin,由於它的工做方式基本上與Unix系統相一致。 開始以前,首先要明確如下幾點:c++
1. 因爲MSVC++並不嚴格的遵循C標準,所以FFmpeg不能使用MSVC++來編譯,並且未來也不會支持。因此整個編譯過程必須使用MSys+MinGW系統來完成。shell
2. 若是你選擇編譯動態連接庫(dll),這些庫將和其餘的動態連接庫同樣在使用上沒什麼差異。你可使用MSVC++來連接這些庫進入到你的程序,只有這種狀況下MSVC++是被支持的。api
介紹本指南是十分冗長的。若是你已經之前曾有過編譯開源軟件的經驗,你能夠嘗試讀一下這篇。它要簡短的多,只須要一些小的微調就能正常工做。
可是若是你遇到了任何問題,在你向ffmpeg的郵件列表報告錯誤時請先仔細的通讀本文,它是很是直觀的,很多地方的細節甚至可能過於詳細了。咱們試圖涵蓋一切可能出錯的地方,若是你精確的遵守文中的方法,你不會在Windows環境下的FFmpeg上有任何問題。 盡你的努力去解決你所遇到的問題,絕大多數的FFmpeg開發人員不使用Windows,因此他們幫不了你什麼。
預備這裏的內容可能和本文沒有什麼關係,可是我不想留下任何可能出錯的地方。對於絕大多數人來講,這一部分能夠跳過。 你須要一個解壓的工具軟件支持「*.tar.gz」和「*.tar.bz2」文件。你將須要把這些壓縮包解壓縮到指定的目錄下。若是你已經有這樣的程序了,而且知道如何解壓到特定目錄下,請閱讀準備MSys+MinGW系統。 這裏我將演示如何使用7-Zip或WinRAR來解壓縮。推薦使用7-Zip,由於它是開源且免費的。bash
準備MSys+MinGW系統獲取最新的MSys+MinGW系統。注意如下幾個包的版本要求:網絡
若是你已經安裝配置完畢,那麼請閱讀下一部分用SVN方式獲取FFmpeg(http://www.aurora-x.net/wiki/CompileFFmpegWindows#FFmpeg_SVN),不然的話請依次執行下面的步驟。編輯器
用SVN方式獲取FFmpeg若是你已經知道如何獲取FFmpeg的源代碼,那麼請閱讀下一部分編譯。 因爲FFmpeg的源代碼存放在SVN倉庫裏,你必須使用命令行程序或是圖形界面程序來訪問。我我的推薦TortoiseSVN,由於它和Windows資源管理器結合的很是棒,因此我只介紹使用TortoiseSVN的方法。 編譯ide
連接函數
編譯FFplay你必須事先安裝了SDL-devel。
1. 解壓該軟件包。
2. 將lib下的全部文件複製到C:/msys/mingw/lib。
3. 將include下的全部文件複製到C:/msys/mingw/include。
4. 將bin下的i386-mingw32msvc-sdl-config複製到C:/msys/mingw/bin,並重命名爲sdl-config。
5. 將bin下的SDL.dll複製到C:/msys/mingw/bin。
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腳本傳遞這些路徑信息。
CODE:
--extra-ldflags=-L<prefix>/lib --extra-cflags=-I<prefix>/include
相似這樣:
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。 我將展現下面這些庫的安裝:
引用原文:http://www.aurora-x.net/wiki/CompileFFmpegWindows
安裝MSys
下載以下的文件:
接下來依次安裝這些文件:
運行 MSYS-1.0.11-2004.04.30-1.exe.
點Yes
點Next >
若是你接受許可協議,點Yes
點Next >
選擇MSys安裝的路徑,推薦C:/msys。點Next >。
點Next >
選擇MSys在啓動菜單中位置,推薦MinGW,點Next >。
點Install。不久你將看到
輸入n後回車
再按一下回車。
把全部打勾的框去掉,而後點Finish
msys-1.0.dll-SNAP-1.0.11-2006.04.23.tar.bz2
bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
修改 "msys.bat"
用文本編輯器打開C:/msys/msys.bat,譬如記事本等。若是你打算用MSVC++編譯你的程序(注意:是你的程序,不是FFmpeg),你須要有.lib文件才能連接到FFmpeg的庫。這些.lib文件可使用微軟的工具鏈中lib命令產生。爲此,你的機器上必須已經安裝了微軟的Visual Studio或是Visual C++。把下面這行加到msys.bat的最前面,把路徑替換成你機器上vcvars32.bat實際存在的路徑。
call "C:/Program Files (x86)/Microsoft Visual Studio .NET 2003/vc7/bin/vcvars32.bat"
若是你的操做系統是Windows x64,那你必須把下面的這些內容插入到:_WindowsNT標籤後面(行36):
rem Hopefully a temporary workaround for getting MSYS shell to run on x64
rem (WoW64 cmd prompt sets PROCESSOR_ARCHITECTURE to x86)
if not "x%PROCESSOR_ARCHITECTURE%" == "xAMD64" goto _NotX64
set COMSPEC=%WINDIR%/SysWOW64/cmd.exe
%COMSPEC% /c %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
goto EOF
:_NotX64
安裝MinGW
下載這些文件:
把它們所有解壓到C:/msys/mingw。
整合MinGW和MSys
複製C:/msys/etc/fstab.sample爲C:/msys/etc/fstab。
用文本編輯器打開C:/msys/etc/fstab編輯。(注意:使用一個支持Unix換行風格的編輯器)
把下面這行
c:/mingw /mingw
改成
c:/msys/mingw /mingw
編譯靜態庫
若是你的系統已經按照所安裝配置,那麼下面的動做將正常執行:
從啓動菜單出進入
開始->程序->MinGW->MSys->msys
一個米色背景的窗口會出如今你的眼前,這是一個運行着bash的rxvt程序
這是一個類Linux的shell而且在Windows上運行的就像是在使用一個真正的Linux shell。
切換目錄到你以前存放FFmpeg源代碼的目錄,若是你嚴格的按照本文的示範,那麼就應該輸入下面的命令來切換:
cd /C/ffmpeg
首先配置FFmpeg,選擇你所須要的部分,若是你還想安裝額外的庫(例如mp3lame,或xvid),參考後面的使用第三方庫部分。不過先確保完成了這一部分和下一部分動態庫編譯。
若是你不知道項包含什麼,那麼就輸入:
./configure --enable-memalign-hack
--enable-memalign-hack選項是在FFmpeg在Windows上編譯成功所必須指定的。
待配置完成後,將回到命令提示符,你應該看到以下的畫面:
若是沒有錯誤的話,你如今就能夠"make" FFmpeg了,在提示符後輸入:
make
編譯的過程將持續很長時間。若是一切正常,結束後將返回提示符,並有以下的輸出畫面
程序已經編譯好了,你能夠在ffmpeg的目錄下找到ffmpeg.exe這個文件。以後,你應該執行安裝步驟
make install
獲得以下的輸出畫面:
這將會複製全部生成的重要文件到系統的"Program Files"目錄下。一般"Program Files"目錄是"C:/Program Files",但也有可能會不一樣。要了解確切的路徑,在提示符下輸入:
echo $PROGRAMFILES
而後將Windows風格的路徑名改成Linux風格的路徑名,進入該目錄,在該目錄下輸入
cd FFmpeg
很好,你如今能夠方便的運行ffmpeg.exe,FFmpeg已經成功的編譯並靜態連接了。
固然你得知道正確的參數使用方法,要產生Windows兼容的文件請參考http://ffmpeg.mplayerhq.hu/faq.html#SEC9以獲取更多的信息。
編譯動態庫
編譯動態庫和編譯靜態庫沒有什麼明顯的差異,只不過你要明確地告訴configure腳本你如今將編譯動態庫。
若是尚未MSys的話,那麼如今啓動它:
開始->程序->MinGW->MSys->msys
切換到FFmpeg的源代碼目錄,在開始編譯前先清理上一次留下的中間文件是個好習慣:
make distclean
如今須要向configure腳本多傳遞兩個參數:
./configure --enable-shared --disable-static --enable-memalign-hack
後面的則不變:
make
make install
在Program Files下的FFmpeg目錄裏,如今應該多了一些文件:
ffmpeg.exe
avcodec.dll
avcodec-51.dll
avcodec-51.11.0.dll
avutil.dll
avutil-49.dll
avutil-49.0.0.dll
avformat.dll
avformat-50.dll
avformat-50.5.0.dll
include/
lib/
你可能已經注意到了每一個庫都有三個對應的dll,它們是同一份文件拷貝。
由於MSys將ln(製做符號連接的程序)以cp(文件複製)來對待,因此就產生了這些相同的拷貝。
除了消耗點磁盤外不會有任何其餘問題,不過對於全部使用這些庫的可執行文件來講只連接到SLIBNAME_WITH_MAJOR,所以你能夠放心的刪除另外兩個。換句話說你只需留下avcodec-51.dll、avformat-50.dll 和 avutil-49.dll就好了。
include目錄包含了一個名爲ffmpeg的子目錄,這個子目錄裏存放了全部其餘應用程序訪問FFmpeg庫時所需包含的頭文件。
lib目錄下有一個子目錄pkgconfig。若是你不知道它是幹嘛的,那就忽略它吧。
用MSVC++連接DLL庫
這是絕大多數人發生誤解的地方:FFmpeg SVN自己不能用MSVC++編譯,可是若是它在MinGW下正確的被編譯,那麼你能夠把生成的dll用在任何支持dll的程序裏。
注意你將用到的不是ffmpeg.exe,而是那些dll。
在開始往下閱讀以前,你應該確保你完成並理解了編譯靜態庫和編譯動態庫部分的內容。這不是推薦的,而是必須的。
在msys提示符下輸入:
lib
若是你看到以下的畫面,說明一切OK,注意有Microsoft (R) Library Manager字樣。
上面假定了你是在完成了編譯動態庫後在FFmpeg目錄下執行的,若是你尚未編譯動態庫,那麼依次執行以下:
cd /c/ffmpeg
make distclean
./configure --enable-shared --disable-static --enable-memalign-hack
make
make install
lib
在ffmpeg目錄下有三個子目錄名字分別爲:libavutil、libavcodec 和 libavformat。在這三個目錄下都有一個SLIBNAME_WITH_MAJOR.lib這樣的文件,分別是avcodec-51.lib、avformat-50.lib 和avutil-49.lib。MSVC++從這些文件中才能知道dll的導出函數。把這三個文件拷貝到Program Files下的FFmpeg下的lib目錄。
如今經過包含include/ffmpeg下的頭文件,和使用剛纔咱們拷貝的那三個lib文件進行連接,就可以編寫具有FFmpeg功能的應用程序了。
我提供了一個示例:用MSVC++建立output_example.exe
用MSvc++建立output_example.ex
這是絕大多數人發生誤解的地方:FFmpeg SVN自己不能用MSVC++編譯,可是若是它在MinGW下正確的被編譯,那麼你能夠把生成的dll用在任何支持dll的程序裏。
注意你將用到的不是ffmpeg.exe,而是那些dll。
在開始往下閱讀以前,你應該確保你完成並理解了編譯靜態庫和編譯動態庫部分的內容。這不是推薦的,而是必須的。
在msys提示符下輸入:
lib
若是你看到以下的畫面,說明一切OK,注意有Microsoft (R) Library Manager字樣。
上面假定了你是在完成了編譯動態庫後在FFmpeg目錄下執行的,若是你尚未編譯動態庫,那麼依次執行以下:
cd /c/ffmpeg
make distclean
./configure --enable-shared --disable-static --enable-memalign-hack
make
make install
lib
在ffmpeg目錄下有三個子目錄名字分別爲:libavutil、libavcodec 和 libavformat。在這三個目錄下都有一個SLIBNAME_WITH_MAJOR.lib這樣的文件,分別是avcodec-51.lib、avformat-50.lib 和avutil-49.lib。MSVC++從這些文件中才能知道dll的導出函數。把這三個文件拷貝到Program Files下的FFmpeg下的lib目錄。
如今經過包含include/ffmpeg下的頭文件,和使用剛纔咱們拷貝的那三個lib文件進行連接,就可以編寫具有FFmpeg功能的應用程序了。
我提供了一個示例:用MSVC++建立output_example.exe
用MSvc++建立output_example.exe