在windows XP系統下編譯和使用ffmpeg 分類: windows驅動程序WDM VC++ 2013-08-12 11:12 833人閱讀 評論(0) 收藏

最近在作流媒體開發這一塊,在服務器端,所用的live555不支持mp4,avi等視頻容器格式,因此打算運用ffmpeg來進行擴展。將MP4文件先運用ffmpeg進行解析,解析成live555所支持的基本視頻流格式(如H.264等)和音頻流格式,再運用live555中對基本音視頻流的處理方式處理後,發送到客戶端進行解碼播放,這其中運用到了ffmpeg庫,爲了便於調試,開發環境初步選擇了在windows下進行,因此須要在windows下編譯ffmpeg。而後再擴充live555源代碼。所用的版本爲ffmpeg0.8.5.本文主要介紹如何編譯ffmpeg,以及被vc6.0調用。

一,編譯環境的搭建:

1,操做系統:windows xp sp3
2, VC6.0
3, MinGW+msys
      http://sourceforge.net/projects/mingw/files/去下載在線安裝包,這個文件通常只有幾百K字節,下完之後雙擊運行,按提示安裝,在須要選擇的時候把和C、C++、msys相關的都選上,繼續自動安裝,而後須要等待一些時間……MinGW+msys系統便已經安裝好了,我安裝的路徑是C:\MinGW, msys的目錄是C:\MinGW\msys\1.0
4, ffmpeg 0.8.5(源碼能夠在官網上找到)
5,ffmpeg編譯裏面的彙編代碼須要yasm.exe,去yasm官網( http://yasm.tortall.net/Download.html)下一個windows合適的最新版本,弄好更名成yasm.exe放到C:\WINDOWS\system32下去(主要是免得加環境變量)或者放到C:\MinGW\msys\1.0\bin文件夾下。最好nasm也弄一個,常常某些庫編譯用的上。不放也無所謂,就是生成的東西不支持彙編,因此速度會很受影響。
 

2、編譯過程html

 

一、編輯C:\MinGW\msys\1.0\msys.bat文件,在最前面加入一行linux

    call "C:\Program Files\Microsoft Visual Studio \VC98\bin\vcvars32.bat"shell

後面路徑是機器上安裝的vc的對應路徑,加入這行編譯ffmpeg時會多出windows下調用dll對應的lib,方便vc調用。(網上看到的)windows

二、雙擊C:\MinGW\msys\1.0\msys.bat運行,進入ffmpeg源碼目錄D:\ffmpeg0.8.5,這個窗口的命令和shell類似,和cmd運行有些區別,右斜槓須要換成左斜槓,而後盤符D:也要改爲/d,輸入cd /d/ffmpeg/ffmpeg0.8.5,進入ffmpeg主目錄。服務器

三、開始編譯ffmpeg,繼續輸入:ide

    "./configure --enable-shared --disable--static --enable-memalign-hack" 配置

4,等待一段時間後,輸入:make (忽略警告)函數

5,等待較長的時間後,輸入make installui

 

    此時編譯過程結束,須要的結果在C:\MinGW\msys\1.0\local目錄下,有對應的頭文件(include中),dll以及lib等庫文件(bin中),還有ffmpeg.exe等運行程序。spa

    在本身編譯的時候,曾經先編譯了ffmpeg1.0,但由於版本的問題,在擴充的代碼中總是報內存不能爲讀的錯誤,懷疑是ffmpeg版本的問題,因此想要降到0.8的試一下。可是在後來編譯0.8的時候不論哪一種版本,配置configure完後,make的時候都找不到相應的文件,沒法make,這個問題困擾了本身很長時間,曾經一度想放棄,改在linux下操做。後來在網上找到點蛛絲馬跡。乾脆把MinGW卸載了,從新安裝的,而後配置,make就能夠了。具體緣由沒有深究。操作系統

    補充說明: make 指令後實際上在 ffmpeg 目錄裏已經有生成的 dll lib 了,可是 make install 指令仍是建議要執行 由於它會爲你整理好須要的頭文件(太體貼了,本身全拷以爲太多,本身選擇又太麻煩,並且不會正確),而後 dll 文件大小會減少一些(自動文件瘦身)。

    最後用VC6.0調用生成的庫。在VC6.0的include路徑中加入在上文生成local中includ路徑。在link路徑中加入local中bin的路徑,而後在本身所建的工程link中加入生成的靜態庫avformat.lib avutil.lib avcodec.lib 

這樣就能夠調用ffmpeg庫了。

 

附:編譯時遇到的一些問題:

  

1Cannot open include file: 'inttypes.h': No such file or director解決辦法

一、找到include目錄中的ffmpeg\common.h
二、在「#define COMMON_H」以後加入以下代碼,同時刪除「#include <inttypes.h>」 而後保存:

#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
  define CONFIG_WIN32
#endif
#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(EMULATE_INTTYPES)
  define EMULATE_INTTYPES
#endif
#ifndef EMULATE_INTTYPES
 include <inttypes.h>
#else
    typedef signed char  int8_t;
    typedef signed short int16_t;
    typedef signed int   int32_t;
    typedef unsigned char  uint8_t;
    typedef unsigned short uint16_t;
    typedef unsigned int   uint32_t;
 ifdef CONFIG_WIN32
        typedef signed __int64   int64_t;
        typedef unsigned __int64 uint64_t;
 else
        typedef signed long long   int64_t;
        typedef unsigned long long uint64_t;
 endif
#endif

 

2,error C3861: 'UINT64_C': identifier not found
找到include目錄中的ffmpeg\common.h
在函數頭部加入宏定義:

//本身所加的定義,處理UINT64_C未定義的錯誤

#ifndef INT64_C

#define INT64_C(c) (c ## L)

#define UINT64_C(c) (c ## UL)

#endif

 

3,處理相關宏定義格式錯誤,將括號中的改成n

#if AV_GCC_VERSION_AT_LEAST(4,3)

    #define av_alloc_size(n) __attribute__((alloc_size(__VA_ARGS__)))

#else

    #define av_alloc_size(n)

#endif

 

4,出現Cannot open include file: 'stdint.h': No such file or directory

在出現 #include <stdint.h>的地方注掉便可

 

5,處理template類錯誤的方法,在extern前檢查宏定義

#undef __cplusplus

extern "C" {

#include "libavutil/avutil.h"

#include "libavformat/avformat.h"

}

#define __cplusplus

相關文章
相關標籤/搜索