windows下编译ffmpeg

来源:互联网 发布:网络监控工作总结 编辑:程序博客网 时间:2024/06/13 18:19

环境配置

        MinGW

       全称叫Minimalist GNU for windows,是一套Windows环境下GNU编译组件的接口,通俗的可以说是Win上的gcc。比起MinGW,也许那只企鹅CygWin更加著名一些,但事实上两者是完全不同的东西。CygWin在Win上模拟一套Linux环境,使用Win的存储系统,编译的却是Linux环境下的程序,和虚拟机比较相似;MinGW则是完全的编译出Windows环境下的程序,换句话说,通过MinGW编译出来的exe是可以直接在explorer下双击运行的。从移植的角度上说,使用MinGW才能真正将一个Linux程序移植到Win,而CygWin不能。
        MSYS

       全称叫Minimal SYStem,是一套运行在Windows上的bash,也就是运行在Win上的Linux Terminal 。这个比较好理解,其实就是在Win上使用Linux的命令行进行操作,可以代替cmd来使用,通过手工修改安装目录下的etc/fstab来定位MinGW的目录。对一些GNU的开源软件,MSYS可能是必需的,因为它们通常需要./configure然后make才能运行。我们将MSYS和MinGW配合使用就可以打造出一个Win下的GNU命令行终端和编译系统。

        mingw的下载地址为:http://sourceforge.net/projects/mingw,如mingw-get-setup.exe(版本为0.6.2-beta-2013.1004-1),双击运行,"MingGW Installation Manager"界面出现后,选"Basic Setup",将右侧的选项全部选中,再点菜单“Installation”下的“Apply Changes”,到此开始装置文件,等安装完成后,到MingGW/msys/1.0/etc目录,直接复制fstab.sample出另一个文件fstab,打开到最后几行,在“/mingw”前写入mingw的安装路径,如"d:/mingw",这样目的是为msys指定mingw。

ffmpeg编译

到ffmpeg官网下载最新的源码,拷贝到C:\msys\1.0下。

        双击msys.exe,输入lib.exe(此程序在VC的安装目录下,功能为把x.def文件解释称x.lib文件),link.exe,如果提示找不到,需要指定lib.exe跟link.exe及其依赖库的路径,如:export PATH=":C:\Program Files\Microsoft Visual Studio 8\VC\bin:$PATH"。接着按如下三步编译:

1 cd ./ff

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

一些参数的说明,

./configure --help(先看看你想要配置啥的),

enable-memalign-hack  是指编译时,使用内存对齐方式,这样以便编译时用mmx或者sse指令对代码进行优化。

disable-debug 禁用调试符号。

 --enable-gpl             allow use of GPL code, the resulting libs,and binaries will be under GPL [no]
  --enable-version3        upgrade (L)GPL to version 3 [no]
  --enable-nonfree         allow use of nonfree code, the resulting libs, and binaries will be unredistributable [no]
 --disable-doc            do not build documentation

--disable-yasm 如果没有yasm,可已去掉,

extra-cflags=-I /(依赖的头文件所在文件夹),

extra-ldflags=-L/(依赖的库文件所在文件夹),

--cpu=i686 得写上,要不会提示:Threading is enabled, but there is no implementation of atomic operations available,

--prefix = 你想安装到哪里,例如:--prefix=/usr/local,

不加--enable-w32threads开关时,出现如下错误:

           In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/
                pthread.h:288:0,
                 from libavcodec/pthread.c:32:
           c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sched.h:152:53: error:
                expected ')' before 'pid'
           c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/sched.h:154:53: error:
                 expected ')' before 'pid'
            make: *** [libavcodec/pthread.o] Error 1

         增加开关: --enable-w32threads,弃用pthread, 采用windows native thread, 问题消失(原因,可能安装MinGW时pthread包没有下好,下次重试看看。)

如果MinGW/msys没有安装pkg-config, configure 会抱错,但是不影响make。 解决的办法是下载pkg-config for MinGW/msys.

2 make

3 make install

到此编译完成,在local有生成的头文件,库。

遇到的问题

不生成LIB文件
第一步:发现生成了DLL,没有生成LIB,并有如下提示:“$ lib.exe /machine:i386 /def:libavformat/avformat-52.def /out:libavformat/avformat-52.lib
make: lib.exe:Command not found”。
很明显找不到"lib.exe"(此程序用来转def成lib),看来执行call ".../vcvars32.bat"并没有加载所需的路径(??),去VC安装目录下找“lib.exe”跟依赖的库“mspdb80.dll”,将这两个库,拷贝到“msys\1.0\bin”,在mingw命令行上输入“lib.exe”,发现已经不是“...Command not found”的提示了,说明已经能找到"lib.exe"了。
第二步:先试下“lib.exe”能不能用,执行“lib.exe /machine:i386 /def:libavformat/avformat-52.def /out:libavformat/avformat-52.lib”,发现有如下提示:“LINK: extra operand '/def:libavformat/avformat-52.def' TRY 'LINK --help' for more information”。可以看出是link.exe有问题,mingw下的link.exe支持并不是很完善,会导致编译失败或者有问题,因此从VC下找到“link.exe”并替换mingw下的(先备份),再执行刚才的命令,无错误提示。
第三步:用"lib.exe"一个一个生产lib太麻烦,直接依次执行:"make clean","make && make install",发现已经生成了lib文件。

运行ffmpeg.exe提示“丢失libiconv-2.dll”
解决方法:
去“http://www.gnu.org/software/libiconv/”下载库“libiconv-1.14.tar.gz”,放到home/dell下,解压,mingw命令行进入,依次执行“./configure  make  make install”即可。

不生成ffplay.exe的问题

解决方法:
如果不安装SDL的话,就不会生产ffmpeg.exe。SDL可以下载编译好的(见http://www.libsdl.org/download-1.2.php下的SDL-devel-1.2.15-mingw32.tar.gz),也可以自己编译(下载SDL-

1.2.15.tar.gz - GPG signed,解压后进入目录,执行configure && make && make install)。假设编译后生成的include(只含有*.h),lib,bin放在/local目录下。
在configure之前要先配置路径,如:export PATH="$PATH:/usr/local/bin:/usr/local/include:/usr/local/lib",
这样configure之后,"config.mak"会含有“HAVE_SDL=yes”,否则,如何找不到SDL的信息,就会含有“HAVE_SDL=no”,此后编译生成ffplay.exe。

0 0
原创粉丝点击