步驟:
1、搭建 MinGW 的編譯環境
下載yasm,地址:http://yasm.tortall.net/Download.html
改名為yasm.exe放到C:\WINDOWS\system32 或者 C:\MinGW\msys\1.0\bin文件夾下。
下載 mingw-get-inst-20101030.exe , 點擊這里下載 http://sourceforge.net/projects/mingw/files/ 。
安裝時選擇如下
安裝過程中,需要聯網。安裝程序會去網上下載對應的程序。這一過程耗時較長,請耐心等候。
注意:如果安裝過程中,網絡斷開或是無法出現了下載某些組建失敗,不用擔心,等安裝程序運行完成后,再次運行安裝程序,選擇如上,安裝程序會繼續下載沒有成功的軟件。
打開C:\MinGW\msys\1.0\msys.bat文件,在文件頭部加上
這句話的作用就是: 設置 2008 x86 的開發環境。我們主要是使用它的 lib.exe 生成 *.lib 文件。
運行msys.bat, 程序會根據你當前的用戶名,在目錄(C:\MinGW\msys\1.0\home)下建一個工作目錄。
目錄的名稱和你的用戶名一樣。如果當前你的系統用戶名是 administer, 那么你的工作目錄就是(C:\MinGW\msys\1.0\home\administer)
2、編譯 FFmpeg
解壓縮 ffmpeg代碼 到 MinGW 的工作目錄。例如(C:\MinGW\msys\1.0\home\administer)
運行 C:\MinGW\msys\1.0\msys.bat,即可進入 MinGW 的工作目錄了。
他和cmd命令有區別,右斜杠需要換成左斜杠,盤符D:也要改成/d
輸入命令 "ls" , 這等價於 "dir"。列出當前目錄下的文件。
輸入 cd ffmpeg,進入ffmpeg 目錄。
在命令行下輸入如下命令:
成功后,編譯生成的文件保存在 (C:\MinGW\msys\1.0\local\bin),頭文件保存在 (C:\MinGW\msys\1.0\local\include)。
./configure --disable-debug --enable-static --enable-memalign-hack --enable-swscale --disable-avformat --disable-avfilter --enable-pthreads --enable-runtime-cpudetect --disable-w32threads --disable-ffprobe --enable-version3 --disable-everything --enable-decoder=h264 --enable-decoder=mpeg4 --disable-ffmpeg --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegvideo
3、在VC中使用FFmpeg靜態庫
Additional Dependencies
libavcodec.a libavformat.a libavutil.a libswscale.a libz.a libdts.a libfaac.a libfaad.a
libgsm.a libmp3lame.a libnut.a libogg.a libtheora.a libvorbis.a libvorbisenc.a libx264.a
libxvidcore.a libpthreadGC2.a libgcc.a libmingwex.a wsock32.lib vfw32.lib
要使用ffmpeg的靜態庫,必須把ffmpeg用到的其他靜態庫也鏈接到VC的工程中。這些庫主要包括
libgcc.a:gcc的函數庫,一般在C:\MinGW\lib\gcc\mingw32\4.x.x\
libmingwex.a:_snprint函數所在,一般在C:\MinGW\lib\
libcoldname.a:_strcasecmp的實現,也在C:\MinGW\lib\
wsock32.lib:Windows socket庫
libz.a:zip壓縮庫
libfaad、libx264等額外編解碼庫
靜態庫的鏈接順序一定不能錯,否則運行時會出現一些莫名其妙的問題。建議的鏈接順序是
libgcc.a libmingwex.a libcoldname.a libavcodec.a libavformat.a
libavutil.a libswscale.a libz.a libdts.a libfaac.a libfaad.a libgsm.a
libmp3lame.a libnut.a libogg.a libtheora.a libvorbis.a libvorbisenc.a
libx264.a libxvidcore.a libpthreadGC2.a wsock32.lib vfw32.lib
編譯ffmpeg
有兩個編譯方式,一個是靜態庫,一個是動態庫。
首先啟動msys,
c:/msys/1.0/msys.bat
在shell上的提示符如下:
Administrator@LIGO-PC ~$首先進入ffmpeg目錄,編譯一般是三個步驟,首先配置,然后編譯,最后安裝。如果是改變編譯方式,則還要在配置之前先clean
3.1 編譯靜態庫
A. 配置
在shell提示符下輸入:
./configure --enable-static --enable-memalign-hack --prefix=c:/msys/1.0 --extra-cflags="-fno-common"
這個過程要花費較長的時間,開始會有較長的時間沒有反應。其中的prefix是msys的安裝路徑
B. 編譯
make
C. 安裝
make install
安裝只是把要開發使用的庫文件拷貝到c:/msys/1.0/lib/目錄中,頭文件拷貝到c:/msys/1.0/include/目錄中。
產生的庫文件為.a文件
3.2 編譯動態庫
動態庫和靜態庫只在配置上的差別,配置如下:
./configure --enable-shared --disable-static --enable-memalign-hack --prefix=c:/msys/1.0 --extra-cflags="-fno-common"
后面的步驟一樣:
make
make install
在開始編譯之前,可以把原來編譯的目標 文件清除掉:
make distclean
動態編譯應該是會產生lib文件,但是我編譯之后一直沒有產生,所以后面的開發,用的都是靜態庫
編譯之后的dll文件被放到了ffmpeg目錄下,可以搜索查看它們
4. 開發
基於ffmpeg的開發,本來是想着比較簡單,但實際上還是有點問題
起初在vc6.0下編譯,一直編譯不過,只好放到vs2008下編譯,才編譯通過,但是在release下還是沒辦法編譯通過,鏈接時的錯誤如下:
1>libmingwex.a(mbrtowc.o) : error LNK2019: unresolved external symbol __imp____lc_codepage referenced in function _mbrlen1>libmingwex.a(wcrtomb.o) : error LNK2001: unresolved external symbol __imp____lc_codepage1>../binRelease/chipdecoder.dll : fatal error LNK1120: 1 unresolved externals
包含的頭文件和庫文件如下:
#ifdef __cplusplusextern "C" {#endif
#include "libavformat/avformat.h"
#pragma comment(lib, "libgcc.a")#pragma comment(lib, "libavcodec.a")#pragma comment(lib, "libavformat.a")#pragma comment(lib, "libavutil.a")#pragma comment(lib, "libmingwex.a")#ifdef __cplusplus}#endif其中的libgcc.a和libmingwex.a是從c:/msys下拷貝過來的,編譯之前,要把c:/msys/1.0/include和c:/msys/1.0/lib兩個目錄加入到編譯工程中
另外,由於我是先在vc6.0下編譯的,無法編譯通過,所以就對這些頭文件進行了部分修改:
A. 把c:/msys/1.0下的三個文件_mingw.h、inttypes.h、stdint.h拷貝到了include目錄中
B. 在_mingw.h文件的結尾處(在#endif /* __MINGW_H */一行之前)添加了一行:
#define __restrict__
C. 把所有long long改成了__int64,如果是直接在vs2008下編譯,則這個修改應該是不需要的
D. 在stdafx.h文件的
#include <windows.h>
之后,添加:
#include <math.h>
注意,這一行必需在包含avformat.h之前,否則總是在math.h中編譯通不過