转自:https://blog.csdn.net/huweijian5/article/details/104369194
文章目录
ffmpeg----configure参数配置说明
ffmpeg版本
- ffmpeg4.2
- 不同版本可能略有差异,实际上要以configure文件中说明的为准
配置说明
- 一开始接触ffmpeg的configure感觉会有点迷茫,很多参数都不知道有什么值可以设置,其实configure文件就能解决绝大部分参数的疑惑,有时间建议通读一遍这个文件
注意
- configure会在控制台输出编译的配置信息,此时一定要认真查看一下里面的信息,特别警告信息,因为你配置的一些选项可能由于条件不满足configure会自动关闭的,或者你把–fatal-warnings这个加上,让警告变成错误
七大库
-
ffmpeg总共有七大库,分别是avdevice,avcodec,avformat,swresample,swscale,postproc,avfilter,加上他们的共同依赖avutil,就算是八大库吧
-
这八个默认都是开启的,因为avutil是最基本的,因此这个库必须有,其他七个都可以通过如下配置关闭
--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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
-
这几大库按需配置,为了减少体积,建议将不用的关闭掉,关闭的时候还要根据他们之间的依赖关系,这个依赖关系可以在源代码ffbuild/config.mak中看出,如图
-
举个例子,如果要使用avformat,那么就不能把avcodec关闭
–enable-gpl --enable-version3
- ffmpeg默认许可证LGPL 2.1,如果需要加gpl的库需要使用gpl的许可证,例如libx264就是gpl的,如果需要加入libx264则需要–enable-gpl
- 如果想更新许可证版本到3,那么就加入–enable-version3
–disable-everything
-
这个选项相当于关闭了encoders,decoders,hwaccels,muxers,demuxers,parsers,bsfs,protocols,devices,indevs,outdevs,filters共9种组件;
-
如果用户增加了这个选项,那么就需要手动打开所需的以上encoders,decoders等
-
比如我只想编译h264的解码器和支持硬解,那么只需要如下即可,没有配置的都会关闭,只打开你所配置的
./configure --disable-everything --enable-decoder=h264 --enable-hwaccel=h264_dxva2
- 1
-
如果没有加上–disable-everything,那么相当于开启了ffmpeg的9种组件支持的所有东西
-
我们如果要编译ffmpeg库来二次开发,那么一般情况下不会用到所有东西,因此建议加上这个选项,然后再通过enable只打开需要的,这样能减少最后编译库的大小和时间
–disable-[component]
-
我们都知道ffmpeg完全编译后有avcodec,avdevice,avformat,swresample,swscale,avfilter,avutil,postproc这8大块
-
如果不做任何配置,这8大块默认是开启的
-
而我们可能不需要其中的一些,比如不需要后处理postproc这一块,那么我们就可以关闭它,比如
./configure --disable-postproc
- 1
-
这样就不会编译postproc这个组件了
–enable-shared
-
默认情况下编译的库是静态的,如果我们想编译动态的,那么就可以加上这个选项,而ffmpeg还为我们提供了显示关闭静态库的选项–disable-static,而一般情况下静动态是不会同时编译的,也就是说如果打开动态库的开关,那么静态库也就被关闭了,因此如果我们想编译动态库的就加上这一行,如果是静态的就不用作修改
./configure --enable-shared
- 1
–enable-cross-compile
- 如果想交叉编译,那么得开启这个开启这个选项,同时还得设置–arch和–target_os和–cross_prefix,实际上你只要增加了–cross_prefix选项,那么configure会自动帮你加上–enable-cross-compile,也就是有了–cross_prefix,–enable-cross-compile你可以省略不写
- 从configure里可以看出,如下
- –arch可以设置哪些值呢,直接在configure中搜索“ARCH_LIST”就可以查到
- –target_os可以设置的值在configure文件中可以你通过搜索“case $target_os in”就可以定位到了
- –cross-prefix这个指定的是交叉编译工具的前缀(如果没有前缀可以不写),比如如果交叉编译工具x86_64-w64-mingw32-gcc,那么你就应该写–cross-prefix=x86_64-w64-mingw32-,注意最后的横线,别漏了,然后configure就会找到–cc设置的值,这个值默认是gcc,也就是相当于加了–cc=gcc的选项,configure会把这两个值拼接在一起,形成x86_64-w64-mingw32-gcc,这样就找到了这个交叉编译工具,至于这个x86_64-w64-mingw32-gcc你肯定要将其配置进环境变量,不然都找不到路径就没法使用了
–extra-
- 如果需要在编译时增加其他库,则一般需要这个将其包含进来
- 最常见的就是–extra-cflags和–extra-ldflags
--extra-cflags="-I/path/include " //增加库的头文件
--extra-ldflags="-L/path/to/your/lib" //增加库(so等)
- 1
- 2
其他
ffmpeg不支持解封装mp4吗?
- 当我们查看ffmpeg的muxer时发现有mp4,而在demuxer列表里却没看到mp4,难道ffmpeg不支持解封装mp4?
- 其实不是的,主要是因为mov,mp4,m4a,3gp,3g2,mj2这几种的解封装都太相似了,所以在ffmpeg里直接用mov就行了,也就是你想ffmpeg支持解封装mp4,那么加上–enable-demuxer=mov即可
编译不成功怎么办
- 编译失败除了看看控制台的提示信息外,在源码的ffbuild/config.log里记录了编译时的相关日志,拖到最后查看日志信息,再百度搜索下解决方案
总结
-
我们使用ffmpeg一般都是作为二次开发,否则直接拿官方的就可以用了,而二次开发往往不需要ffmpeg的所有东西,往往只需要其中的某些库而已,这样就会有一些基本的配置是可以一直保持的
-
最后总结出一些基础的配置,为了减少编译时间和体积,以下是建议配置的,其他要根据实际情况决定
./configure \ --enable-gpl --enable-version3 \ --diable-everything --disable-debug --disable-logging \ --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \ --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
- 1
- 2
- 3
- 4
- 5
参考
https://blog.csdn.net/xinyuan510214/article/details/50457433
ffmpeg ./configure 的相关参数说明_移动开发_fengsh998的专栏-CSDN博客\nhttps://blog.csdn.net/fengsh998/article/details/79443503