本文參考了網路上的不少文章,但由於版本環境的問題參考文章並不能直接指導編譯,本文吸收多方經驗,並在自己多次編譯實驗的基礎上寫成,歡迎轉載,請注名出處。
FFmpeg是在Linux平台下開發的,但它同樣可以在其它作業系統環境中編譯運行,本文介紹的就是在windows下編譯FFmpeg。
一 編譯準備
您最好建立一個目錄專門用來儲存以下下載的檔案。
1 下載 MinGW 和 MSYS
MinGW(Minimalist GNU on Windows):一個可自由使用和自由發布的Windows特定標頭檔和使用GNU工具集匯入庫的集合,允許你產生本地的Windows程式而不需要第三方C執行階段程式庫。
到:http://sourceforge.net/projects/mingw/ 去下載即可
A 點擊“DownLoad mingw-get-inst-...exe”
B 切換到頁面:download? Check your browser's security bar, or try a direct link, or try another mirror.
C 點擊“direct link”下載類似:mingw-get-inst-20111118.exe 的檔案
提示:msys此處就不用再下載了,mingw-get-inst-20111118.exe 中已經包含了msys1.0,後面安裝的時候就可以看到該選項。
2 下載 yasm(彙編編譯器)
ffmpeg編譯的時候裡面的彙編代碼需要yasm.exe
去官網:http://yasm.tortall.net/Download.html 下載
在Latest Release欄,直接下載:Win32 .exe (for general use on 32-bit Windows)
檔案名稱類似為:yasm-1.2.0-win32.exe
3 下載 ffmpeg
ffmpeg可以到 http://www.ffmpeg.org/releases/ 下載
選擇的一個最新版本下載即可,如:ffmpeg-0.8.6.tar.gz
檔案名稱類似為:ffmpeg-0.8.6.tar.gz
當然你也使用網上介紹的使用SVN直接下載原始碼的方法。
svn://svn.mplayerhq.hu/ffmpeg/trunk
4 下載 mp3lame(支援mp3,可選項)
為了讓編譯出來的ffmpeg支援對mp3格式的編解碼,您需要先下載lame。
到:http://sourceforge.net/projects/lame/files/ 下載
檔案名稱類似為:lame-3.99.2.tar.gz 的包。
5 下載 x264(支援x264,可選項)
為了讓編譯出來的ffmpeg支援對x264格式的編解碼,您需要先下載x264。
到:http://www.videolan.org/developers/x264.html下載
檔案名稱類似為:last_x264.tar.bz2 的包。
6 下載 Xvid(支援Xvid,可選項)
為了讓編譯出來的ffmpeg支援對Xvid格式的編解碼,您需要先下載Xvid。
到:http://www.xvid.org/ 下載
檔案名稱類似為:xvidcore-1.3.2.tar.gz 的包。
7 下載 faad2(支援faad,可選項)
到:http://www.audiocoding.com/downloads.html 下載:Version 2.7 bootstrapped TAR.GZ Package
檔案名稱類似為:faad2-2.7.tar.gz 的包。
8 下載 faac(支援faac,可選項)
到:http://www.audiocoding.com/downloads.html 下載:Version 1.28 bootstrapped TAR.GZ Package
檔案名稱類似為:faac-1.28.tar.gz 的包。
9 下載 aacenc(支援aac,可選項)
到:http://sourceforge.net/projects/opencore-amr/files/ 下載:vo-aacenc
檔案名稱類似為:vo-aacenc-0.1.1.tar.gz 的包。
10 下載 amr-nb與amr-wb (早期ffmpeg支援3gp,可選項)
到:http://www.penguin.cz/%7Eutx/amr 下載:amrnb-7.0.0.2.tar.bz2與amrwb-7.0.0.4.tar.bz2
檔案名稱類似為:amrnb-7.0.0.2.tar.tar 與amrwb-7.0.0.4.tar.tar 的包。
11 下載 opencore-amr與vo-amrwbenc (支援3gp,可選項)
到:http://sourceforge.net/projects/opencore-amr/files/ 下載:opencore-amr 與 vo-amrwbenc
檔案名稱類似為:opencore-amr-0.1.2.tar.gz 與vo-amrwbenc-0.1.1.tar.gz 的包。
12 下載 SDL(支援SDL,可選項)
SDL下載可以到:http://www.libsdl.org/download-1.2.php
在Source Code欄選擇類似:SDL-1.2.14.tar.gz - GPG signed 進行下載,
檔案名稱類似為:SDL-1.2.14.tar.tar,此檔案需要編譯才能產生lib庫。
也可以直接下載 SDL-devel-1.2.14-mingw32.tar.gz (Mingw32),檔案名稱類似為:SDL-devel-1.2.14-mingw32.tar.tar,此檔案帶有編譯好的lib,在編譯ffmpeg時可以直接使用。
13 下載 pthreadGC2.dll
pthreadgc2.dll是功能強大的處理數字化影視作品編輯軟體premiere6運行所需的一個DLL檔案。這是一個無威脅檔案。屬於Open Source Software community project的檔案。
直接去baidu.com三搜尋下載就可以了。
二 編譯步驟
1 安裝 mingw 和 msys
執行下載檔案:mingw-get-inst-20111118.exe,
在第3步選擇“Download latest repository catalogues”
選擇安裝路徑:C:\MinGW(我直接採用預設路徑,未做修改)
在“Select Components”步驟中選擇:
√ C Compiler (預設且一定選擇)
√ C++ Compiler
√ MSYS Basic System(選擇此項將會安裝msys,msys則不需要另外安裝)
√ MinGW Developer ToolKit
等待安裝完成!(需要等待一定的時間,因為安裝過程需要下載檔案,可想而知,網速越快,安裝越快)
安裝完成後,在C:\MinGW目錄下可以看到 msys 檔案夾,msys也已經安裝。
2 配置 msys.bat 批次檔
為了方便VS200X以及VS2010調用ffmpeg的動態庫,可以通過配置讓ffmpeg編譯時間產生windows下調用dll對應的lib,當然,如果你沒有這個需要,那麼就可以省略以下處理,直接進入步驟3。
進入:C:\MinGW\msys\1.0\檔案夾,使用UltraEdit開啟msys.bat檔案,在檔案的最最前面加入如下一行:
call "D:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
添加後效果如下:
call "D:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
@echo off
rem Copyright (C): 2001, 2002, 2003, 2004, 2005 Earnie Boyd
rem mailto:earnie@users.sf.net
rem This file is part of Minimal SYStem
rem http://www.mingw.org/msys.shtml
rem
rem File: msys.bat
rem Revision: 2.4
rem Revision Date: December 8th, 2005
rem ember to set the "Start in:" field of the shortcut.
rem A value similar to C:\msys\1.0\bin is what the "Start in:" field needs
rem to represent.
其中“D:\Program Files\Microsoft Visual Studio 10.0”為你機器上安裝VS200X或VS2010的目錄,我的電腦安裝的是VS2010,並且安裝在了D盤。檔案修改後儲存即可。
3 系統整合
使用UltraEdit修改C:\MinGW\msys\1.0\etc目下的fstab檔案,如果不存在fstab,請複製一份fstab.sample,然後改名為:fstab,再修改其內容為:C:/MinGW /mingw,也即為MinGW的安裝路徑。
4 配置 yasm
為了減少配置環境變數的麻煩,本處直接把 yasm-1.1.0-win32.exe 檔名修改成:yasm.exe,並放到系統目錄下:C:\WINDOWS\system32。
5 編譯 mp3lame(可選項)
lame-3.99.2.tar.gz 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,切換到lame目錄:D:\ffmpeg\lame-3.99.2
$ cd /d
$ cd ffmpeg
$ cd lame-3.99.2
再執行以下命令:
$./configure --disable-shared (首選)
或: $./configure --disable-static --enable-shared
$ make
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
6 編譯 x264(可選項)
last_x264.tar.bz2 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,切換到x264目錄:D:\ffmpeg\x264-20111124-2245
$ cd /d
$ cd ffmpeg
$ cd x264-20111124-2245
再執行以下命令:
$./configure --enable-shared --disable-asm --enable-pthreads
$ make
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
PS:如果沒有--enable-pthreads,則線程庫編譯報錯,如下
CC libavutil/atomic.olibavutil/atomic.c:101:2: Fehler: #error "Threading is enabled, but there is no implementation of atomic operations available"common.mak:48: recipe for target 'libavutil/atomic.o' failedmake: *** [libavutil/atomic.o] Error 1
參考:http://avcodec.org/trac/ffmpeg/ticket/2363
7 編譯 Xvid(可選項)
xvidcore-1.3.2.tar.gz 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,切換到xvidcore目錄:D:\ffmpeg\xvidcore\build\generic
$ cd /d
$ cd ffmpeg
$ cd xvidcore/build/generic
再執行以下命令:
$./configure --prefix=C:/MinGW/msys/1.0/local
$ make
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下。
需要注意的就是:此處編譯加上了路徑
如果make時出現:cc1.exe: error: unrecognized command line option '-mno-cygwin' 錯誤,請在./configure後make之前修改xvidcore\build\generic裡的 platform.inc檔案,直接刪除裡面的“-mno-cygwin”。
具體可以參考:http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=5&t=111裡2樓的回答,如果按他說的:I recommend re running ./bootstrap.sh after you do this.,我發現不太行,一運行bootstrap.sh後,platform.inc檔案會被還原,並且./configure時也會還原該檔案,所以我選擇在./configure後make前修改,可以編譯通過,目前沒檢驗Xvid是否可用。
8 編譯 faad2(可選項)
faad2-2.7.tar.gz 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,已經啟動的話就不用再重新啟動了。切換到faac2目錄:D:\ffmpeg\faad2-2.7
$ cd /d
$ cd ffmpeg
$ cd faad2-2.7
再執行以下命令:
$./bootstrap
$./configure --disable-static --enable-shared
$ make
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
9 編譯faac(可選項)
faac-1.28.tar.gz 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,已經啟動的話就不用再重新啟動了。切換到faac2目錄:D:\ffmpeg\faac-1.28
$ cd /d
$ cd ffmpeg
$ cd faac-1.28
再執行以下命令:
$./bootstrap
$./configure --disable-static --enable-shared
$ make
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
10 編譯vo-aacenc (可選項)
vo-aacenc-0.1.1.tar.gz 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,已經啟動的話就不用再重新啟動了。切換到vo-aacenc目錄:D:\ffmpeg\vo-aacenc-0.1.1
$ cd /d
$ cd ffmpeg
$ cd vo-aacenc-0.1.1
再執行以下命令:
$./configure --disable-shared
$ make
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
11 編譯amr-nb和amr-wb (早期ffmpeg版本,可選項)
在編譯amrnb和amrwb之前還需要做點其它的準備工作:
A 先到網上搜尋下載wget工具,解壓後放到C:\MinGW\bin目錄下,此工具是個網路下載工具,用來在編譯時間自動下載3gpp源碼。
B 再先到http://downloads.sourceforge.net/gnuwin32/unzip-5.51-1-bin.zip 下載unzip-5.51-1-bin.zip後進行解壓,並把unzip-5.51-1-bin\bin中的unzip.exe拷貝到C:\MinGW\bin目錄下,此工具用來在編譯時間自動解壓3gpp源碼。
amrnb-7.0.0.2.tar.tar 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,已經啟動的話就不用再重新啟動了。切換到amrnb目錄:D:\ffmpeg\amrnb-7.0.0.2
$ cd /d
$ cd ffmpeg
$ cd amrnb-7.0.0.2
再執行以下命令:
$./configure --disable-static --enable-shared
$ make
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
amrwb-7.0.0.4.tar.tar 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,已經啟動的話就不用再重新啟動了。切換到amrwb目錄:D:\ffmpeg\amrwb-7.0.0.4
$ cd /d
$ cd ffmpeg
$ cd amrwb-7.0.0.4
再執行以下命令:
$./configure --disable-static --enable-shared
$ make
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
12 編譯opencore-amr 和vo-amrwbenc (可選項)
opencore-amr-0.1.2.tar.gz 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,已經啟動的話就不用再重新啟動了。
如果是opencore-amr-0.1.1.tar.gz請注釋掉以下Makefile中的幾行
檔案: ./opencore-amr/amrnb/Makefile
install: libopencore-amrnb.a $(SHLIB)
install -d $(DESTDIR)$(PREFIX)/lib
install -m 644 libopencore-amrnb.a $(DESTDIR)$(PREFIX)/lib
# install $(SHLIB) $(DESTDIR)$(PREFIX)/lib
ifneq ($(shell uname), Darwin)
# ln -sf $(SHLIB) $(DESTDIR)$(PREFIX)/lib/$(SONAME)
# ln -sf $(SONAME) $(DESTDIR)$(PREFIX)/lib/libopencore-amrnb.so
endif
檔案: ./opencore-amr/amrwb/Makefile
install: libopencore-amrwb.a $(SHLIB)
install -d $(DESTDIR)$(PREFIX)/lib
install -m 644 libopencore-amrwb.a $(DESTDIR)$(PREFIX)/lib
# install $(SHLIB) $(DESTDIR)$(PREFIX)/lib
ifneq ($(shell uname), Darwin)
# ln -sf $(SHLIB) $(DESTDIR)$(PREFIX)/lib/$(SONAME)
# ln -sf $(SONAME) $(DESTDIR)$(PREFIX)/lib/libopencore-amrwb.so
endif
切換到opencore-amr目錄:D:\ffmpeg\ opencore-amr-0.1.2
$ cd /d
$ cd ffmpeg
$ cd opencore-amr-0.1.2
再執行以下命令:
$./configure --disable-shared
$ make CC=gcc
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
vo-amrwbenc-0.1.1.tar.gz 接壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,已經啟動的話就不用再重新啟動了。切換到vo-amrwbenc目錄:D:\ffmpeg\ vo-amrwbenc-0.1.1
$ cd /d
$ cd ffmpeg
$ cd vo-amrwbenc-0.1.1
再執行以下命令:
$./configure --disable-shared
$ make CC=gcc
$ make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
13 編譯SDL(可選項)
SDL-1.2.14.tar.tar 解壓到:D:\ffmpeg\ 目錄下, 雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,切換到SDL目錄:D:\ffmpeg\SDL-1.2.14,切換方法如下:
$ cd /d
$ cd ffmpeg
$ cd SDL-1.2.14
再執行以下命令:
./configure
make
make install
編譯結果在:C:\MinGW\msys\1.0\local 目錄下
注意:如果是使用編譯好的SDL-devel-1.2.14-mingw32.tar.tar,那麼就可以省掉上面的編譯工作,直接解壓SDL-devel-1.2.14-mingw32.tar.tar檔案即可。自己編譯或直接使用編譯好的都需要做下面的修改和拷貝工作。
使用UltraEdit開啟C:\MinGW\msys\1.0\local\bin下的 sdl-config檔案
把 prefix=/usr 該成: prefix=c:/mingw
其中:c:/mingw 為 mingw的安裝路徑,請根據你的安裝進行修改。為了編譯時間msys能識別sdl並開啟 SDL support yes 進行編譯,請把C:\MinGW\msys\1.0\local編譯結果bin、include和lib中有關sdl的拷貝一份到C:\MinGW\的對應目錄中。
14 拷貝編譯結果
C:\MinGW\msys\1.0\local 到 D:\ffmpeg\ffmpeg-0.8.6
bin拷貝到 bin中
include拷貝到 include中
lib拷貝到 lib中
當然該拷貝過程你可以不做,只要在編譯的時候把路徑指到:C:\MinGW\msys\1.0\local裡面。
15 編譯 ffmpeg
ffmpeg-0.8.6.tar.bz2 解壓到:D:\ffmpeg\ 目錄下,雙擊“C:\MinGW\msys\1.0\msys.bat”,啟動“MinGW32”,切換到ffmpeg目錄:D:\ffmpeg\ffmpeg-0.8.6,切換方法如下:
$ cd /d
$ cd ffmpeg
$ cd ffmpeg-0.8.6
如果你的“MinGW32”沒有關閉,可以直接切換路徑到:D:\ffmpeg\ffmpeg-0.8.6。
再執行以下命令:
$ ./configure --enable-shared --disable-static --enable-ffplay
--enable-nonfree --enable-memalign-hack
--enable-libmp3lame
--enable-gpl--enable-libx264
--enable-libxvid
--enable-faad --enable-libfaac
--enable-libvo-aacenc
--enable-version3 --enable-libopencore-amrnb
--enable-libopencore-amrwb --enable-libvo-amrwbenc
--extra-cflags=-Id:/ffmpeg/ffmpeg-0.8.6/include
--extra-ldflags=-Ld:/ffmpeg/ffmpeg-0.8.6/lib
請耐心等待一段時間,以上命令不能直接換行哦並且根據ffmpeg的版本不同有所變化,具體看./configure --help,你知道的。。。
$ make
需要等待很長一段時間,等待編譯結束。
為了匯總編譯結果,請繼續執行以下命令:
$ make install
等待完成,在C:\MinGW\msys\1.0\local中將會產生 bin、include、lib等檔案夾,其中包含了ffmpeg.exe、ffplay.exe、ffprobe.exe、dll、lib和標頭檔等。
16 運行測試
直接雙擊運行”ffplay.exe”,如果提示沒有“pthreadGC2.dll”檔案,你可以包“pthreadGC2.dll”直接拷貝到目前的目錄,也可放到系統目錄C:\WINDOWS\system32中。
ffplay f:/xxx.mp4
參考:
http://blog.csdn.net/yangshu168/archive/2010/01/17/5204269.aspx
http://blog.csdn.net/himulakensin/article/details/6693457
http://blog.csdn.net/huangxiansheng1980/article/details/5712003