最近因为工作的关系需要用到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文件已经生成^_^.
以上内容从网上搜集整理,如有错误恳请指正。