ffmpeg代码分析(1)--编译裁剪

    xiaoxiao2021-03-25  109

    我们很少使用到ffmpge完整的功能库,大部分时候,只需要特定的编解码 传输协议,那么该怎么裁剪ffmpeg呢?答案就是configure命令。

    configure 是一个文本文件,打开以后我们会发现它有很多命令,如下

    Help options:   --help                   print this message   --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

    这些命令可以列出ffmpeg支持的编解码器,复用/解复用器 协议  滤镜等。

    敲一个命令试试

    晕菜,这么多的编码器。

    然后我们往下看

    Configuration options:   --disable-static         do not build static libraries [no]   --enable-shared          build shared libraries [no]   --enable-small           optimize for size instead of speed   --disable-runtime-cpudetect disable detecting cpu capabilities at runtime (smaller binary)   --enable-gray            enable full grayscale support (slower color)   --disable-swscale-alpha  disable alpha channel support in swscale   --disable-all            disable building components, libraries and programs   --enable-incompatible-libav-abi enable incompatible Libav fork ABI [no]   --enable-raise-major     increase major version numbers in sonames [no]

    这是编译命令,可以控制是否形成静态库 动态库。里面有个大杀器

      --disable-all  我们在编译的时候,一般把这个放在第一个,让后才是打开我们需要的选项。

    Program options:   --disable-programs       do not build command line programs   --disable-ffmpeg         disable ffmpeg build   --disable-ffplay         disable ffplay build   --disable-ffprobe        disable ffprobe build   --disable-ffserver       disable ffserver build

    这些是编译ffmpeg的三个主要测试程序的,用的最最多的恐怕是ffmpeg和ffmplay两个了。

    Documentation options:   --disable-doc            do not build documentation   --disable-htmlpages      do not build HTML documentation pages   --disable-manpages       do not build man documentation pages   --disable-podpages       do not build POD documentation pages   --disable-txtpages       do not build text documentation pages

    基本不用放开。没用。

    Component options:   --disable-avdevice       disable libavdevice build   --disable-avcodec        disable libavcodec build   --disable-avformat       disable libavformat build   --disable-swresample     disable libswresample build   --disable-swscale        disable libswscale build   --disable-postproc       disable libpostproc build   --disable-avfilter       disable libavfilter build   --enable-avresample      enable libavresample build [no]   --disable-pthreads       disable pthreads [autodetect]   --disable-w32threads     disable Win32 threads [autodetect]   --disable-os2threads     disable OS/2 threads [autodetect]   --disable-network        disable network support [no]   --disable-dct            disable DCT code   --disable-dwt            disable DWT code   --disable-error-resilience disable error resilience code   --disable-lsp            disable LSP code   --disable-lzo            disable LZO decoder code   --disable-mdct           disable MDCT code   --disable-rdft           disable RDFT code   --disable-fft            disable FFT code   --disable-faan           disable floating point AAN (I)DCT code   --disable-pixelutils     disable pixel utils in libavutil

    大的组件的编译选项,

    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

    具体的针对每一种类型打开关闭的语法。

    External library support:

     --enable-libfaac         enable AAC encoding via libfaac [no]   --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]

    这个模块是集成第三方模块的。

    等等等等。下面还有一些专家级别的调试,主要是针对一些平台做调整的。级别和裁剪没有关系了 

    执行完./configure后,会在两个文件中体会到编译变化,一个是config.h,这个主要是通过宏开关的形式,来为后来编译做控制。另外一个是config.mak,这个里面跟多的是编译选项。

    下面看一个例子,ijkplayer里有个编译脚本,在/config目录下,现在一共有四个编译脚本

    打开第一个看看

    # Program options:  export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-programs"  export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffmpeg"  export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffplay"  export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffprobe"  export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver" 禁止编译可执行程序

    export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avdevice"

    关闭设备支持,所以不要想ijk会采集数据 export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avcodec" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avformat" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avutil" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swresample" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-swscale" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-postproc" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avfilter" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avresample" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-pthreads" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-w32threads" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-os2threads" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-network" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dct" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-dwt" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lsp" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-lzo" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-mdct" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-rdft" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-fft"

    # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-everything" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-encoders"

    关闭编码, # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoders" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-hwaccels" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-muxers" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-demuxers" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-parsers" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-bsfs" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocols" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-devices" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-filters"

    可以看出默认的编译脚本,开了所有的解码器,所有的demuxer ,这样的编译出来的体积会比较大,

    对比下器lite版本

    # ./configure --list-decoders export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-decoders" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=aac_latm" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=h264"

    只开了几个解码器

    # ./configure --list-muxers export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-muxers" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-muxer=mp4"

    只支持mp4格式的复用

    # ./configure --list-demuxers export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-demuxers" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=aac" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=concat" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=data" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=flv" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=hls" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=live_flv" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mov" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegps" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mpegts"

    解复用,也只支持几种。

    # ./configure --list-protocols export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocols" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=async" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=bluray" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=concat" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=crypto" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=ffrtmpcrypt" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=ffrtmphttp" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=gopher" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=icecast" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=librtmp*" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=libssh" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=md5" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmsh" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=mmst" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtmp*" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmp" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtmpt" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=rtp" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=sctp" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=srtp" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=subfile" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-protocol=unix"

    协议也不是全部放开的。

    这样编译出来的体积会很小。甚至可以裁剪到不到2m的程度。

    转载请注明原文地址: https://ju.6miu.com/read-6210.html

    最新回复(0)