FFmpeg编译参数分析

news2024/11/15 14:10:21

config.mak 来传递给 makefile ,还会生成 config.h 给 C 程序 include 引入。

由于 configure 脚本的编译参数是非常多的,本文主要讲解一些比较常用的编译参数,一些特殊的编译参数,读者可通过以下命令查询。

configure --help

1,--logfile=FILE ,指定环境检测日志文件,默认是 ffbuild/config.logconfigure 检测当前的环境能不能正常编译 FFmpeg 源代码的方法,就是实际编译一个函数,一小段代码。logfile 实际上就是 configure 脚本的运行日志。

2,指定各种安装目录,--prefix--bindir--libdir--shlibdir--incdir--pkgconfigdir,如下:

 

prefix 代表前缀目录,libdir 代表静态库目录,shlibdir 是动态库的安装目录,默认会把动态库安装到系统的动态库目录,也就是 LIBDIR 变量。

pkgconfigdir 代表 pkg 文件的安装目录,pkg 是用来给第三方软件找到 FFmpeg 静态库,动态库的安装目录的。


3,--disable-static--enable-shared,这两个选项分别是 禁止生成静态库 跟 生成动态库。FFmpeg 默认会生成静态库,但是他不能同时生成静态库跟动态库,如果你启动了 --enable-shared那就只会生成动态库,不会生成静态库。如果你需要同时用到静态库跟动态库,那就需要编译两次

4,--enable-small,把 FFmpeg 的体积减少。

5,--disable-programs,不生成 ffmpeg.exe ,ffplay.exe ,ffprobe.exe 可执行文件。只生成静态库或者动态库。也可以单独指定某个 exe 不生成,例如 --disable-ffplay

6,--disable-doc,不编译生成文档,可以节省编译时间。

7,--disable-avdevice--disable-avcodec--disable-avformat--disable-swresample--disable-swscale--disable-postproc--disable-avfilter。如果你只需要exe文件,可以指定不生成这些库,但是可能 exe 会缺少某个库的功能,具体待确认。


8,第8条是非常重要的,代表是否关闭多线程--disable-pthreads--disable-w32threads--disable-os2threads

其中 pthread 是 Linux 的 线程 API,w32thread 是 Windows 的线程API,os2threads 是苹果系统的线程 API。

我们来看一下,如果启用 --disable-pthreads,会影响哪些地方。configure 脚本处理 --disable-pthreads 这个选项的代码在 4088 行,如下:

 

由于 threads 是在 $CMDLINE_SELECT 里面的,所以会跑进去第二个条件。

所以 --disable-pthreads 这个选项的作用,实际上就是在 shell 里面设置一个变量 pthreads = no,我们接下来再看看 pthreads 这个变量会影响后续的哪些编译操作。

PS:我个人感觉 shell 写的 configure 非常难懂,不易调试,一样的环境检测功能,完全可以用 python 来写,更容易维护一些。

上面的代码,是如果启用 pthreads 但是 没启用 w32thread 跟 os2thread 就会跑进去的逻辑

从上图可以看到 pthreads 等于 yes 的时候,就会 加上 -pthreads 选项给链接器,我们设置成 no,就不会跑进去上面的逻辑,也就没有 -pthreads 选项。

pthreads 影响的地方就是这些了,但是写过 Linux 多线程的都知道,这只是编译的时候不链接线程库,代码里面还是有多线程代码,如果不隐藏多线程代码,链接的时候就会报错。

下面我们再来看一下,ffmpeg.exe 的多线程代码在哪里,又是如何隐藏的。

首先,configure 脚本会生成 config.h 文件,如下:

 config.h 的内容如下:

从上图可以看到,定义了各种宏,C源代码里面正是引入了 config.h ,利用宏来判断要不要启用 多线程的代码的,现在只需要搜索 HAVE_PTHREADS 这个宏,即可找到多线程代码的位置,如下:

 

可以看到,就在 slicethread.c 里面。

最后,提醒一下,configure 默认是自动判断当前环境是否支持多线程,如果支持就会自动开启。大部分系统都有多线程函数,所以可以认为默认是启用多线程的。多线程用于编解码模块,如果禁用了,性能会下降非常多。


9,--disable-network,如果不需要处理网络协议,可以启动这个选项,可以减小软件大小 跟 节省编译时间。

10,configure 脚本提供了各种裁剪功能,例如可以只启用某个编解码器,其他的编解码器全部不要,这样能大大缩小可执行文件的体积。

做法是先用 --disable-encoders 禁用所有的编码器,然后用 --enable-encoder=NAME启用某一个编码器。

封装格式也可以这样裁剪,--disable-muxers 禁用所有的复用器,--enable-muxer=NAME 启用某一个复用器。

由于 默认的编译会给 ffmpeg.exe 加上很多的编/解码器跟解/复用器,在嵌入式设备上为了使程序体积更小,可以采用此种方法。

其他的 滤镜,协议,也可以如此裁剪。

11,--enable-libx264,启用 x264 作为 h.264 的编解码器。

12,--enable-libx265,启用 x265 作为 h.265 的编解码器。


13,--cc=CC 指定 C 程序的编译器。

14,--cxx=CXX 指定 C++ 的编译器。

15,--ld=LD 指定链接器。

16,--extra-cflags,传递 标识选项 给 C 编译器。

17,--extra-cxxflags,传递 标识选项 给 C++ 编译器。

18, --extra-ldflags,传递 标识选项 给 LD 链接器。

19, --extra-ldexeflags,生成 exe 的时候传递给 链接器 的 选项。

20, --extra-ldsoflags,生成 so 动态库的时候传递给 链接器 的 选项。

21,--extra-libs,指定额外的库,实际上就是往链接器加 选项。


22,--env="ENV=override" 这个是最重要的,可以覆盖环境变量。

23,--custom-allocator,自定义内存分配器,可以把 malloc 换成jemalloc 之类的。


写在最后,所有的选项 在 configure --help 里面都可以看到,而且有一些注释讲解,比较容易看懂。


推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:

Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/56820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计springboot小区物业管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

现金储备超400亿的小鹏,进入中途蓄力时刻

作者 | 刘洪 编辑 | Bruce造车新势力正在变得更加成熟。 11月30日美股盘前,小鹏汽车发布2022年Q3财报。如果说第一季度盈利曙光初现,第二季度逆势增长,那么第三季度,就是一次中途蓄力。 报告期内,小鹏的净亏损环比收窄…

Seata的这些安保机制是否会让你更放心

一、背景 SpringBoot 项目,通过引入seata-spring-boot-starter来接入 Seata,Seata 的能力会通过 SpringBoot 的自动装配机制来引入。在学习的时候是梳理有什么强大的、科技感十足的能力,但在试点的时候则更多考虑的是有哪些安保机制&#xf…

将内网网站发布上线【免服务器】

什么是cpolar? cpolar是一个非常强大的内网穿透工具,开发调试的必备利器。 它可以将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口,使得公网用户可以轻松访问您的内网服务器,无需部署至公网服务器。支持永久免费使…

Mysql进阶学习(七)联合查询与DML语言

Mysql进阶学习(七)联合查询与DML语言进阶9:联合查询语法:特点:★案例DML语言1、插入语句1.1.插入的值的类型要与列的类型一致或兼容1.2.不可以为null的列必须插入值。可以为null的列如何插入值?1.3.列的顺序…

机械转码日记【26】二叉搜索树

目录 前言 1.二叉搜索数的概念 2.二叉搜索树的实现 2.1 基本架构 2.2二叉搜索树的插入 2.2.1普通版本 2.2.2递归版本 2.3二叉搜索树的查找 2.3.1普通版本 2.3.2递归版本 2.4二叉搜索树的删除 2.4.1普通版本代码 2.4.2递归版本代码 2.5搜索树的析构函数 2.6搜…

电脑黑屏按什么键恢复?只需要3个键就可以解决黑屏

今天和大家聊一聊电脑黑屏这个问题。相信大家都遇到过电脑黑屏,但是却不知道该如何解决,今天就来给大家分享一些处理方法。如果是电脑黑屏的话,一般情况下,只需要三个键就可以解决问题,电脑黑屏按什么键恢复&#xff1…

【Matplotlib绘制图像大全】(九):Matplotlib使用xticks()修改x轴刻度位置信息

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

提到Canvas,必须好好唠唠它的图像操作能力

前情提要 接续一下之前对Canvas的探索。本篇分享一下对图像操作的阅读和研究。 日常开发中,时常遇到对图像的处理的场景。精美的图像做为背景或者场景,相对会吸引人。 Canvas图像API十分强大。可以通过Canvas图像API加载图像数据,进行裁剪…

ubuntu篇---ubuntu安装mysql教程

ubuntu篇---ubuntu安装mysql教程一. 首先卸载掉原来的mysql第一步,依次执行下面的语句第2步 清理残留数据第三步 验证原有主机上是否安装mysql:二. 安装mysql三. 修改密码加粗样式ubuntu安装mysql教程 一. 首先卸载掉原来的mysql 第一步,依…

深入理解蓝牙BLE之“扩展广播”

目录 前言: 4.2版本广播: 5.0版本广播: 实现原理: 格式定义: 广播事件类型: 扩展广播: 周期广播: 广播集: HCI接口定义: 4.2版本: 5.…

正式练习的第一个Python功能:加法计算

我本身有着C/C的功底,最近开始自学python,包括网上找教程,买书看。不确定我这种有其他编程语言经验的再学新的语言算不算零基础,总之书就买的《零基础学Python程序设计》。鉴于自己之前已经看过一段时间,这个程序也就不…

[附源码]Python计算机毕业设计SSM开放实验室管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.3 容器命令介绍

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.3 容器命令介绍10.3.1 容器相关命令10 使用Docker 10.3 …

一类综合的模糊化自适应滑模控制

目录 前言 1.系统描述 2.控制器设计 3.模糊化设计 3.1构造模糊系统 3.2自适应律设计 4仿真分析 4.1仿真系统 4.2仿真结果 前言 上几篇文章分别介绍了模糊化切换增益(也就是模糊化外界扰动d)、模糊化系统部分的不确定项f、模糊化整个切换项,其原理分别为利…

如何制作gif图片?

文章目录一、下载LICEcap【制作gif的工具】(按步骤安装即可)二、LICEcap的使用录制步骤:三、录制的gif效果展示一、下载LICEcap【制作gif的工具】(按步骤安装即可) LICEcap是一款简洁易用的动画屏幕录制软件&#xff…

HTML CSS大学生期末网页大作业 DW个人网页设计 人物介绍 历史人物岳飞介绍

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

智慧工地技术方案

二、 系统概述 建筑工地是一个安全事故多发的场所。目前,工程建设规模不断扩大,工艺流程纷繁复杂,如何完善现场施工现场管理,控制事故发生频率,保障文明施工一直是施工企业、政府管理部门关注的焦点。尤其随着社会的…

Elasticsearch_第3章_ elasticsearch_进阶

Elasticsearch_第3章_ elasticsearch_进阶 文章目录Elasticsearch_第3章_ elasticsearch_进阶0.学习目标1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法1.2.5.小结1.3.RestAPI实现聚合1.3.1.API语法1.…

Redis数据结构

一.NoSQL 1.认识NoSQL 关系型数据库:结构化(有很多约束),关联的(数据库会自己维护数据之间的关联,如外键),SQL查询(语法统一),满足事务ACID的特性…