您的位置:首页 > 其它

windows系统下编译最新版本ffmpeg

2012-05-30 09:11 579 查看
最近因为工作的关系需要用到ffmpeg,在网上查了一下发现许多介绍windows下编译ffmpeg文章在安装mingw和msys过程比较繁琐,现吧自己编译过程记录下来

1.安装Mingw和Msys

首先去http://sourceforge.net/projects/mingw/files/下载一个mingw的安装文件我下载的是mingw-get-inst-20120426.exe,下载到本地后直接运行安装程序,在“Select
Components”步骤中选择:
√ C Compiler (默认且一定选择)

√ C++ Compiler

√ MSYS Basic System(选择此项将会安装msys,msys则不需要另外安装)

√ MinGW Developer ToolKit

记住要选中MSYS Basic System这个选项安装Msys,这样就不用再去安装Msys了,这个安装过程有点长,和你的网络有关,要耐心等待,经常会出现半死不活状态,网上有些加速的方法自己找一下,我是睡觉前运行好去睡觉的,第二天早晨已经安装好了,呵呵,不过说实话这个安装包很贴心了,会吧Migw和Msys一次都安装好,不要象以前安装那样麻烦了要下NN多得包,比较适合我这样的懒人….

2. 整合MSYS和MINGW:

1. 修改Msys.bat

为了方便VS200X以调用ffmpeg的动态库,可以通过配置让ffmpeg编译时产生windows下调用dll对应的lib,

进入:D:\MinGW\msys\1.0\文件夹,使用UltraEdit打开msys.bat文件,在文件的最最前面加入如下一行:

call "D:\Program Files\Microsoft Visual Studio 8.0\VC\bin\vcvars32.bat"

其中“D:\Program Files\Microsoft Visual Studio8.0”为你机器上安装VS的目录,我的电脑安装的是VS2005,并且安装在了D盘。文件修改后保存即可。

2. 系统整合:

将D:\msys\1.0\etc\文件夹下的fstab.sample文件改名,改成fstab,然后,用文本编辑器打开fstab.
 把这行:C:/mingw /mingw改为:d:/mingw /mingw
在这个步骤中,大家要注意,并不是每个人的都是d:/mingw /mingw,也有可能是d:/msys/1.0/mingw /mingw,这个与版本有关,大家注意看自己的就OK了。

3. 下载ffmpeg源码:

下载安装一个SVN获取源码,本人下载的TortoiseSVN,安装后右键点击在弹出菜单中选择SVN
checkout弹出界面中填写

URL of repository: svn://svn.mplayerhq.hu/ffmpeg/trunk

Checkout directory:要存放下载代码的目录

点击OK即可

4.下载yasm

为了减少配置环境变量的麻烦,本处直接把 yasm-1.1.0-win32.exe文件名修改成:yasm.exe,并放到系统目录下: C:\WINDOWS\system32。

5. 说明:

Mingw中切换目录和windows命令行窗口不同:

$cd /d 进入D盘目录

$cd /d/project/ffmpeg/sourcecode 进入d:\ project\ffmpeg\sourcecode

6. 编译ffmpeg:

进入ffmpeg源码目录输入命令编译

$./configure --enable-memalign-hack

长时间等待,如果没有错误就可以进入下一步

$make

长时间等待。。。

$make install

会复制所有生成的重要文件到MSys的local文件夹下

如果要想编译得到动态库和上面的编译还是有点差别, 编译ffmpeg的动态库有两种方式一种是静态是指把其他的库编译到ffmpeg得库中,动态的是编译时不编入ffmpeg库中,不要把这个和ffmpeg库本身动态和静态搞混了,编译命令如下:

$make distclean 清除上面编译过程生成的文件

动态编译命令

$./configure --enable-shared --disable-static --enable-memalign-hack

$make

静态编译命令

$./configure --enable-static --disable-shared --enable-memalign-hack

$make

编译生成的文件可以再VC中调用,注意编译时使用的VC版本和调用的版本要兼容,如使用VC9编译的动态库在VC8中调用就会出现找不到函数接口的问题

5. 编译过程中遇到的文件及解决:

1.
Configure时发现提示pr命令不认识解决办法下载make-3.81-MSYS-1.0.11-2.tar.bz2解压到mingw的Mingw/msys/1.0/目录下,也可以修改pr为lpr即可

2.
提示strcasecmp函数错误

把以下代码存储成strcasecmp.h于mingw include目录下

//strcasecmp.h

#ifndef _strcasecmp_h_

#define _strcasecmp_h_

static inline char __hack_charget( char c )

{

if(c >= 'a' && c <= 'z')

c += 'A' - 'a';

return c;

}

static inline int hack_strcasecmp( char const *a, char const *b )

{

char ac, bc;

int r;

for(;;) {

ac = __hack_charget(*a++);

bc = __hack_charget(*b++);

r = (int)ac - (int)bc;

if(r)

return r;

if(!ac)

return 0;

}

}

static inline int hack_strncasecmp( char const *a, char const *b, int n )

{

char ac, bc;

int r, i;

for(i = 0; i < n; ++i) {

ac = __hack_charget(*a++);

bc = __hack_charget(*b++);

r = (int)ac - (int)bc;

if(r)

return r;

if(!ac)

return 0;

}

return 0;

}

#define strcasecmp hack_strcasecmp

#define strncasecmp hack_strncasecmp

#endif

把strcasecmp.h包含到编译是提示错误的文件中即可

3.
编译后没有ffplay.exe文件:

因为没有SDL所以没生产成,下载SDL-1.2.14.tar.tar解压到ffmpeg目录下,启动msys.bat进入SDL解压后的目录编译安装SDL:

$./configure --prefix=/usr 回车等待…

$Make 回车等待…

$make install 回车等待…

编译完成后,在C:\MinGW\msys\1.0的bin、include和lib文件夹下可以看到编译结果,拷贝编译后文件到ffmpeg目录

MinGW\msys\1.0\bin下的SDL.dll、sdl-config拷贝到 ffmpeg\sourcecode\bin

MinGW\msys\1.0\include下的 SDL文件夹拷贝到 ffmpeg\sourcecode\include中

MinGW\msys\1.0\lib下的libSDL.a、libSDL.dll.a、libSDL.la和libSDLmain.a拷贝到
ffmpeg\sourcecode\lib中

如果对应的目录在ffmpeg\sourcecode没有直接创建

4. 编译成功后没有生成对应的库文件

a.没有生成lib文件

编译后没有生成lib文件,但是在目录下生成了对应的def文件可以使用VC自带的lib.exe 由def文件生成lib文件,lib.exe在VC的bin目录中

cd
C:\Program Files\Microsoft Visual Studio 8.0\VC\bin

lib /out:c:\test\avcodec.lib /machine:IX86 /def:C:\test\avcodec.def

b.没有dll和lib文件或者没有def

我编译ffmpeg 0.6.1版本成功后进入ffmpeg061/sourcecode对应目录下没有找到预期的dll和lib文件,google之后发现原因是因为config.mak文件的问题用, 在执行完 ./configure xxoo命令后,在源码目录中用 UltraEdit打开config.mak编辑以下三行:

SLIBNAME=$(SLIBPREF)$(FULLNAME)$(SLIBSUF)

SLIBNAME_WITH_VERSION=$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)

SLIBNAME_WITH_MAJOR=$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)

修改为

SLIBNAME=$(SLIBPREF)$(NAME)$(SLIBSUF)

SLIBNAME_WITH_VERSION=$(SLIBPREF)$(NAME)$(SLIBSUF)

SLIBNAME_WITH_MAJOR=$(SLIBPREF)$(NAME)$(SLIBSUF)

重新编辑,发现dll.lib文件已经生成^_^.

以上内容从网上搜集整理,如有错误恳请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: