windows下編譯ffmpeg工程


步驟:

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文件,在文件頭部加上

call "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.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 目錄。

在命令行下輸入如下命令:

./ configure --enable-memalign-hack --enable-shared
make
make install 

成功后,編譯生成的文件保存在 (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中編譯通不過


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM