现在的位置: 首页 > 综合 > 正文

FFMpeg在windows下的编译和使用

2013年10月06日 ⁄ 综合 ⁄ 共 5206字 ⁄ 字号 评论关闭

(本文综合参考自网上诸多相关文章,首先非常感谢这些引用的原文的前辈的探索)
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/3349106

库文件的使用:
(未完待续)

抱歉!评论已关闭.