win7 X64 编译ffmpeg

来源:互联网 发布:砺剑出题 网络 编辑:程序博客网 时间:2024/04/30 09:02

由于FFMpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,

因此它不能使用MSVC++编译。要想使用FFMpeg,最先要解决的问题就是在Windows下配置一个类似Linux的编译环境,

将FFMpeg编译为二进制库以后,再利用其进行进一步开发。MSVC++并不严格的遵循C标准,所以整个编译过程必须使用MSys+MinGW系统来完成。

如果选择编译动态链接库(dll),这些库将和其他的动态链接库一样在使用上没什么差别,可以使用MSVC++来链接这些库到自己的程序,只有这种情况下MSVC++是被支持的。
 

一、编译过程

1、准备MSys+MinGW系统

下载整合版 Download mingw-get-setup.exe (86.5 kB)

之前编译c++ 时用过,http://blog.csdn.net/kuaile123/article/details/11024873

不多说了,安装目录里 C:\MinGW\msys\1.0 就是 MSys

 

2、修改“msys.bat”
 用文本编辑器(如NotePad++)打开C:\MinGW\msys\1.0\msys.bat,由于打算用MSVC++编译程序,所以需要有.lib文件才能链接到FFmpeg的库,这些.lib文件可以使用微软的工具链中lib命令产生。把下面一行加到msys.bat的最前面,把路径替换成机器上vcvars32.bat实际存在的路径,比如我的在“D:\Program Files\Microsoft Visual Studio2010\VC\bin”,于是就添加:
 call "D:\Program Files\Microsoft Visual Studio2010\VC\bin\vcvars32.bat"

3、下载ffmpeg源码

由于ffmpeg的源代码存放在SVN仓库里,所以必须使用命令行程序或是图形界面程序来访问。

首先下载TortoiseSVN,安装完成后,在想要存放ffmpeg下邮件,选择check out,输入地址svn://svn.mplayerhq.hu/ffmpeg/trunk

点击开始,开始下载,如下图所示:我下载的版本40多M,网速不好的时候下载很容易中断。

 

4、编译

首先运行msys.bat,进入shell界面

转到ffmpeg所在目录: cd D:/ffmpeg

注意:目录名使用正斜杠来分割,而不是Windows所使用的反斜杠(比如说要写成"D:/ffmpeg"而不是"D:\ffmpeg")。

文件名或目录名中如果带有空格,必须用双引号括起(例如这样"/C/Program Files",带有双引号)。

不然会提示没有此目录

盘符(例如"C:\")可以从根目录处访问(像这样"/C/")。

 

(1) 编译静态库

(1.1)配置:

./configure --enable-static --enable-memalign-hack --prefix=C:/MinGW/msys/1.0 --extra-cflags="-fno-common"

注意执行这句话时出现的问题,yasm是汇编编译器,因为ffmpeg中为了提高效率用到了汇编指令,比如MMX和SSE。

这个过程要花费较长的时间,开始会有较长的时间没有反应。其中的prefix是msys的安装路径

如果出现提示: yasm not found, use --disable-yasm for a crippled build

解决方法(a)在网上下载一个yasm.exe并安装在mingw/bin下面,编译代码时你注意看,会发现asm后缀的文件用的编译器是yasm,c文件用的是gcc;

下载地址 http://yasm.tortall.net/Download.html 注意把下载下来的改名为 yasm.exe ,不然还是提示找不到。由于mingw为32位版本,最好下32位,以后后面有问题。

(b)不使用汇编指令,在配置时加上,即./configure  --disable-yasm

(1.2)编译:make

(1.3)安装: make install

            安装只是把要开发使用的库文件拷贝到c:/msys/1.0/lib/目录中,头文件拷贝到c:/msys/1.0/include/目录中。产生的库文件为.a文件

 

(2)编译动态库

如果希望使用FFmpeg包含的libavcodec库开发多媒体文件处理程序,还需要编译libavcodec的dll动态链接库。

(2.1)配置:

./configure --enable-shared --disable-static --enable-memalign-hack --prefix=C:/MinGW/msys/1.0 --extra-cflags="-fno-common"

(2.2)编译:

    make

注意:当运行到make这一步时出现问题:

c:\mingw\include\io.h: error : unknown typename 'off64_t'

make: ***[libavformat/applehttp.o]  error1

 

发现在io.h中已经

/* MSVC's io.h contains the stuff from dir.h, so I will too. * NOTE: This also defines off_t, the file offset type, through *       an inclusion of sys/types.h */#include <sys/types.h>/* To get time_t.  */


sys/types.h 文件中有如下一段:

#ifndef _OFF64_T_#define _OFF64_T_typedef __int64 _off64_t;#ifndef __STRICT_ANSI__typedef __int64 off64_t;#endif /* __STRICT_ANSI__ */#endif /* ndef _OFF64_T */


已经定义了off64_t,特别奇怪,不知道为啥没法识别。

不管我是加了 #undef  _OFF64_T_ 还是 将周围的变量注释掉 只保留 typedef __int64 _off64_t; typedef __int64 off64_t;

都会出现更多的错,我以为是64位系统的原因,但是我又在32位电脑上进行编译,同样的问题,不知道这是什么原因。在网上查也没有人有这种问题,太奇怪了。

 

参考博客:http://blog.csdn.net/dragon101788/article/details/8679092