FFMPEG编译与裁剪

原生的ffmpeg库包含以下几项:

  • libavformat

    用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。

  • libavcodec

    用于各种类型声音/图像编解码。该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能。

  • libavdevice

    硬件采集、加速、显示。操作计算机中常用的音视频捕获或输出设备。

  • libavfilter

    音视频滤波器的开发,如宽高比、裁剪、格式化、非格式化伸缩。

  • libavutil

    包含一些公共的工具函数的使用库,包括算数运算、字符操作。

  • libavresample

    音视频封转编解码格式预设等。

  • libswscale

    原始视频格式转换,用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565、rgb888 等与 yuv420 等之间转换。

  • libswresample

    原始音频格式转码。

  • libpostproc

    同步、时间计算的简单算法,用于后期效果处理;音视频应用的后处理,如图像的去块效应。

在编译ffmpeg源码之前,我们可以通过配置编译参数选择是否编译生成如上库。一般而言,要实现最基本的音视频编解码功能,libavformatlibavcodeclibavutil这三个库是不可缺少的。我们通过使能或失能ffmpeg支持的组件,如编解码器、分流器、合流器、解析器、协议类型等,来裁剪库文件的大小。

在ffmpeg源码路径下,运行./configure --help,会提示每个编译参数的含义,我们主要关心的有以下几项。

  • 通用配置参数

    --prefix=DIR              // 安装路径
    --shlibdir=DIR            // 动态库安装路径
    --libdir=DIR              // 静态库安装路径
    --enable-cross-compile    // 使能交叉编译
    --arch=NAME               // 支持的硬件平台
    --target-os=OS            // 目标操作系统
    --cross-prefix=NAME       // 支持的交叉编译器
    --disable-gpl             // 不允许使用gpl代码
    --enable-nonfree          // 允许使用非自由代码
    --enable-error-resilience // 使能抗误码
    --disable-debug           // 关闭调试信息
    --enable-shared           // 生成动态链接库
    --enable-small            // 优化大小而不是优化速度
    
    --disable-ffmpeg
    --disable-ffprobe
    --disable-ffplay
    --disable-programs
    --disable-symver
    --disable-doc
    --disable-htmlpages
    --disable-manpages
    --disable-podpages
    --disable-txtpages      // 这些参数表示不编译ffmpeg应用、说明文档等
    

    以下这些参数用于裁剪功能:

    --enable-avformat       // 建立libavformat
    --enable-avcodec        // 建立libavcodec
    --disable-avresample    // 不建立libavresample
    --disable-avfilter      // 不建立libavfilter
    --disable-avdevice      // 不建立libacdevice
    --disable-postproc      // 不建立libpostproc
    --disable-swscale       // 不建立libswscale
    --disable-swresample    // 不建立libswresample
    
    disable-everything    // 关闭下列所有组件
    disable-encoder=NAME  // 禁用NAME编码器
    enable-encoder=NAME   // 启用NAME编码器
    disable-encoders      // 禁用所有支持的编码器
    disable-decoder=NAME  // 禁用NAME解码器
    enable-decoder=NAME   // 启用NAME解码器
    disable-decoders      // 禁用所有支持的解码器
    disable-hwaccel=NAME  // 禁用NAME硬件加速器
    enable-hwaccel=NAME   // 启用NAME硬件加速器
    disable-hwaccels      // 禁用所有支持的硬件加速器
    disable-muxer=NAME    // 禁用NAME合流器
    enable-muxer=NAME     // 启用NAME合流器
    disable-muxers        // 禁用所有支持的合流器
    disable-demuxer=NAME  // 禁用NAME分流器
    enable-demuxer=NAME   // 启用NAME分流器
    disable-demuxers      // 禁用所有支持的分流器
    enable-parser=NAME    // 禁用NAME解析器
    disable-parser=NAME   // 启用NAME解析器
    disable-parsers       // 禁用所有支持的解析器
    enable-bsf=NAME       // 禁用NAME比特过滤器
    disable-bsf=NAME      // 启用NAME比特过滤器
    disable-bsfs disable  // 禁用所有支持的比特过滤器
    enable-protocol=NAME  // 禁用NAME协议
    disable-protocol=NAME // 启用NAME协议
    disable-protocols     // 禁用所有支持的协议
    disable-indev=NAME    // 禁用NAME输入设备
    disable-outdev=NAME   // 禁用NAME输出设备
    disable-indevs        // 禁用所有支持的输入设备
    disable-outdevs       // 禁用所有支持的输出设备
    disable-devices       // 禁用所有支持的输入输出设备
    disable-filter=NAME   // 禁用NAME过滤器
    enable-filter=NAME    // 启用NAME过滤器
    disable-filters       // 禁用所有支持的过滤器
    

    注:可在源码路径下运行./configure 命令查询ffmpeg支持的组件。

    正常编译时,在./configure后附加上述编译配置参数,根据项目所需禁用或启用相关组件,达到裁剪ffmpeg的目的。例,如仅支持视频H264解码,音频AAC解码,MP4文件格式,可用如下参数裁剪:

    ./configure --prefix=host --shlibdir=host/dynamic
    
    --enable-cross-compile --arch=arm --target-os=linux
    
    --cross-prefix=arm-linux-gnueabihf- --disable-gpl --enable-nonfree
    
    --enable-error-resilience --disable-debug --enable-shared
    
    --enable-small --disable-ffmpeg --disable-ffprobe --disable-ffplay
    
    --disable-programs --disable-symver --disable-doc
    
    --disable-htmlpages --disable-manpages --disable-podpages
    
    --disable-txtpages --enable-avformat --enable-avcodec
    
    --disable-avresample --disable-avfilter --disable-avdevice
    
    --disable-postproc --disable-swscale --disable-swresample
    
    -disable-everything
    
    enable-decoder=h264 enable-decoder=aac enable-muxer=m4v
    
    enable-muxer=aac enable-parser=h264 enable-parser=aac
    
    enable-protocol=file