FFMpeg在windows下的編譯和使用

http://blog.csdn.net/xiajia/article/details/6533182

(本文綜合參考自網上諸多相關文章,首先非常感謝這些引用的原文的前輩的探索)

FFmpeg的編譯
FFmpeg一個開源的視頻解碼庫。下面較爲細緻的講解他分別在windows下和linux下的編譯方式。

在windows下:需要使用的工具是MingW和VS2005 VC++
工具的獲得,MingW你可以在MingW的官方網站上面獲取他的安裝程序或者在其他的公共下載網站上面
例如:http://sourceforge.net/projects/mingw/files/
我現在使用的版本號爲:mingw-get-inst-20110530.exe
很小的一個程序,下載完之後運行,並且安裝,安裝時他會提示你需要安裝哪些組件,你可以根據自
己的需要選擇相關的組件,例如MSYS等,我是選擇的全部組件都安裝。其實安裝的過程就是MinGW從
他的默認資源鏈接中將一些lzma文件,下載下來放在../MinGW/var/cache/mingw-get/packages目錄下
,可能由於各種原因你會在安裝過程中發現有很多資源包無法下載,我在家裏安裝
時就遇到這個問題。此時你可以根據他提供的鏈接自己下載相關的資源包,然後放在上面提到的目錄
下即可。如果你發現他給你提供的鏈接也無法下載,此時你就可以發揮各種搜索引擎的功能下載對
應版本號的組件即可。我這邊-大部分-的編譯組件的版本號爲4.5.2。一切安裝完成之後你就可以在你
的開始菜單中找到MinGW Shell的運行程序,運行之後實際上就是一個看起來像MSDOS控制檯的,實際
上又像Linux Shell的窗口,在其中使用Shell命令編譯你需要的庫即可。需要使用到的shell命令有:
cd c:/xxx/ooo/...         //進入需要的編譯目錄
./configure --enable-share ...    //設置你需要的編譯參數,具體參數的意義可以通過--help參數獲取
make                //開始編譯
make install            //安裝,也就是將編譯完成的dll、lib或者a文件以及需要的頭
文件複製到一個統一的目錄,具體的目錄地址,請查看它的輸出提示。

有了編譯工具之後就是需要有相應的源代碼了,FFmpeg是一個開源項目,你可以在他的官方下載到
需要的源代碼,當然你也可以到其他各種資源下載網站下載到他的源代碼,下面主要講解他兩個版本
源代碼的編譯ffmpeg-0.4.9和ffmpeg-0.6.3,這兩個版本存在較大差異,由於ffmpeg的函數接口不
向下兼容,所以請根據你需要的實際版本來進行編譯。如果你不能找到合適的網址的話,你可以在
下面的網址下載到這篇文章中使用到的源代碼
鏈接ffmpeg-0.4.9:http://download.csdn.net/source/3349090
鏈接ffmpeg-0.6.3:http://download.csdn.net/source/3349094
下載完資源之後將資源解壓縮。然後再MinGW shell中通過上面講到的命令進行編譯需要注意的部分有
1、configure的時候你可以使用這些參數:--enable-shared --disable-static --enable-memalign-hack
2、0.4.9的版本編譯的時候會提示一個關於Sleep函數的重定義,原因是MinGW中的unistd.h與0.4.9中
的os_support.h中重複定義的Sleep函數,將os_support.h中的定義直接屏蔽掉即可。
3、爲了儘量少的牽涉到周邊的庫,在0.4.9編譯配置時最好加入--disable-ffplay和--disable-ffserver
--disable-vhook,ffplay需要SDL相關的庫,如果你沒有則會報錯,所以如果你不需要ffplay的可執行文
件那就可以不用編譯它
4、對於0.6.3的版本他會直接生成windows下面需要的lib文件與dll文件放在一起,但是0.4.9的版本
卻不會生成windows需要的lib文件而是生成了linux下面使用的a文件。那麼你需要自己生成需要的lib
文件。
如何從dll文件生成lib文件呢?你可以參考以下的方法
方法1:網上有直接從dll文件轉換到lib文件的工具。你可以搜索dll convert lib這些關鍵字下載相關
的軟件我下載了一個,使用了一下,轉換挺方便,就是使用轉換的lib文件的時候出了點問題,沒有做
細緻的研究了。
方法2:你可以使用VS的工具dumpbin和lib這兩個工具,dumpbin是從dll文件中提取相關需要的函數信息
而lib則可以從def文件直接生成需要的lib文件,下面以VS2005 VC++爲例進行詳細講解
第一、你可以在VS的菜單Tools->Visual studio 2005 command prompt來打開工具使用後臺
你也可以通過開始->運行 輸入cmd回車來進入控制檯環境,然後進入../Microsoft Visual Studio 8/vc
/bin目錄下即可。
第二、假設你需要處理的dll爲:xx.dll,那麼你需要使用的命令爲:
DUMPBIN xx.dll /EXPORTS /OUT:xx.def
這樣xx.dll的接口函數信息就導出到了xx.def文件中
導出的信息格式大致如下:
EXAMPLE:xx.DEF 文件內容如下

Dump of file xx.dll                                  
                                                                       
        File Type: DLL                                                 
                                                                       
          Section contains the following exports for xx.dll  
                                                                       
                   0 characteristics                                   
            3D49E48F time date stamp Fri Aug 02 09:46:55 2002          
                0.00 version                                           
                   1 ordinal base                                      
                  11 number of functions                               
                  11 number of names                                   
                                                                       
            ordinal hint RVA      name                                 
                                                                       
                  1    0 00010F60 _TM_ClearDecoderBuff@4               
                  2    1 00010E80 _TM_CloseDecoder@4                   
                  3    2 00010F00 _TM_DecodePicture@4                  
                  4    3 00010ED0 _TM_DecodePictureHeader@4            
                  5    4 00010FD0 _TM_GetFileEnd@4                     
                  6    5 00011030 _TM_GetUValue@4                      
                  7    6 00011060 _TM_GetVValue@4                      
                                                                       
          Summary                                                      
                                                                       
                2000 .data                                             
                1000 .rdata                                            
                1000 .reloc                                            
               15000 .text
你需要到這個文件的內容進行適當的修改,改成如下狀態
LIBRARY xx
  DESCRIPTION "xx library"

  EXPORTS
      
  TM_ClearDecoderBuff@4             @1    
  TM_CloseDecoder@4                 @2    
  TM_DecodePicture@4                @3    
  TM_DecodePictureHeader@4          @4    
  TM_GetFileEnd@4                   @5    
  TM_GetUValue@4                    @6    
  TM_GetVValue@4                    @7      
這樣的def文件就可以生成爲lib了,你需要使用到的命令是
LIB /DEF:xx.def /MACHINE:IX86
運行之後你就可以在../Microsoft Visual Studio 8/vc/bin目錄下面找到xx.lib文件了。
可以看到這個方法分成兩步:第一步從dll文件中導出接口函數信息,第二步從接口函數列表
生成對應的lib文件。不過比較杯具的是從ffmpeg在MinGW下生成的dll文件中使用dumpbin工
具導出接口函數列表在我的機器上失敗了,提示導出失敗。不過第二步是非常有價值的。
那麼如果能夠方便的獲得ffmpeg的dll中的接口函數列表呢?其實在MinGW執行make命令的
時候就會生成dll相應的def文件。在ffmpeg0.6.3中是會直接生成的,但是在ffmpeg0.4.9中
需要稍做修改才行在。在0.4.9中./configure xxoo配置編譯參數完成之後使用文本編輯工具
打開config.mak文件替換掉下面三行
SLIBNAME=$(SLIBPREF)$(NAME)$(SLIBSUF)
SLIBNAME_WITH_VERSION=$(SLIBPREF)$(NAME)$(SLIBSUF)
SLIBNAME_WITH_MAJOR=$(SLIBPREF)$(NAME)$(SLIBSUF)
然後再make則會在各個dll所在的文件夾中生成對應的def文件,然後按照上面需要的def文件
的格式稍作修改,然後使用vs的lib命令就可以生成相應的lib文件了
生成的windwos下的庫的下載路徑
鏈接ffmpeg-0.4.9:http://download.csdn.net/source/3349103

鏈接ffmpeg-0.6.3:http://download.csdn.net/source/334



編譯ffmpeg庫 在C:\WINDOWS\system32 下 添加 nasm.exe , yasm.exe

發佈了8 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章