windows下編譯ffmpeg原始碼
由於工作原因,需要使用ffmpeg在windows下進行程式碼跟蹤
於是,上網找相關文章,搜尋出來有很多,經過檢視,其中的一個英文網站是最好的,網址:
上面有詳細說明整個過程,但為了防止此網站不能訪問的問題,這裡特把一般步驟寫下來,以做個記錄。後面會說明我在按照上面說的步驟進行的過程中遇到困難的解決方法。
說明:
A. 在後面敘述的過程中,可能需要有支援7z壓縮格式的解壓縮軟體,最新的winrar應該就是支援的
B. 以下的步驟,只是真對ffmpeg編譯,所以涉及到無關的部分,本文不會關心它們,除非有特別說明
1. 下載ffmpeg原始碼,下載網址:svn://svn.mplayerhq.hu/ffmpeg/trunk
首先需要安裝svn客戶端,我用的是TortoiseSVN,應該是可以很方便地從網上下載,下載之後安裝。
安裝之後,在你要儲存ffmpeg原始碼的位置上點右鍵,然後選擇check out,輸入以上的網址,包括前面的“svn:”,然後點OK按鈕,它會把整個原始碼下到本地,根據網速,可能幾秒鐘到幾十分鐘不等。原始碼30M左右
2. 安裝windows下的編譯系統
2.1 安裝MSys
首先下載以下軟體:
安裝MSYS-1.0.11-2004.04.30-1.exe 的最後會出現一個dos視窗,大意是讓使用者選擇是否讓msys自己提交install,輸入n後回車,以表示我們不允許msys自己進行這個操作。
為了方便後面的敘述,我們假設msys安裝到了預設的目錄c:/msys/1.0下
解壓MSYS-1.0.11-20080821-dll.tar.gz 到c:/msys/1.0下,覆蓋原目錄
解壓bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 後,從解壓出的目錄中,bin下拷貝sh.exe到c:/msys/1.0/bin下,如果原來存在,則覆蓋之,這個解壓後的目錄可以刪除
解壓 coreutils,然後拷貝解壓出來的 coreutils-5.97/bin/pr.exe 到c:/msys/1.0/bin中
解碼make-3.81-MSYS-1.0.11-2.tar.bz2 到c:/msys/1.0下,如果有檔案存在,則覆蓋它們
為了產生正確的庫檔案,需要修改c:/msys/1.0/msys.bat:
使用記事本開啟該檔案,然後在其最開始處新增:
call "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin/vcvars32.bat"
注意:這一行必需處在此檔案的最開始處(我把它放到除去rem開頭之外的最前面還是不能正常工作,不知道為啥),同時修改你的vc路徑,我的是vs2008,所以是9.0,此修改指定vc的vcvars32.bat檔案位置並招待它
如果是你的os是64位的,還需要對該檔案的 _WindowsNT 處進行修改,緊跟這一行的下面一行新增:
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
關於64位的部分,我沒有試,只不過是直接從說明處到拷貝過來
2.2 安裝MinGW
下載以下6個安裝包:
下載後解壓以上6個到c:/msys/1.0/mingw中,如果有重複的,則覆蓋掉
另外gcc編譯器也可以選擇4.2.1版本的:
但在解壓之後,需要進行改名:
c++-sjlj.exe to c++.execpp-sjlj.exe to cpp.exeg++-sjlj.exe to g++.exegcc-sjlj.exe to gcc.exe我用的是3.4.5的,所以我的不需要改名
2.3 整合MinGW 和 msys系統
這一步非常簡單,修改c:/msys/1.0/etc/fstab.sample的名稱為:fstab,即把括展名直接去掉,然後用記事本開啟,修改
c:/mingw /mingw
為
c:/msys/1.0/mingw /mingw
然後儲存即可。
修改的內容應該是自己的安裝路徑
到此,所有的系統已全部完成。在該網站上,還有說明上面安裝的軟體包的版本問題,這部分不再翻譯,直接拷貝到如下:
Get the most up-to-date MSys+MinGW system.
Today (November 29, 2008), that includes:
· make
The version of make that is installed by default will not work for FFmpeg. You will have to upgrade.makemust be MSYS make version => 3.81Preferably version 3.81-2.Also do not get MinGW make. Get MSYS make.
· Mingwruntime
Must be version => 3.15Note: if any older version is used, everything will still build and link fine, but non numeric AVOptions will not work in ffmpeg (-flags, etc.)
· w32api
Should be version => 3.13Note: if any older version is used, you will have to --disable-devices while configuring FFmpeg, and vfwcap will not be compiled in.
· bash
Must be version => 2.05b to build FFmpeg.Preferably version 3.1 to build most other .
· binutils
do not use binutils-2.15.91-20040904-1. It is known to not link properly.(2.17 recommended by Gianluigi Tiesi)
3. 編譯ffmpeg
這部分我不清楚裡面的很多選項,我只是照著步驟在做
有兩個編譯方式,一個是靜態庫,一個是動態庫。
首先啟動msys,
c:/msys/1.0/msys.bat
在shell上的提示符如下:
~$首先進入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中編譯通不過
先暫時寫到這裡,沒有寫得更詳細,以後有時間再補充