前言
之前合成Mp4的项目功能已经完成了,在实际测试的时候发现一个问题,就是编译出来的几个库文件加起来太大了,很占空间,所以想优化压缩一下。
一、编译出来的库为什么大?
FFmpeg的功能实在是太强大,支持视频的编码、解码、合成、分离、转换格式等等,而且几乎支持所有的视频和音频的编码格式,大部分人使用只能用到其中的一部分功能。在编译的时候,可以通过编译选项查看到当前版本支持的编码格式,下面是查看支持对应功能信息的指令
Help options:
--help print this message
--quiet Suppress showing informative output
--list-decoders show all available decoders
--list-encoders show all available encoders
--list-hwaccels show all available hardware accelerators
--list-demuxers show all available demuxers
--list-muxers show all available muxers
--list-parsers show all available parsers
--list-protocols show all available protocols
--list-bsfs show all available bitstream filters
--list-indevs show all available input devices
--list-outdevs show all available output devices
--list-filters show all available filters
比如查看解码支持的格式:
zqq@zqq-virtual-machine:~/share/work/3rdlib/FFmpeg-n3.3.1_bak$ ./configure --list-decoders
aac als dpx h264 loco msmpeg4v3 pcm_zork snow vmnc
aac_at amr_nb_at dsd_lsbf h264_crystalhd m101 msrle pcx sol_dpcm vorbis
aac_fixed amrnb dsd_lsbf_planar h264_cuvid mace3 mss1 pgm sonic vp3
aac_latm amrwb dsd_msbf h264_mediacodec mace6 mss2 pgmyuv sp5x vp5
aasc amv dsd_msbf_planar h264_mmal magicyuv msvideo1 pgssub speedhq vp6
ac3 anm dsicinaudio h264_qsv mdec mszh pictor srt vp6a
ac3_at ansi dsicinvideo h264_vda metasound mts2 pixlet ssa vp6f
ac3_fixed ape dss_sp h264_vdpau microdvd mvc1 pjs stl vp7
adpcm_4xm apng dst hap mimic mvc2 png subrip vp8
adpcm_adx ass dvaudio hevc mjpeg mxpeg ppm subviewer vp8_cuvid
adpcm_afc asv1 dvbsub hevc_cuvid mjpeg_cuvid nellymoser prores subviewer1 vp8_mediacodec
adpcm_aica asv2 dvdsub hevc_mediacodec mjpegb nuv prores_lgpl sunrast vp8_qsv
adpcm_ct atrac1 dvvideo hevc_qsv mlp on2avc psd svq1 vp9
adpcm_dtk atrac3 dxa hnm4_video mmvideo opus ptx svq3 vp9_cuvid
adpcm_ea atrac3al dxtory hq_hqa motionpixels paf_audio qcelp tak vp9_mediacodec
adpcm_ea_maxis_xa atrac3p dxv hqx movtext paf_video qdm2 targa vplayer
adpcm_ea_r1 atrac3pal eac3 huffyuv mp1 pam qdm2_at targa_y216 vqa
adpcm_ea_r2 aura eac3_at iac mp1_at pbm qdmc tdsc wavpack
adpcm_ea_r3 aura2 eacmv idcin mp1float pcm_alaw qdmc_at text webp
adpcm_ea_xas avrn eamad idf mp2 pcm_alaw_at qdraw theora webvtt
adpcm_g722 avrp eatgq iff_ilbm mp2_at pcm_bluray qpeg thp wmalossless
adpcm_g726 avs eatgv ilbc_at mp2float pcm_dvd qtrle tiertexseqvideo wmapro
adpcm_g726le avui eatqi imc mp3 pcm_f16le r10k tiff wmav1
adpcm_ima_amv ayuv eightbps indeo2 mp3_at pcm_f24le r210 tmv wmav2
adpcm_ima_apc bethsoftvid eightsvx_exp indeo3 mp3adu pcm_f32be ra_144 truehd wmavoice
adpcm_ima_dat4 bfi eightsvx_fib indeo4 mp3adufloat pcm_f32le ra_288 truemotion1 wmv1
adpcm_ima_dk3 bink escape124 indeo5 mp3float pcm_f64be ralf truemotion2 wmv2
adpcm_ima_dk4 binkaudio_dct escape130 interplay_acm mp3on4 pcm_f64le rawvideo truemotion2rt wmv3
adpcm_ima_ea_eacs binkaudio_rdft evrc interplay_dpcm mp3on4float pcm_lxf realtext truespeech wmv3_crystalhd
adpcm_ima_ea_sead bintext exr interplay_video mpc7 pcm_mulaw rl2 tscc wmv3_vdpau
adpcm_ima_iss bmp ffv1 jacosub mpc8 pcm_mulaw_at roq tscc2 wmv3image
adpcm_ima_oki bmv_audio ffvhuff jpeg2000 mpeg1_cuvid pcm_s16be roq_dpcm tta wnv1
adpcm_ima_qt bmv_video ffwavesynth jpegls mpeg1_vdpau pcm_s16be_planar rpza twinvq ws_snd1
adpcm_ima_qt_at brender_pix fic jv mpeg1video pcm_s16le rscc txd xan_dpcm
adpcm_ima_rad c93 flac kgv1 mpeg2_crystalhd pcm_s16le_planar rv10 ulti xan_wc3
adpcm_ima_smjpeg cavs flashsv kmvc mpeg2_cuvid pcm_s24be rv20 utvideo xan_wc4
adpcm_ima_wav ccaption flashsv2 lagarith mpeg2_mmal pcm_s24daud rv30 v210 xbin
adpcm_ima_ws cdgraphics flic libcelt mpeg2_qsv pcm_s24le rv40 v210x xbm
adpcm_ms cdxl flv libfdk_aac mpeg2video pcm_s24le_planar s302m v308 xface
adpcm_mtaf cfhd fmvc libgsm mpeg4 pcm_s32be sami v408 xl
adpcm_psx cinepak fourxm libgsm_ms mpeg4_crystalhd pcm_s32le sanm v410 xma1
adpcm_sbpro_2 clearvideo fraps libilbc mpeg4_cuvid pcm_s32le_planar scpr vb xma2
adpcm_sbpro_3 cljr frwu libopencore_amrnb mpeg4_mediacodec pcm_s64be screenpresso vble xpm
adpcm_sbpro_4 cllc g2m libopencore_amrwb mpeg4_mmal pcm_s64le sdx2_dpcm vc1 xsub
adpcm_swf comfortnoise g723_1 libopenh264 mpeg4_vdpau pcm_s8 sgi vc1_crystalhd xwd
adpcm_thp cook g729 libopenjpeg mpeg_vdpau pcm_s8_planar sgirle vc1_cuvid y41p
adpcm_thp_le cpia gif libopus mpeg_xvmc pcm_u16be sheervideo vc1_mmal ylc
adpcm_vima cscd gsm libschroedinger mpegvideo pcm_u16le shorten vc1_qsv yop
adpcm_xa cyuv gsm_ms libspeex mpl2 pcm_u24be sipr vc1_vdpau yuv4
adpcm_yamaha dca gsm_ms_at libvorbis msa1 pcm_u24le smackaud vc1image zero12v
aic dds h261 libvpx_vp8 msmpeg4_crystalhd pcm_u32be smacker vcr1 zerocodec
alac dfa h263 libvpx_vp9 msmpeg4v1 pcm_u32le smc vmdaudio zlib
alac_at dirac h263i libzvbi_teletext msmpeg4v2 pcm_u8 smvjpeg vmdvideo zmbv
alias_pix dnxhd h263p
可以看到支持的格式很齐全,但是如果把这些都包含进去的话,编译出来的库会很大。所以可以只支持我们需要的格式就好了,把其他的一些可以关掉。
二、去掉多余的格式
Individual component options:
--disable-everything disable all components listed below
--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
编译选项中提供了disable所有的解码格式的选项 --disable-decoders ,我们就可以先把所以的解码选项都禁止掉,然后通过--enable-decoder=NAME 这个选项来添加你项目中用的编码格式,比如我的项目中用到了H264和AAC合成Mp4,那我的编译选项中就可以先禁止掉所有的decoders,demuxers,然后打开和ACC和H264相关的。我没有用到编码,所以encoders也可以关掉。类似的你也可以去尝试一下其他的功能选项。
./configure --prefix=`pwd`/out \
--target-os=linux \
--enable-cross-compile \
--cc=arm-none-linux-gnueabi-gcc \
--cxx=arm-none-linux-gnueabi-g++ \
--arch=arm \
--disable-yasm \
--disable-stripping \
--disable-asm \
--enable-shared \
--disable-static \
--disable-encoders \
--disable-decoders \
--enable-decoder=aac \
--enable-decoder=aac_at \
--enable-decoder=h264 \
--enable-decoder=h264_mediacodec \
--disable-demuxers \
--enable-demuxer=aac \
--enable-demuxer=h264 \
我按照上面的脚本实际编译出来的话,库的体积比原来减小了将近2/3,优化效果还是很明显的。
三、--enable-small
FFmpeg还提供了一个选项来减小体积,就是--enable-small
--enable-small optimize for size instead of speed
我们可以看到后面的注释,意思是这个选项是通过速度来换取大小,也就是说牺牲编码解码速度来换取库的体积的减小,这个就要看你实际的需求了,如果flash不是很紧张,或者通过其他的方式可以减小的话,就不用这个选项了,根据实际的项目进行权衡吧。我通过上面的前面的方式优化之后,已经不影响了,所以我没有加这个选项。