1 . FFmpeg裁剪移植
之前我们简单地讲解了下如何在Linux系统中编译FFmpeg,但是编译出来的so体积太大,而且得到的多个so不便于使用。本节在此基础上,将详细讲解在编译FFmpeg时如何对相关模块作裁剪以精简so的体积,并且编译只生成一个so文件。首先,我们来看下在配置编译选项时,configure的具体配置信息,可以进入FFmpeg源码根目录执行./configure --help命令可得到,部分配置选项如下:
- Standar Options
--logfile=FILE 指定日志文件输出路径[ffbuild/config.log]
--disable-logging 不记录配置调试信息
--fatal-warnings 如果配置出现警告,就认为失败
--prefix=PREFIX 编译得到的库文件输出路径[/usr/local]
--bindir=DIR 二进制文件输出路径 [PREFIX/bin]
--datadir=DIR 数据输出路径[PREFIX/share/ffmpeg]
--docdir=DIR 文档输出路径[PREFIX/share/doc/ffmpeg]
--libdir=DIR libs输出路径[PREFIX/lib]
--shlibdir=DIR 动态库输出路径 [LIBDIR]
--incdir=DIR 头文件输出路径 [PREFIX/include]
--mandir=DIR 帮助文档输出路径 [PREFIX/share/man]
--pkgconfigdir=DIR pkg-config文件输出路径[LIBDIR/pkgconfig]
- Configuration options
--disable-static 禁止编译静态库
--enable-shared 开启编译动态库
--enable-small 开启优化大小
--disable-runtime-cpudetect 禁用在运行时检测CPU功能
--enable-gray 启用全灰度支持(slower color)
--disable-swscale-alpha 禁止在swscale中支持alpha通道
--disable-all 禁止编译所有组件(components)、库(libraries)、程序(programs)
--disable-autodetect 禁用自动检测到的外部库
这里用得较多的是--disable-static、--enable-shared和--enable-small选项,其中,--disable-static用于是否使能编译静态库文件(.a);--enable-shared用于使能编译动态库文件(.so)。
- Program options
--disable-programs 禁止编译programs
--disable-ffmpeg 禁止编译ffmpeg
--disable-ffplay 禁止编译ffplay
--disable-ffprobe 禁止编译ffprobe
通常,我们会使用禁止编译ffmpeg、ffplay和ffprobe,其中,ffplay是一个使用了FFmpeg和SDL库的、简单的、可移植的媒体播放器;ffprobe用于查看多媒体文件的信息。
【腾讯文档】FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高级开发-资料领取
https://docs.qq.com/doc/DYU5ORlBOdkpCUkNx
https://docs.qq.com/doc/DYU5ORlBOdkpCUkNx


- Component options
--disable-avdevice 禁止编译libavdevice模块
--disable-avcodec 禁止编译libavcodec模块
--disable-avformat 禁止编译libavformat模块
--disable-swresample 禁止编译libswresample模块
--disable-swscale 禁止编译libswscale模块
--disable-postproc 禁止编译libpostproc模块
--disable-avfilter 禁止编译libavfilter模块
--enable-avresample 该模块已被弃用
--disable-pthreads 禁止pthreads [autodetect]
--disable-w32threads 禁止Win32 threads [autodetect]
--disable-os2threads 禁止OS/2 threads [autodetect]
--disable-network 禁止network支持
--disable-dct 禁止DCT代码模块
--disable-dwt DWT代码模块
--disable-error-resilience error resilience code
--disable-lsp 禁止LSP代码模块
--disable-lzo 禁止LZO decoder代码模块
--disable-mdct 禁止MDCT代码模块
--disable-rdft 禁止RDFT代码模块
--disable-fft 禁止FFT代码模块
--disable-faan 禁止floating point AAN (I)DCT代码模块
--disable-pixelutils 禁止libavutil模块中的pixel工具
这部分类似一个全局开关,用于对模块进行管控,假如我们非常明确编译的ffmpeg有明确的功能(不考虑未来扩展),那么,就可以对某些模块进行裁剪,以最大化精简so的大小、功能。
- Individual component options
--disable-everything 禁止所有的组件,就是下面列出来的这些
--disable-encoder=NAME 禁用名称为NAME的编码器
--enable-encoder=NAME 使能名称为NAME的编码器
--disable-encoders 禁用所有编码器,可通过指定NAME具体开启
--disable-decoder=NAME 禁用名称为NAME的解码器
--enable-decoder=NAME 使能名称为NAME的解码器
--disable-decoders 禁用所有解码器,可通过指定NAME具体开启
--disable-hwaccel=NAME 禁用名称为NAME的hwaccel
--enable-hwaccel=NAME 使能名称为NAME的hwaccel
--disable-hwaccels 禁用所有hwaccel,可通过指定NAME具体开启
--disable-muxer=NAME muxer NAME
--enable-muxer=NAME enable muxer NAME
--disable-muxers 禁用所有复用器,可通过指定NAME具体开启
--disable-demuxer=NAME demuxer NAME
--enable-demuxer=NAME enable demuxer NAME
--disable-demuxers 禁用所有解复用器,可通过指定NAME具体开启
--enable-parser=NAME enable parser NAME
--disable-parser=NAME parser NAME
--disable-parsers 禁用所有解析器,可通过指定NAME具体开启
--enable-bsf=NAME enable bitstream filter NAME
--disable-bsf=NAME bitstream filter NAME
--disable-bsfs 禁用所有位流过滤器,可通过指定NAME具体开启
--enable-protocol=NAME enable protocol NAME
--disable-protocol=NAME protocol NAME
--disable-protocols 禁用所有协议,可通过指定NAME具体开启
--enable-indev=NAME enable input device NAME
--disable-indev=NAME input device NAME
--disable-indevs 禁用所有输入设备,可通过指定NAME具体开启
--enable-outdev=NAME enable output device NAME
--disable-outdev=NAME output device NAME
--disable-outdevs 禁用所有输出设备,可通过指定NAME具体开启
--disable-devices 禁用所有设备,包括输入、输出
--enable-filter=NAME enable filter NAME
--disable-filter=NAME filter NAME
--disable-filters 禁用所有过滤器,可通过指定NAME具体开启
本部分的配置主要是选择那些组件需要编译,比如编码器、解码器、复用器、解复用器等等。举个栗子:
--disable-encoders
--enable-encoder=h263
--enable-encoder=libx264
--enable-encoder=aac
--enable-encoder=mpeg4
--enable-encoder=mjpeg
--enable-encoder=png
--enable-encoder=gif
--enable-encoder=bmp
--disable-muxers
--enable-muxer=h264
--enable-muxer=flv
--enable-muxer=gif
--enable-muxer=mp3
--enable-muxer=dts
--enable-muxer=mp4
--enable-muxer=mov
--enable-muxer=mpegts
--disable-decoders
--enable-decoder=aac
--enable-decoder=aac_latm
--enable-decoder=mp3
--enable-decoder=h263
--enable-decoder=h264
--enable-decoder=mpeg4
--enable-decoder=mjpeg
--enable-decoder=gif
--enable-decoder=png
--enable-decoder=bmp
--enable-decoder=yuv4
--disable-demuxers
--enable-demuxer=image2
--enable-demuxer=h263
--enable-demuxer=h264
--enable-demuxer=flv
--enable-demuxer=gif
--enable-demuxer=aac
--enable-demuxer=ogg
--enable-demuxer=dts
--enable-demuxer=mp3
--enable-demuxer=mov
--enable-demuxer=m4v
--enable-demuxer=c

本文介绍了如何裁剪FFmpeg源码以生成精简的动态库文件,并详细讲解了编译时的配置选项,包括裁剪模块、选择编译组件和第三方库支持。此外,还阐述了利用FFmpeg保存网络流到本地MP4文件的过程,涉及AVDictionary、AVFormatContext等关键结构体和函数的使用,以及实现步骤和实战案例。

2547

被折叠的 条评论
为什么被折叠?



