最新FFMPEG一键编译指南
楼主主要关注iOS上面的开发,所以本文只讨论iOS平台的一键编译。不排除以后介绍Android平台。
版本
截止2017.03.13, 在官网上的最新版本为3.2.4。本文以此来讲述。
两个重要的脚本
我想很多人编译FFMPEG都是遵循这两个流传已久的脚本,并在此基础上根据自身需求来定制FFMPEG。这些脚本也是随着FFMPEG版本的更新而做相应的更新,楼主两年前就做过相关的介绍,对比起来,内容已有不小的改动。
build_ffmpeg.sh都干了啥
楼主主要介绍这个脚本,至于另外一个,很少修改,所以不做介绍。具体来说,build_ffmpeg.sh做了如下几件事情。
-
设置输入,即你要编译的FFMPEG的版本
SOURCE=ffmpeg-3.2.4
++ffmpeg-3.2.4++必须要按照这个格式来写,为什么后面再说。
-
设置输出,即编译好的lib放到什么位置
FAT="FFmpeg-iOS"
++FFmpeg-iOS++是输出路径,表示最终的所有lib和头文件放在当前目录下的FFmpeg-iOS。
-
设置编译选项
CONFIGURE_FLAGS="--enable-cross-compile --disable-debug --disable-programs --disable-doc --enable-pic"
有时候你可能只需要FFMPEG里面的一部分功能,在这里可以实现你的想法。
-
设置架构
ARCHS="arm64 armv7 x86_64 i386"
上面的设置说明,你想编译64位、32位的真机版,以及64位、32位的模拟器版。可做删减。
-
尝试下载安装Yasm,如果你的Mac上没有安装
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Yasm是x86平台的汇编编译器
-
尝试下载安装gas-preprocessor.pl,如果你的Mac上没有安装
curl -L https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl
-
尝试下载FFMPEG源代码,如果你的Mac上没有指定版本的code
curl http://www.ffmpeg.org/releases/$SOURCE.tar.bz2 | tar xj
前面提到过++SOURCE++的赋值必须要按照一定的格式,那是因为官网的源文件的命名规则就是这样的。
-
根据配置生成config.mk和config.h
TMPDIR=${TMPDIR/%\/} $CWD/$SOURCE/configure \ --target-os=darwin \ --arch=$ARCH \ --cc="$CC" \ $CONFIGURE_FLAGS \ --extra-cflags="$CFLAGS" \ --extra-ldflags="$LDFLAGS" \ --prefix="$THIN/$ARCH" \ || exit 1
-
开始编译
make -j3 install $EXPORT || exit 1
裁剪才是本文想谈的重点
在你的项目里,FFMPEG大多数的功能都不是你需要的,所以必须瘦身,减少lib的体积。这里以只需要编译H264 decoder来说明。还记得上面提到的++CONFIGURE_FLAGS++吗?加在这里就行。
-
--disable-avfilter --disable-avdevice --disable-ffplay --disable-ffprobe --disable-ffserver --disable-avformat --disable-swscale --disable-programs --disable-doc
把大的模块先干掉。
-
--disable-everything
注意这个everything不包括disable上面提及的那些模块,那是哪些呢?看下面。
--disable-encoder=NAME disable encoder NAME
--enable-encoder=NAME enable encoder NAME
--disable-encoders disable all encoders
--disable-decoder=NAME disable decoder NAME
--enable-decoder=NAME enable decoder NAME
--disable-decoders disable all decoders
--disable-hwaccel=NAME disable hwaccel NAME
--enable-hwaccel=NAME enable hwaccel NAME
--disable-hwaccels disable all hwaccels
--disable-muxer=NAME disable muxer NAME
--enable-muxer=NAME enable muxer NAME
--disable-muxers disable all muxers
--disable-demuxer=NAME disable demuxer NAME
--enable-demuxer=NAME enable demuxer NAME
--disable-demuxers disable all demuxers
--enable-parser=NAME enable parser NAME
--disable-parser=NAME disable parser NAME
--disable-parsers disable all parsers
--enable-bsf=NAME enable bitstream filter NAME
--disable-bsf=NAME disable bitstream filter NAME
--disable-bsfs disable all bitstream filters
--enable-protocol=NAME enable protocol NAME
--disable-protocol=NAME disable protocol NAME
--disable-protocols disable all protocols
--enable-indev=NAME enable input device NAME
--disable-indev=NAME disable input device NAME
--disable-indevs disable input devices
--enable-outdev=NAME enable output device NAME
--disable-outdev=NAME disable output device NAME
--disable-outdevs disable output devices
--disable-devices disable all devices
--enable-filter=NAME enable filter NAME
--disable-filter=NAME disable filter NAME
--disable-filters disable all filterså -
--enable-decoder=h264
干自己的事。
其他
写这篇文章时,查阅资料,看到官网有不同平台的编译指南,记录下来以后参考。
本文如对你有所帮助,请点赞。如值得分享,请注明出处后转载。
楼主在实践和写作过程中亦参考了不少好文,列于下,谢谢分享。
网友评论
https://zhidao.baidu.com/question/1884232322580574308.html