如何將ffmpeg在windows編譯和使用

FFmpeg在Windows系統下的編譯過程,分四步:
以下:
1.        配置編譯環境
2.        下載FFMPEG的代碼
3.        編譯,獲取FFMPEG庫(頭文件,lib,和DLL
4.        在VC下配置,測試
1.        配置編譯環境
1)安裝MSys
下載文件:
  bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
  msysCORE-1.0.11-20080826.tar.gz
解壓msysCORE-1.0.11-20080826.tar.gz,好比解壓到X:\msys(如下內容都使用該路徑描述,X爲你安裝的盤符)。
   解壓bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,產生一個名爲bash-3.1的目錄,在該目錄下有一個子目錄名爲 bin,其餘的目錄不須要關心。複製bin目錄中的全部文件到D:\msys\bin,提示是否要覆蓋sh.exe的時候,選擇是。
  到「D:\msys\postinstall」目錄下執行pi.bat,在出現的提示中輸入n回車後(這個不搞錯了),按任意鍵退出便可。
2)安裝MinGW
  下載文件:
binutils-2.20-1-mingw32-bin.tar.gz
(binutils-2.19.1-mingw32-bin.tar.gz)
gcc-core-3.4.5-20060117-3.tar.gz
gcc-g++-3.4.5-20060117-3.tar.gz
w32api-3.13-mingw32-dev.tar.gz
   mingwrt-3.16-mingw32-dev.tar.gz
(mingwrt-3.15.2-mingw32-dev.tar.gz)
mingwrt-3.16-mingw32-dll.tar.gz
(mingwrt-3.15.2-mingw32-dll.tar.gz)
把它們所有解壓到X:\msys\mingw。
3)修改「msys.bat」
   用文本編輯器打開D:\msys\msys.bat,因爲打算用MSVC++編譯程序,因此須要有.lib文件才能連接到FFmpeg的庫,這 些.lib文件可使用微軟的工具鏈中lib命令產生。爲此,機器上必須已經安裝了微軟的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路徑替換成機器上vcvars32.bat實際存在的路徑,好比個人在「D:\program files\Microsoft Visual Studio 8\VC\bin」,因而就添加:
  call "D:\program files\Microsoft Visual Studio 8\VC\bin"
4)系統整合
  複製D:\msys\etc\fstab.sample爲X:\msys\etc\fstab,用文本編輯器打開D:\msys\etc\fstab編輯。(須要使用一個支持Unix換行風格的編輯器,好比Notepad++),把下面這行:
  D:/mingw /mingw
  改成:
  D:/msys/mingw /mingw
注意:改的這個目錄爲mingw你所安裝的目錄,因此按本文來說是這個目錄。若是你安裝不目錄不一樣,就要改爲你所安裝的目錄。
  完成以上步驟,MSys+MinGW系統就配置完成了。
2.      下載FFMPEG的代碼
下載代碼的辦法由兩個,一個就是用svn 下載下來。我以爲哪怕你知道svn是啥,也不用這個方法,由於太慢了。一個文件一個文件下,最關鍵SVN對應的地址是國外,都不知道什麼才能所有下完。另一個直接下一個代碼的壓縮包。
a)       SVN下載 地址爲svn://svn.ffmpeg.org/ffmpeg/trunk
b)       直接壓縮包。
首先進入 http://www.ffmpeg.org/download.html 這個是ffmpeg的官方主頁。在 選項FFmpeg SVN下,點擊full checkout 或者bare sources。這連個連接第一個能夠經過SVN更新代碼,因此文件要大點,後面那個是純代碼。或許能夠直接點擊該文件的這個兩個連接的一個直接獲得。
(我用的是bare sources的程序)
3.      編譯,獲取FFMPEG庫(頭文件,lib,和DLL)
首先經過MSys安裝目錄下的msys.bat啓動MSys,這時會出現一個命令行窗口,它是一個運行着bash的rxvt程序,以下圖:

這是一個相似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上編譯成功所必須指定的,待配置完成後,將回到命令提示符,看到下圖所示的畫面:
若是沒有錯誤的話,就能夠"make"具備基本功能的FFmpeg了,在提示符後輸入:make。
  編譯的過程將持續很長時間。若是一切正常,結束後將返回提示符,並有以下的最後編譯結束的輸出畫面:
在提示符後輸入: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:\audio_video \ffmpeg\ffmpeg-0.5\libavcodec\apiexample.c(ffmpeg的存放目錄)拷貝到你建的那個工程。而後更名 apiexample.cpp。編譯。你會發現缺頭文件。這個時候你須要將E:\msys\mingw \include(mingw安裝目錄下的include)的inttypes.h,stdint.h,_mingw.h三個文件拷到D:\msys \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")
}
4.1. 個人理解是在api-example.cpp頭文件中加入第4條的內容,即
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include "libavformat/avformat.h" //andrew
#include "libavcodec/avcodec.h"
#include "libavutil/mathematics.h"
其中我加了 #include "libavformat/avformat.h",若是不加就會報許多錯誤,意思是有學多變量沒有定義。我測試了加或者不加頭#include <math.h>,對編譯結果沒有影響。
5. api-example.cpp中彷佛不支持強制類型轉換,如
samples = malloc(frame_size * 2 * c->channels);實際上是將(void *)型轉換成(short *),因而我在malloc的前面增長了(short *)此問題得以解決。即samples = (short *)malloc(frame_size * 2 * c->channels);
6.按照網上高手的指示我在vs2005的工具->選項->VC++目錄中,包含文件一欄,加入個人include文件夾,即D:\msys\local\includehtml

 

以上,你就能夠在VC++中編譯ffmpeg了。可是,配置MSYS太困難,咱給你一個下載地址,是已經配置好的MSYS哦~shell

 

地址以下:http://msys-cn.googlecode.com/files/MSYS-Update.rar
api

ffmpeg的源碼,直接從ffmpeg的官網上下載吧。bash

相關文章
相關標籤/搜索