在Windows下編譯ffmpeg徹底手冊

本文的內容幾乎所有來自於FFmpeg on Windows,可是因爲國內的網絡封鎖,很難訪問這個域名下的內容,所以我一方面按照我本身的理解和實踐作了翻譯,另外一方面也是爲了能提供一個方便的參考方法。

注:php

1.       對於compilebuild這兩個詞,本文統一的使用編譯這個詞,根據上下文讀者應能區分語義上的差異。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系統。注意如下幾個包的版本要求:網絡

  • 不要使用2.0.4bash,這個是有缺陷的,2.05bbash用來編譯FFmpeg沒有問題,可是更推薦3.1版本。
  • 使用msys-1.0.dll-SNAP-1.0.11-2006.04.23
  • 不要使用binutils-2.15.91-20040904-1,它沒法正確的連接。

    若是你已經安裝配置完畢,那麼請閱讀下一部分用SVN方式獲取FFmpeghttp://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

 

[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的缺省includelib路徑下,就不須要額外指定這些參數了。若是你但願把動態庫和靜態庫分開保存,那就不得不指定路徑。這樣的路徑被稱爲你所安裝的庫的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。 我將展現下面這些庫的安裝:

引用原文:http://www.aurora-x.net/wiki/CompileFFmpegWindows

 

安裝MSys

    下載以下的文件:

接下來依次安裝這些文件:

MSYS-1.0.11-2004.04.30-1.exe

運行 MSYS-1.0.11-2004.04.30-1.exe.

 

         

Yes

 

Next >

 

若是你接受許可協議,點Yes

 

Next >

 

選擇MSys安裝的路徑,推薦C:/msys。點Next >

 

Next >

 

選擇MSys在啓動菜單中位置,推薦MinGW,點Next >

上載新附件"Install.png"

Install。不久你將看到

 

輸入n後回車

 

再按一下回車。

 

把全部打勾的框去掉,而後點Finish

msys-1.0.dll-SNAP-1.0.11-2006.04.23.tar.bz2

  • 將該壓縮包解壓到C:/msys/bin
  • 在Windows資源管理器中打開C:/msys/bin目錄。
  • 刪除文件msys-1.0.dll(你剛纔已經解壓了一個新的版本了,因此刪除舊的沒有問題)。
  • 重命名new-msys-1.0.dllmsys-1.0.dll

bash-3.1-MSYS-1.0.11-snapshot.tar.bz2

  • 在本地目錄解壓該壓縮包。
  • 產生一個名爲bash-3.1的目錄。
  • 在該目錄下有一個子目錄名爲bin,其餘的目錄並不關心。
  • 複製bin目錄中的全部文件到C:/msys/bin
  • 提示是否要覆蓋sh.exe的時候,選擇肯定。

修改 "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

 

整合MinGWMSys

複製C:/msys/etc/fstab.sampleC:/msys/etc/fstab

用文本編輯器打開C:/msys/etc/fstab編輯。(注意:使用一個支持Unix換行風格的編輯器)

把下面這行

c:/mingw        /mingw

改成

c:/msys/mingw   /mingw

 

 

編譯靜態庫

    若是你的系統已經按照所安裝配置,那麼下面的動做將正常執行:

從啓動菜單出進入

開始->程序->MinGW->MSys->msys

一個米色背景的窗口會出如今你的眼前,這是一個運行着bashrxvt程序

 

這是一個類Linux的shell而且在Windows上運行的就像是在使用一個真正的Linux shell。

  1. 目錄名使用正斜槓來分割,而不是Windows所使用的反斜槓(象"C:/ffmpeg"而不是"C:/ffmpeg")。
  2. 盤符(例如"C:/")能夠從根目錄處訪問(像這樣"/C/")。
  3. 文件名或目錄名中的空格必須用雙引號括起(例如這樣"/C/Program Files (x86)",帶有雙引號)。

切換目錄到你以前存放FFmpeg源代碼的目錄,若是你嚴格的按照本文的示範,那麼就應該輸入下面的命令來切換:

cd /C/ffmpeg

 

 

首先配置FFmpeg,選擇你所須要的部分,若是你還想安裝額外的庫(例如mp3lame,或xvid),參考後面的使用第三方庫部分。不過先確保完成了這一部分和下一部分動態庫編譯。

若是你不知道項包含什麼,那麼就輸入:

./configure --enable-memalign-hack

--enable-memalign-hack選項是在FFmpegWindows上編譯成功所必須指定的。

待配置完成後,將回到命令提示符,你應該看到以下的畫面:

 

若是沒有錯誤的話,你如今就能夠"make" FFmpeg了,在提示符後輸入:

make

編譯的過程將持續很長時間。若是一切正常,結束後將返回提示符,並有以下的輸出畫面

 

程序已經編譯好了,你能夠在ffmpeg的目錄下找到ffmpeg.exe這個文件。以後,你應該執行安裝步驟

make install

獲得以下的輸出畫面:

 

這將會複製全部生成的重要文件到系統的"Program Files"目錄下。一般"Program Files"目錄是"C:/Program Files",但也有可能會不一樣。要了解確切的路徑,在提示符下輸入:

echo $PROGRAMFILES

而後將Windows風格的路徑名改成Linux風格的路徑名,進入該目錄,在該目錄下輸入

cd FFmpeg

 

很好,你如今能夠方便的運行ffmpeg.exeFFmpeg已經成功的編譯並靜態連接了。

固然你得知道正確的參數使用方法,要產生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,它們是同一份文件拷貝。

  • SLIBNAME contains only the library name (avcodec.dll)
  • SLIBNAME_WITH_MAJOR contains library name and major version number (avcodec-51.dll)
  • SLIBNAME_WITH_VERSION contains library name and full version number (avcodec-51.11.0.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目錄下有三個子目錄名字分別爲:libavutillibavcodec  libavformat。在這三個目錄下都有一個SLIBNAME_WITH_MAJOR.lib這樣的文件,分別是avcodec-51.libavformat-50.lib avutil-49.libMSVC++從這些文件中才能知道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目錄下有三個子目錄名字分別爲:libavutillibavcodec  libavformat。在這三個目錄下都有一個SLIBNAME_WITH_MAJOR.lib這樣的文件,分別是avcodec-51.libavformat-50.lib avutil-49.libMSVC++從這些文件中才能知道dll的導出函數。把這三個文件拷貝到Program Files下的FFmpeg下的lib目錄。

如今經過包含include/ffmpeg下的頭文件,和使用剛纔咱們拷貝的那三個lib文件進行連接,就可以編寫具有FFmpeg功能的應用程序了。

我提供了一個示例:用MSVC++建立output_example.exe

MSvc++建立output_example.exe

相關文章
相關標籤/搜索