MinGW:一個可自由使用和自由發佈的Windows特定頭文件和使用GNC工具集導入庫的集合,容許你生成本地的Windows程序而不須要第三方C運行時html
MinGW,即 Minimalist GNU For Windows。它是一些頭文件和端口庫的集合,該集合容許人們在沒有第三方動態連接庫的狀況下使用 GCC產生 Windows32 程序。c++
開發 MinGW 是爲了那些不喜歡工做在 Linux(FreeBSD) 操做系統而留在 Windows 的人提供一套符合 GNU 的 GNU 工做環境。redis
因此,使用 MinGW 咱們就能夠像在 Linux 下同樣使用 GNU 程序開發工具。 shell
Minimal GNU(POSIX)system on Windows,是一個小型的GNU環境,包括基本的bash,make等等。是Windows下最優秀的GNU環境。vim
---------------------------------------搭建-------------------------------------------------windows
感謝軟件業的告訴發展,可讓菜鳥們更容易地學習和搭建運行環境。api
原本搭建MinGW+MSys環境是一件麻煩事,但是新版本的MinGw直接安裝就可使用。下面是WinGW的網頁http://www.mingw.org/wiki/InstallationHOWTOforMinGW.在裏面下載最新版本的MinGW能夠直接搭建MinGW+MSys環境。bash
如下的小修改,爲了實現ffmpeg的編譯。app
3)修改「msys.bat」
用文本編輯器打開X:\msys\msys.bat,因爲打算用MSVC++編譯程序,因此須要有.lib文件才能連接到FFmpeg的庫,這些.lib文件可使用微軟的工具鏈中lib命令產生。爲此,機器上必須已經安裝了微軟的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路徑替換成機器上vcvars32.bat實際存在的路徑,好比個人在「D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin」,因而就添加:
call "D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat"frontend
4)系統整合
複製X:\msys\etc\fstab.sample爲X:\msys\etc\fstab,用文本編輯器打開X:\msys\etc\fstab編輯。(須要使用一個支持Unix換行風格的編輯器,好比Notepad++),把下面這行:
X:/mingw /mingw
改成:
X:/msys/mingw /mingw
好了,環境搭建完畢。進入編譯ffmpeg階段。
--------------------------------------編譯--------------------------------------------------
3. 編譯,獲取FFMPEG庫(頭文件,lib,和DLL)
首先經過MSys安裝目錄下的msys.bat啓動MSys,這時會出現一個命令行窗口,它是一個運行着bash的rxvt程序,以下圖:
圖2
這是一個相似Linux的shell而且在Windows上運行,就像是在使用一個真正的Linux shell。不過使用這個shell時須要注意:
→目錄名使用正斜槓來分割,而不是Windows所使用的反斜槓(好比說要寫成"D:/ffmpeg"而不是"D:\ffmpeg")。
→盤符(例如"C:\")能夠從根目錄處訪問(像這樣"/C/")。
→文件名或目錄名中若是帶有空格,必須用雙引號括起(例如這樣"/C/Program Files",帶有雙引號)。
下面切換到存放FFmpeg源代碼的目錄(假如你的代碼解壓以後的路徑是D:\ffmpeg),方法是輸入:"cd /D/ffmpeg"。
接下來要配置FFmpeg,選擇編譯時包含的庫,這裏先輸入:
./configure --enable-shared --disable-static --enable-memalign-hack
--enable-memalign-hack選項是FFmpeg在Windows上編譯成功所必須指定的,待配置完成後,將回到命令提示符,看到下圖所示的畫面:
圖3
若是沒有錯誤的話,就能夠"make"具備基本功能的FFmpeg了,在提示符後輸入:make。
編譯的過程將持續很長時間。若是一切正常,結束後將返回提示符,並有以下的最後編譯結束的輸出畫面:
最後獲取編譯生成的ffmpeg庫(頭文件,lib,dll)
在提示符後輸入:make install。
執行完後會生成幾個文件下在MSys目錄的local文件夾下。目錄如:
4. 在VC下配置(這個指如何在VC中調用ffmpeg庫),測試
VC環境配置:(假如目錄爲上圖所示)
方法固然就像其餘額外庫一個,一種是設置VC全局的Include路徑爲你E:\msys\local\include,設置VC全局lib路徑爲E:\msys\local\bin,增長操做系統的一個Path
E:\msys\local\bin。另外一種就是設置某個工程的lib和Include的路徑。增長一個指向上面對應的地址。這個我就不是說的詳細,想必玩VC的都知道。
首先 建一個VC的控制檯工程,而後把E:\ffmpeg\libavcodec\api-example.c(ffmpeg的存放目錄)拷貝到你建的那個工程。而後更名api-example.cpp。編譯。你會發現卻頭文件。這個時候你須要將E:\msys\mingw\include(mingw安裝目錄下的include)的inttypes.h,stdint.h,_mingw.h三個文件拷到E:\msys\local\include(你ffmpeg庫的目錄下的include)。編譯仍是有不少錯。
1. 須要在inttypes.h中 #define __restrict__ __restrict
2. 若是是long long 錯誤就改爲__int64
3. c->time_base.den= (AVRational){1,25}; 改爲 c->time_base.num = 1; c->time_base.den = 25;//
4. 最上面的頭文件定義以下:
#include <math.h> // 注意這個別忘了,否則會出現math模板的一個錯誤
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern "C"
{
#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include <libavcodec\avcodec.h>
#include <libavutil\mathematics.h>
#pragma comment(lib, "avcodec.lib")
#pragma comment(lib, "avutil.lib")
}
最後編譯應該是不沒有錯誤了。裏面因爲有些測試的視頻文件沒有,因此代碼執行起來也看不出什麼效果。用上面的一個代碼,就是僅僅爲了測試,而後告訴咱們使用咱們已經編譯好的ffmpeg庫還須要作那麼的操做。
(以上大部分轉載於該空間http://apps.hi.baidu.com/share/detail/20685063,感謝他的無私奉獻)
本文參考網上大量資料,經整理而成,並經實踐驗證,最後更新日期2010年3月11日。另外本人使用開發工具爲Delphi,不會VC,因此沒有編譯VC相關的lib庫部分。
本文搭建MinGW+MSYS環境路徑分別假設爲C:\MinGW和C:\MSYS,而且爲純手工安裝,即下載相應的壓縮包,直接解壓到相應目錄。
本文連接——http://www.codecoolie.com/ffmpeg/compile-ffmpeg-under-windows/
本文做者——CodeCoolie
FFmpeg是一套用於錄製、轉換和流化音頻、視頻的完整解決方案,其中包含一組叫作libavcodec的領先的音頻、視頻編碼解碼庫。FFmpeg雖然是在Linux平臺下開發的,但能夠在包括Windows在內的大多數操做系統下進行編譯。
在Windows下編譯FFmpeg所需編譯環境是MinGW,是Minimalist GNU for Windows的縮寫。MinGW包含Windows平臺頭文件、GCC、以及一些GNU工具。
http://www.mingw.org/wiki/msys
MSYS是MinGW的Shell環境,是Minimal SYStem的縮寫。MSYS提供了一些開發工具,如make等。
http://sourceforge.net/projects/mingw/files/
下載以下壓縮包:
GNU Binutils:binutils-2.20.1-2-mingw32-bin.tar.gz
MinGW Runtime:mingwrt-3.18-mingw32-dev.tar.gz
MinGW API for MS-Windows:w32api-3.14-mingw32-dev.tar.gz
GCC Version 4:gcc-core-4.2.1-sjlj-2.tar.gz(GCC 4.4有bug,將x26四、xvid等與ffmpeg一塊兒編譯時候GCC會崩潰)
將上述壓縮包按順序解壓到同一個目錄下便可,例如解壓到C:\MinGW
複製或重命名以下文件,其實就是去掉sjlj後綴:
從C:\MinGW\bin\gcc-sjlj.exe到gcc.exe
NOTICE:libiberty.a使用GNU Binutils包裏較新的,而不是GCC Core包裏的
http://sourceforge.net/projects/mingw/files/
下載以下壓縮包:
msysCORE-1.0.11-bin.tar.gz
msysCORE-1.0.13-2-msys-1.0.13-bin.tar.lzma
make-3.81-2-msys-1.0.11-bin.tar.lzma
coreutils-5.97-2-msys-1.0.11-ext.tar.lzma(只須要pr.exe,configure ffmpeg時候用到)
vim-7.2-1-msys-1.0.11-bin.tar.lzma(不打算使用vi能夠不裝)
將上述壓縮包按順序解壓到同一個目錄下便可,例如解壓到C:\MSYS
編輯C:\MSYS\etc\fstab文本,指定MinGW在MSYS下的掛接目錄
C:/MinGW /mingw
編譯x264時候須要
http://www.tortall.net/projects/yasm/
下載:http://www.tortall.net/projects/yasm/releases/yasm-0.8.0.tar.gz
解壓,編譯安裝:
./configure –prefix=/mingw
make
make install
http://sourceforge.net/projects/mingw/files/
下載以下壓縮包:
MinGW zlib:libz-1.2.3-1-mingw32-dev.tar.gz
將其解壓到C:\MinGW
刪除C:\MinGW\lib\libz.dll.a(不然會使用動態連接,須要libz.dll)
http://sourceforge.net/projects/mingw/files/
下載以下壓縮包:
MinGW bzip2:bzip2-1.0.5-2-mingw32-dev.tar.gz
將其解壓到C:\MinGW
刪除C:\MinGW\lib\libbz2.dll.a(不然會使用動態連接,須要libbz-2.dll)
編譯ffplay時候須要
下載:http://www.libsdl.org/release/SDL-devel-1.2.13-mingw32.tar.gz
解壓,修改Makefile:CROSS_PATH := /mingw
編譯安裝:make cross
源碼取得:svn://svn.mplayerhq.hu/ffmpeg/trunk
配置編譯:假設安裝路徑爲/FFmpeg/Release
./configure –prefix=/FFmpeg/Release –enable-memalign-hack
make
make install
假設第三方庫安裝路徑爲/olibs
GSM support via libgsm
GSM 06.10 lossy speech compression
http://user.cs.tu-berlin.de/~jutta/toast.html
下載gsm-1.0.12.tar.gz
解壓,修改Makefile中的CC = gcc -ansi -pedantic爲CC = gcc
編譯安裝:
make
編譯到後來會出錯,但庫已經編譯完成,用以下命令拷貝便可
cp lib/libgsm.a /olibs/lib/
cp inc/gsm.h /olibs/include/gsm/
ffmpeg編譯參數:–enable-libgsm
MP3 encoding via libmp3lame
http://sourceforge.net/projects/lame/files/
下載lame-3.98.3.tar.gz
解壓,修改lame-3.98-3/libmp3lame/i386/Makefile.in中下面這行
$(ECHO) 「non_pic_object=’$*.o’」 >>$@
爲
$(ECHO) 「non_pic_object=’ .libs/$*.o’」 >>$@
編譯安裝:
./configure –prefix=/olibs –disable-shared –enable-static –disable-frontend
make
make install
ffmpeg編譯參數:–enable-libmp3lame
AMR-NB de/encoding、AMR-WB decoding via libopencore-amrnb
http://sourceforge.net/projects/opencore-amr/
下載opencore-amr-0.1.1.tar.gz(0.1.2編譯須要g++、libstdc++.dll.a)
解壓,註釋掉如下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
編譯安裝:
make CC=gcc
make install PREFIX=/olibs
ffmpeg編譯參數:–enable-version3 –enable-libopencore-amrnb –enable-libopencore-amrwb
供libvorbis和libtheora用
http://www.xiph.org/downloads/
下載libogg-1.1.4.tar.gz
解壓,編譯安裝:
./configure –prefix=/olibs –disable-shared
make
make install
Vorbis encoding via libvorbis
http://www.xiph.org/downloads/
下載libvorbis-1.2.3.tar.gz
解壓,編譯安裝:
./configure –prefix=/olibs –disable-shared –with-ogg=/olibs
make
make install
ffmpeg編譯參數:–enable-libvorbis
Theora encoding via libtheora
http://www.xiph.org/downloads/
下載libtheora-1.1.1.zip
解壓,編譯安裝:
./configure –prefix=/olibs –disable-shared –with-ogg=/olibs
make
make install
ffmpeg編譯參數:–enable-libtheora
H.264 encoding via x264
http://www.videolan.org/developers/x264.html
ftp://ftp.videolan.org/pub/videolan/x264/snapshots/
下載最新的源碼包
解壓,編譯安裝:
./configure –prefix=/olibs
make
make install
ffmpeg編譯參數:–enable-gpl –enable-libx264
Xvid encoding via xvidcore
下載xvidcore-1.2.2.tar.gz
解壓,修改:
./build/generic/configure: 「libxvidcore. <- 「xvidcore.
編譯安裝:
cd xvidcore/build/generic
./configure –prefix=/olibs –disable-shared
make
make install
刪除/olibs/lib/libxvidcore.dll
ffmpeg編譯參數:–enable-gpl –enable-libxvid
ffmpeg內置已經支持aac編碼、解碼,不須要libfaac、libfaad了,並且libfaac是nonfree的,nonfree是unredistributable即禁止發佈
假設安裝路徑爲/FFmpeg/Release,假設第三方庫所在路徑爲/olibs
配置編譯:
./configure \–prefix=/FFmpeg/Release \–disable-debug \–disable-static \–enable-shared \–enable-gpl \–enable-version3 \–enable-avfilter \–enable-avfilter-lavf \–enable-memalign-hack \–enable-avisynth \–enable-libgsm \–enable-libmp3lame \–enable-libopencore-amrnb \–enable-libopencore-amrwb \–enable-libtheora \–enable-libvorbis \–enable-libx264 \–enable-libxvid \–extra-cflags=-I/olibs/include \–extra-ldflags=-L/olibs/libmakemake install