引用:http://blog.csdn.net/zhouyongku/article/details/44961447
http://www.xuebuyuan.com/1501356.html
编译环境:PC Windows7 64bit、编译工具:MinGW+MSYS+yasm 编译软件:ffmpeg-snapshot-.tar.bz2
一、下载FFmpeg
FFMPEG官网:
FFmpeg SVN:svn://svn.mplayerhq.hu/ffmpeg/trunk
FFmpeg : git://source.ffmpeg.org/ffmpeg.git ffmpeg
由于FFmpeg的SVN代码停止了更新,所以从 svn://svn.mplayerhq.hu/ffmpeg/trunk 上Down下来的代码编译后与在官网上下载的头文件不匹配!所以只能从git上下载或下载git压缩包!
我的下载步骤:打开
下载完ffmpeg-snapshot-git.tar.bz2后解压到D:\work\code\FFmpeg 路径任意(最好为英文,方便MinGW操作)
二、下载MinGW+msys
MinGW - Minimalist GNU for Windows-是Windows下模拟运行的库、头文件等的集合。
msys-Minimal SYStem-是Windows下模拟运行的最新系统,可以通过类似于linux bash的命令行窗口进行代码编译。
登陆
下载完成之后点击安装 关键是选择一个路径C:\MinGW作为安装路径,直接下一步就可以
最后点击continue进行安装完毕确认 并进入下载环节
点击左边的列表框,选中 Basic Setup,在右侧会出现一些必要的下载项,全选即可。
选择完毕后点击菜单Installation->Apply Changes 开始下载
三、配置MinGW
MinGW下载完成后进入安装目录,如果是C:\MinGW 则目录为C:\MinGW\msys\1.0
用记事本打开msys.bat文件,在第一行加入:
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat"
call对应的目录为你的VC安装程序所在目录
四、下载yasm
ffmpeg编译的时候需要yasm.exe 打开 下载与你版本相匹配的yasm 我用的是win764位 所以下载的是 (for general use on 64-bit Windows) 如果你的32位系统请下载32位的程序
五、配置yasm
将下载好的yasm-1.3.0-win64.exe 或者 yasm-1.3.0-win32.exe 修改为 yasm.exe并拷贝到c:\windows\system32文件夹下--这样不需要做过多的环境变量配置
六、编译FFmpeg
1、运行软件
运行C:\MinGW\msys\1.0\msys.bat 在弹出窗口中进入ffmpeg的代码解压路径
cd D:\work\code\FFmpeg
2、配置FFmpeg makefile
输入 ./configure --enable-shared --disable-static --enable-memalign-hack
3、编译FFmpeg
make
ffmpeg生成的文件在各自的目录下,可以通过windows自带的查找文件功能 搜索*.dll和*.lib 导出这些生成库
七、编译时问题
如果编译的是老版本的FFmpeg 则会出现以下这些问题
1、gcc is unable to create an executable file.
这是由于gcc编译器没有准备好,应该是安装过程中出了错误,重装一下。
2、error: static declaration of 'lrint' follows non-static declaration
../libavutil/libm.h:62: error: static declaration of 'lrint' follows non-static declaration ../libavutil/libm.h:69: error: static declaration of 'lrintf' follows non-static declaration ../libavutil/libm.h:76: error: static declaration of 'round' follows non-static declaration ../libavutil/libm.h:83: error: static declaration of 'roundf' follows non-static declaration
将ffmpeg代码路径下的config.h中的lrint、lrintf、round、roundf等定义为1
3、implicit declaration of function 'strcasecmp'
这个问题是由于MinGW的环境中没有strcasecmp函数造成,可以通过自己编写代码加入到工程中,也可以自己编写代码保存成文件放到MinGW的include目录下。
将下列代码存储成strcasecmp.h于mingw include目录下。
将这个文件include进avstring.h和metadata.h中,问题解决。FFmpeg裁剪说明
1 configure参数
1 通用选项
在linux下进入终端,找到ffmpeg解压位置,输入如下命令: root ffmpeg]# ./configure –help 得到configure的基本选项参数,其并没有中文解释。
--help 显示此帮助信息|print this message
--log[=FILE|yes|no] 记录测试并输出到config.err文件|log tests and output to FILE [config.err]
--prefix=PREFIX 安装到指定目录(默认/usr/local)|install in PREFIX [/usr/local]
--libdir=DIR 安装库到指定目录(默认prefix/lib)|install libs in DIR [PREFIX/lib]
--shlibdir=DIR 指定共享库路径(默认prefix/lib)|install shared libs in DIR [PREFIX/lib]
--incdir=DIR 指定includes路径(默认prefix/include/ffmpeg)|install includes in DIR[PREFIX/include/ffmpeg]
--mandir=DIR 指定man page路径(默认prefix/man)install man page in DIR [PREFIX/man]
--enable-mp3lame 启用mp3编码libmp3lame(默认关闭)enable MP3 encoding via libmp3lame[default=no]
--enable-libogg 启用ogg支持libogg(默认关闭)enable Ogg support via libogg [default=no]
--enable-vorbis 启用Vorbis支持libvorbis(默认关闭)enable Vorbis support via libvorbis [default=no]
--enable-faad 启用faad支持libfaad(默认关闭)enable FAAD support via libfaad [default=no]
--enable-faadbin 启用faad运行时链接支持(默认关闭)build FAAD support with runtime linking[default=no]
--enable-faac 启用faac支持libfaac(默认关闭)enable FAAC support via libfaac [default=no]
--enable-libgsm 启用GSM支持libgsm(默认关闭)enable GSM support via libgsm [default=no]
--enable-xvid 启用xvid支持xvidcore(默认关闭)enable XviD support via xvidcore [default=no]
--enable-x264 启用H.264编码(默认关闭)enable H.264 encoding via x264 [default=no]
--enable-mingw32 启用MinGW本地/交叉win环境编译|enable MinGW native/cross Windows compile
--enable-mingwce 启用MinGW本地/交叉winCE环境编译enable MinGW native/cross WinCE compile
--enable-a52 启用A52支持(默认关闭)enable GPLed A52 support [default=no]
--enable-a52bin 启用运行时打开liba52.so.0(默认关闭)open liba52.so.0 at runtime [default=no]
--enable-dts 启用DTS支持(默认关闭)enable GPLed DTS support [default=no]
--enable-pp 启用后加工支持(默认关闭)enable GPLed postprocessing support [default=no]
--enable-static 构建静态库(默认启用)build static libraries [default=yes]
--disable-static 禁止构建静态库(默认关闭)do not build static libraries [default=no]
--enable-shared 构建共享库(默认关闭)build shared libraries [default=no]
--disable-shared 禁止构建共享库(默认启用)do not build shared libraries [default=yes]
--enable-amr_nb 启用amr_nb float音频编解码器|enable amr_nb float audio codec
--enable-amr_nb-fixed 启用fixed amr_nb codec | use fixed point for amr-nb codec
--enable-amr_wb 启用amr_wb float音频编解码器|enable amr_wb float audio codec
--enable-amr_if2 启用amr_wb IF2音频编解码器|enable amr_wb IF2 audio codec
--enable-sunmlib 启用Sun medialib(默认关闭) | use Sun medialib [default=no]
--enable-pthreads 启用pthreads(多线程)(默认关闭)use pthreads [default=no]
--enable-dc1394 启用libdc1394、libraw1394抓取IIDC-1394(默认关闭)enable IIDC-1394 grabbing using libdc1394 and libraw1394 [default=no]
--enable-swscaler 启用计数器支持?(默认关闭)software scaler support [default=no]
--enable-avisynth 允许读取AVISynth脚本本件(默认关闭)allow reading AVISynth script files [default=no]
--enable-gpl 允许使用GPL(默认关闭)allow use of GPL code, the resulting libav* and ffmpeg will be under GPL [default=no] Advanced options (experts only): 高级选项参数(供专业人员使用)
--source-path=PATH 源码的路径(当前为/root/flv/ffmpeg)| path to source code [/root/flv/ffmpeg]
--cross-prefix=PREFIX 为编译工具指定路径| use PREFIX for compilation tools []
--cross-compile 假定使用了交叉编译| assume a cross-compiler is used
--cc=CC 指定使用何种C编译器(默认gcc)use C compiler CC [gcc]
--make=MAKE 使用特定的make | use specified make [make]
--extra-cflags=ECFLAGS 添加ECFLAGS到CFLAGS | add ECFLAGS to CFLAGS []
--extra-ldflags=ELDFLAGS 添加ELDFLAGS到LDFLAGS(默认-Wl,--as-needed)| add ELDFLAGS to LDFLAGS [ -Wl,--as-needed]
--extra-libs=ELIBS 添加ELIBS | add ELIBS []
--build-suffix=SUFFIX 为专用程序添加后缀| suffix for application specific build []
--arch=ARCH 选择机器架构(默认x86)select architecture [x86]
--cpu=CPU 选用最低的cpu(影响指令的选择,可以在老CPU上出错) | selects the minimum cpu required (affects instruction selection, may crash on older CPUs)
--powerpc-perf-enable 启用PPC上面的性能报告(需要启用PMC)enable performance report on PPC (requires enabling PMC)
--disable-mmx 禁用MMX | disable MMX usage
--disable-armv5te 禁用armv5te | disable armv5te usage
--disable-iwmmxt 禁用iwmmxt | disable iwmmxt usage
--disable-altivec 禁用AltiVec | disable AltiVec usage
--disable-audio-oss 禁用OSS音频支持(默认启用)disable OSS audio support [default=no]
--disable-audio-beos 禁用BeOS音频支持(默认启用)disable BeOS audio support [default=no]
--disable-v4l 禁用video4linux提取(默认启用)disable video4linux grabbing [default=no]
--disable-v4l2 禁用video4linux2提取(默认启用)disable video4linux2 grabbing [default=no]
--disable-bktr 禁用bktr视频提取(默认启用)disable bktr video grabbing [default=no]
--disable-dv1394 禁用DV1394提取(默认启用)disable DV1394 grabbing [default=no]
--disable-network 禁用网络支持(默认支持)disable network support [default=no]
--disable-ipv6 禁用ipv6支持(默认支持)disable ipv6 support [default=no]
--disable-zlib 禁用zlib(默认支持)disable zlib [default=no]
--disable-simple_idct 禁用simple IDCT例程(默认启用)disable simple IDCT routines [default=no]
--disable-vhook 禁用video hooking支持| disable video hooking support
--enable-gprof enable profiling with gprof [no] --disable-debug 禁用调试符号| disable debugging symbols
--disable-opts 禁用编译器最优化| disable compiler optimizations
--disable-mpegaudio-hp 启用更快的解码MPEG音频(但精确度较低)(默认禁用)faster (but less accurate) MPEG audio decoding [default=no]
--disable-protocols 禁用I/O 协议支持(默认启用)disable I/O protocols support [default=no]
--disable-ffserver 禁用生成ffserver | disable ffserver build --disable-ffplay 禁用生成ffplay | disable ffplay build
--enable-small 启用优化文件尺寸大小(牺牲速度)optimize for size instead of speed
--enable-memalign-hack 启用模拟内存排列,由内存调试器干涉? | emulate memalign, interferes with memory debuggers
--disable-strip 禁用剥离可执行程序和共享库| disable stripping of executables and shared libraries
--disable-encoder=NAME 禁用XX编码器| disables encoder NAME
--enable-encoder=NAME 启用XX编码器| enables encoder NAME
--disable-decoder=NAME 禁用XX解码器| disables decoder NAME
--enable-decoder=NAME 启用XX解码器| enables decoder NAME
--disable-encoders 禁用所有编码器| disables all encoders
--disable-decoders 禁用所有解码器| disables all decoders
--disable-muxer=NAME 禁用XX混音器| disables muxer NAME
--enable-muxer=NAME 启用XX混音器| enables muxer NAME
--disable-muxers 禁用所有混音器| disables all muxers
--disable-demuxer=NAME 禁用XX解轨器| disables demuxer NAME
--enable-demuxer=NAME 启用XX解轨器| enables demuxer NAME
--disable-demuxers 禁用所有解轨器| disables all demuxers
--enable-parser=NAME 启用XX剖析器| enables parser NAME
--disable-parser=NAME 禁用XX剖析器| disables parser NAME
--disable-parsers 禁用所有剖析器| disables all parsers
2 基本选项介绍
以下为配置ffmpeg的基本选项,其含义如下:
--cache-file=FILE configure会在你的系统上测试存在的特性(或者bug!)。为了加速随后进行的配置,测试的结果会存储在一个cache file里。当configure到每个子树里都有configure脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助。
--help输出帮助信息。即使是有经验的用户也偶尔需要使用使用--help选项,因为一个复杂的项目会包含附加的选项。例如,GCC包里的configure脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项。
--no-create configure中的一个主要函数会制作输出文件。此选项阻止configure生成这个文件。你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了。
--quiet --silent 当configure进行他的测试时,会输出简要的信息来告诉用户正在作什么。这样做是因为configure可能会比较慢,没有这种输出的话用户将会被扔在一旁疑惑正在发生什么。使用这两个选项中的任何一个都会把你扔到一旁。(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can
be left wondering!)--version 打印用来产生'configure'脚本的Autoconf的版本号。
--prefix=PEWFIX --prefix是最常用的选项。制作出的Makefile会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部分。举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到"/opt/gnu/share": $ ./configure --prefix=/opt/gnu --exec-prefix=EPREFIX 与--prefix选项类似,但是他是用来设置结构倚赖的文件的安装位置。编译好的emacs二进制文件就是这样一个问件。如果没有设置这个选项的话,默认使用的选项值将被设为和--prefix选项值一样。
--bindir=DIR 指定二进制文件的安装位置。这里的二进制文件定义为可以被用户直接执行的程序。
--sbindir=DIR 指定超级二进制文件的安装位置。这是一些通常只能由超级用户执行的程序。
--libexecdir=DIR
指定可执行支持文件的安装位置。与二进制文件相反,这些文件从来不直接由用户 执行,但是可以被上面提到的二进制文件所执行。--datadir=DIR 指定通用数据文件的安装位置。
--sysconfdir=DIR 指定在单个机器上使用的只读数据的安装位置。
--sharedstatedir=DIR 指定可以在多个机器上共享的可写数据的安装位置。
--localstatedir=DIR 指定只能单机使用的可写数据的安装位置。
--libdir=DIR 指定库文件的安装位置。
--includedir=DIR 指定C头文件的安装位置。其他语言如C++的头文件也可以使用此选项。
--oldincludedir=DIR 指定为除GCC外编译器安装的C头文件的安装位置。
--infodir=DIR 指定Info格式文档的安装位置。Info是被GNU工程所使用的文档格式。--mandir=DIR 指定手册页的安装位置。
--srcdir=DIR 这个选项对安装没有作用。他会告诉configure源码的位置。一般来说不用指定此选项,因为configure脚本一般和源码文件在同一个目录下。
--program-prefix=PREFIX 指定将被加到所安装程序的名字上的前缀。例如,使用--program-prefix=g来configure一个名为tar的程序将会使安装的程序被命名为gtar。当和其他的安装选项一起使用时,这个选项只有当他被Makefile.in文件使用时才会工作。
--program-suffix=SUFFIX 指定将被加到所安装程序的名字上的后缀。
--program-transform-name=PROGRAM 这里的PROGRAM是一个sed脚本。当一个程序被安装时,他的名字将经过sed -e PROGRAM来产生安装的名字。
--build=BUILD 指定软件包安装的系统平台。如果没有指定,默认值将是--host选项的值。
--host=HOST 指定软件运行的系统平台。如果没有指定,将会运行config.guess来检测。
--target=GARGET' 指定软件面向(target to)的系统平台。这主要在程序语言工具如编译器和汇编器上下文中起作用。如果没有指定,默认将使用--host选项的值。
--disable-FEATURE一些软件包可以选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置。如果默认是提供这些特性,可以使用--disable-FEATURE来禁用它,这里FEATURE是特性的名字。例如: $ ./configure --disable-gui -enable-FEATURE[=ARG] 相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用--enable-FEATURE来起用它。这里FEATURE是特性的名字。一个特性可能会接受一个可选的参数。例如:
$ ./configure --enable-buffers=128 --enable-FEATURE=no与上面提到的--disable-FEATURE是同义的。
--with-PACKAGE[=ARG] 在自由软件里,有使用已有软件包和库的优秀传统。当用configure来配置一个源码树时,可以提供其他已经安装的软件包的信息。例如,倚赖于Tcl和Tk的BLT器件工具包。要配置BLT,可能需要给configure提供一些关于我们把Tcl和Tk装的何处的信息:
$ ./configure --with-tcl=/usr/local --with-tk=/usr/local --with-PACKAGE=no与下面将提到的--without-PACKAGE是同义的。--without-PACKAGE 有时候你可能不想让你的软件包与系统已有的软件包交互。例如,你可能不想让你的新编译器使用GNU ld。通过使用这个选项可以做到这一点: $ ./configure --without-gnu-ld --x-includes=DIR 这个选项是--with-PACKAGE选项的一个特例。在Autoconf最初被开发出来时,流行使用configure来作为Imake的一个变通方法来制作运行于X的软件。
--x-includes选项提供了向configure脚本指明包含X11头文件的目录的方法。--x-libraries=DIR 类似的,--x-libraries选项提供了向configure脚本指明包含X11库的目录的方法。
FFmpeg裁剪优化实例
对ffmpeg的裁剪优化主要是对ffplay的裁剪优化,我们制定的需求是能播放测试文件(视频为mpeg4编码、音频为mp2编码,且为AVI复用),根据需求,找到相应的选项,或禁用或启用,最后的命令如下: ./configure --disable-yasm --disable-parsers --disable-decoders --disable-encoders --enable-decoder=mpeg4 --disable-muxers --disable-demuxers --enable-demuxer=avi
--enable-decoder=mp2 --disable-protocols --enable-protocol=file --disable-filters --disable-bsfs其中针对需求,--disable-parsers为禁用所有解析器,--disable-decoders为禁用所有解码器,--disable-encoders为禁用所有编码器,--enable-decoder=mpeg4为启用mpeg4的编码器,--disable-muxers为禁用所有复用,--disable-demuxers为禁用所有解复用,--enable-demuxer=avi为启用AVI复用,--enable-decoder=mp2为启用mp2编码,--disable-protocols为禁用所有协议,--enable-protocol=file为启用文件协议,--disable-filters为禁用所有过滤器,--disable-bsfs为禁用所有码流过滤器。通过以上配置
之后,编译,安装,就生成了我们要求的ffplay,其大小为1.8M(1864012字节)。此次是在linux环境下进行的,在以后的配置中,如果需要其他的什么编码器或什么的,按照选项要求进行配置即可。
裁剪优化前后文件比较
前面已经提到本次裁剪优化的内容。经过裁剪优化之后,对其文件夹进行比较,主要有3个地方不同,分别是config.fate、config.h和config.mak。在config.fate中,其记录的是配置命令,由于前后两次配置命令不同,故相应内容也不同,如图4-1所示。在config.h中,其主要是根据配置命令来改变相应预定义的值,达到裁剪优化之效果如图4-2所示。在config.mak中,改变的也是配置命令中需要改变的选项,
./configure --enable-shared --disable-decoders --disable-encoders --enable-decoder=h264 --enable-decoder=hevc --disab
le-filters --disable-bsfs --disable-yasm --disable-demuxers --enable-demuxer=rtsp --disable-muxers --prefix=./vs2013_bu ild --enable-debug --toolchain=msvc