FFmpeg的makefile逻辑分析

ffmpegDemo ffmpeg 编写了几个类,希望对新学者有所帮助 立即下载

ffmpeg编译

在开始分析之前,讲一个 makefile 的调试技巧,推荐阅读《如何调试MAKEFILE变量》

make -f Makefile -f vars.mk HOSTPROGS
这里我对 vars.mk 做了点修改,因为源 vars.mk 没处理特殊字符,直接 echo 会报错。ffmpeg 的 makefile 的变量有很多特殊字符。我用了 warning 来输出,就不会报错。vars.mk 下载地址:百度网盘,提取码:i59d
 

先来看 FFmpeg 根目录的 makefile 的代码,如下:

 上图中的 vpath 是定义搜索目录,因为你可以在其他目录执行 configure 文件,那样 SRC_PATH 变量就不是 ./ 当前目录了。

FFLIBS-$(CONFIG_AVRESAMPLE) += avresample
这些 CONFIG_AVRESAMPLE 之类额变量都是 yes 或者 no,他就是用 yes/no 来控制要不要某些库或者组件。而这些 yes/no 的变量 是 configure 脚本输出的。

下面的代码 是 检测 configure 有没执行,这个是这样的,configure会 生成 ffbuild/.config 文件,如果你改了 FFmpeg 里面的代码,代码文件就会比 .config 文件更新,如果你不执行 configure , 直接 make ,就会报错。

config.h: ffbuild/.config
ffbuild/.config: $(CONFIGURABLE_COMPONENTS)
    @-tput bold 2>/dev/null
    @-printf '\nWARNING: $(?) newer than config.h, rerun configure\n\n'
    @-tput sgr0 2>/dev/null

到这里,我决定不再一行一行代码解析 FFmpeg 项目的 makefile,因为 FFmpeg 的 makefile 代码比较多,而且初学者,通常你不需要看完全部的 makefile 才能改二次开发。

之前说过,8 千行 configure 最后也只是往编译器,链接器传递了一些参数,这些参数就被定义在 config.mak 文件里面,如下:

 FFmpeg 的 makefile 比较分散,根目录有一个 makefile,各个库目录也有一个 makefile。库目录的 makefile 是通过 DOSUBDIR 函数 包含进来的,如下: 

上图代码中,定义了 DOSUBDIR 函数,然后遍历 FFLIBS 数组变量 来调用,FFLIBS 就是 FFmpeg 的那 8个库。

因此,FFmpeg 项目根目录有一个主的 makefile (MAIN_MAKEFILE),然后各个子目录都有一个各自的 makefile,代码量有点多。但是我们比较常用的只有 4个 知识点。

提示:makefile 也只是一个构建工具,他最后也是调 gcc 来执行编译。

 因此,FFmpeg 项目根目录有一个主的 makefile (MAIN_MAKEFILE),然后各个子目录都有一个各自的 makefile,代码量有点多。但是我们比较常用的只有 4个 知识点。

提示:makefile 也只是一个构建工具,他最后也是调 gcc 来执行编译。

makefile 里面,我们比较常用的有 4个 知识点。

1,第一个 target 是什么,在哪里定义的?

makefile 的规则是,执行 make 命令的时候要指定一个 target,就是要编译哪个目标,如果不指定,就是编译 makefile 文件里面的第一个目标,第一个 target 也叫默认target。那 FFmpeg 的默认目标是什么?如下:

从上图可以看出,默认 target 是 all,因此,我们在编译 FFmpeg 的之后,执行 make 还是 make all ,效果是一样的。

2, .c 文件 编译成 .o 文件的规则在哪里?

我们知道,在编译阶段,各个 .c 文件都是独立编译的。而 makefile 也是调 gcc 来编译,那是在哪里调的 gcc 呢?

这些规则在 common.mak 文件里面,如下:

COMPILE_C 是一个函数调用,如下:

这里提醒一下,所有的子目录,所有的 .c 文件编译都是这个规则。这是通用的。也就是说,ffmpeg.c,ffplay.c 文件也是这一个规则。

我们现在来测试一下 是不是这一个规则,看下 ffplay.c 是不是在这里编译的。我们加个东西,如下:

我加了一个无意义的选项 -num666 在后面。然后用 make -n > t33.txt 来查看命令,-n 代表不执行编译只打印信息。如下:

果然,因此所有 的 .c 文件都是在 common.mak 文件里面定义编译规则的。

3,生成 FFmpeg 8个 动态库的规则在哪里?FFmpeg 里面提供了 8 个库给开发者使用,这些库可以通过打包形成静态库,或者通过链接器来生成动态库。那这些生成静态库,动态库的规则在哪里呢?

以 libavcodec 库为例,libavcodec 目录的 makefile 里面的代码主要有3个重要的变量,HEADERS,OBJS,OBJS-YES,如下:

上面的 OBJ-YES 变量有 x264 的 .o 文件,x264 应该是以动态库或者静态库的方式引用的,这里为什么直接填 .o ,我也不太清楚,后面补充,暂时不管。

上面 allcodecs.o 等等 这些 .o 后缀的文件是目标文件,这些目标文件肯定要传递给 ar 命令打包成静态库,或者传递给 gcc链接器 生成动态库,那在哪里使用这个 OBJS 变量的呢?

在 library.mak 里面,如下:

 这里我必须说一下,library.mak 里面的变量 OBJS, SUBDIR 跟 NAME 等等变量是从其他文件引入的,而且每次循环引入的变量值都不一样,循环发生在 DOSUBDIR 函数里面,如下:

FFmpeg 的各个库里面的 makefile 文件定义了 OBJS 变量,然后 被 library.mak 使用。实际上我个人觉得 makefile 的语法变量有点乱,不太容易确定是局部变量还是全局,反正逻辑就是我上面说的那样。

现在我们已经找到了 在哪里生成动态库的了,就是 library.mak 文件 51 行的地方,我讲一下我怎么找到这个地方,我是直接搜 SHFLAGS 变量的,因为这是动态库的 flags。

现在加一些调试代码,来确认是不是在这个 地方生成 libavcodec.so 文件的,添加的代码,加了个 -num77 如下:

提示:之前 configure 的时候要使用 --enable-shared,然后才会执行到这条 动态库的 makefile 规则。

执行命令 make -n > t5.txt ,可以看到选项 -num777 加上去了,如下:

可以看到生成 libavcodec.so 依赖的 .o 文件太多了,非常多。

现在来找一下,把 .o 文件打包成 静态库的规则在哪里,猜测静态库跟动态库的规则是同一个文件的。 所以直接 在 library.mak 里面搜索 AR ,因为 config.mak 就是用 AR 这个变量来打包的。

AR 变量 在 Windows 系统是 lib.exe ,在 Linux 系统是 ar 命令,

library.mak 里面生成静态库的代码如下:
 

这时候,我们一定要 重新 configure ,不要加 --enable-shared,这样这条规则才会执行到。他是有其他地方控制 生成动态库还是静态库的,make 只会生成静态库或者动态库,只能二选一。不过层层的 target 依赖找起来太麻烦了,初学者也不需要知道这个。只要知道 静态库,动态库的 makefile 规则在哪里就行。

执行命令 make -n > t6.txt ,可以看到选项 -num88 加上去了,如下:
 

4,生成 ffmpeg.exe ,ffplay.exe 的规则在哪里?

ffmpeg.exe 实际上也是调 那 8 个库实现的,ffmpeg.exe 相关的代码在 fftools 目录里面,ffmpeg.exe 相关的代码只有几个文件,如下:

ffmpeg.c,ffmpeg_opt.c ,cmdutils.c,ffmpeg_filter.c,ffmpeg_hw.c,ffmpeg_qsv.c ,ffmpeg_videotoolbox.c

后面的 ffmpeg_qsv.c 跟ffmpeg_videotoolbox.c 文件不是必须的,是可选的。也就是 生成 ffmpeg.exe 只需要 5个 C 文件。这 5个文件加起来只有 1万多行代码。

看完 这 1万多行代码,就能学会使用 FFmpeg API 函数了,是不是很简单。

回到 原来的问题。生成 ffmpeg.exe 的 makefile 规则在哪里?这个问题实际上要分析 fftools 目录的 makefile 文件。如下:

上面的代码有两个重点, AVPROGS 跟 OBJS-ffmpeg,生成 ffmpeg.exe 应该会用到这两个变量,只有搜索这两个变量应该就能找到。

我试了一下,根据 AVPROGS 跟 OBJS-ffmpeg找,有点麻烦,还是直接 搜 _g 就行 因为 FFmpeg 项目是生成 ffmpeg_g.exe,再生成 ffmpeg.exe 的,

生成 ffmpeg_g.exe 的规则 在根目录的 makefile 里面,如下:
 

上图用的是 % 模糊匹配所有的有 _g 的文件。 还是老套路,我们在 后面加个 -num999 ,执行 make -n 之后如下:

 从上图可以看出,有 3个 num999 。证明我们找的地方是对的。

还有一个问题,上面的第 123 行代码, %$(PROGSSUF)_g$(EXESUF): $(FF_DEP_LIBS) ,_g 的规则是一个 target,target 要执行,肯定要被依赖,我们再找一下 这个 _g 在哪里被依赖了。实际上依赖代码就在附近,如下:

上面的规则实际上就是 ffmpeg.exe 依赖 ffmpeg_g.exe ,所以依赖 _g 的地方找到了。我们看到这个地方干了什么,可以看到 用了 strip,再看回去上面的打印日志,有一个关键的地方,如下:

strip -o ffmpeg ffmpeg_g
原来 ffmpeg_g.exe 就是带调试信息的可执行文件,而 ffmpeg.exe 是经过 strip 去掉调试信息的可执行文件。

提示:我为什么加 exe,其实 Linux 环境是没有 exe 后缀,但是为了区分我是在说 ffmpeg 可执行文件,还是指 FFmpeg 整个项目,所以我加了 exe。

至此,FFmpeg 项目里面比较常用的 makefile 知识,你已经掌握。后面就让我们二次开发 FFmpeg,加一个自己程序进去。FFmpeg 项目默认有 3 个程序 ffmpeg.exe ,ffplay.exe ,ffprobe.exe 。我们新加的程序就叫 loken.exe。
 

Himall商城ExpressDaDaHelper 取消订单(线上环境) 阅读详情

相关推荐

Innovus Function ECO实战:5步搞定数字后端设计中的网表修正(含Calibre LVS验证技巧)

本文提供了一份完整的Innovus Function ECO实战指南,详细解析了数字后端设计中网表修正的五步流程。从理解Function ECO概念、准备关键文件,到在Innovus中执行逻辑比对、自动布线及GUI检查,并重点攻克了ECO后Calibre LVS验证的难点与调试技巧,帮助工程师高效、精准地完成流片前的设计微调。

day7的博客 949

ffmpeg-makefile编译分析

1,请看下面代码,他这些 规则,command 里面只有一个 $(COMPILE_MMI) ,后面没有接上文件名,看上去不知道要编译什么文件,实际上,要编译的文件名就在 $(COMPILE_MMI) 变量里面,通过上面的 % 匹配到的字符,传递进去给 $(COMPILE_MMI) ,可以把 $(COMPILE_MMI) 打印出来,就能知道具体逻辑。是最重要的一个文件,他就是 make 命令的入口,你可以理解为 main() 函数入口函数,第一个 编译命令就是从这里运行的,具体流程是怎样的?

u012117034的博客 1607

python DEA: 基于非径向距离NDDF的Malmquist-Luenberger 指数及其分解

点赞发Nature 关注中Science Malmquist-Lenberger指数(ML指数)是距离函数与DEA计算中常用的指数,ML指数可以进一步分解为技术进步technological progress和效率改善effeciency change. 技术进步常被当做增长模型中的全要素生产率,用到许多计量经济研究中,探讨影响技术进步的环境变量。这里我分享一个考虑非期望产出下的NDDF方法计算ML指数。 该ML指数为global ML(区别于sequential ML) import numpy as

Cmmmmm丶的博客 5297

FFmpeg之Makefile流程分析

FFmpeg之Makefile流程分析

Lorien Zhang的博客 658

SpringCloud2025+SpringBoot3.5.0+gateway+webflux子服务路由报503

本来昨天就应该也记录下,免得忘记的,但是有点晚了,酒没写,真的是被坑惨了。当然这也是追求最新的代价,也是对新技术、老知识点的重温。依赖更粒度让架构的知识面更高,需要非常清楚另外说不定是有新的负载均衡要出现了,就想当初loadbalancer取代Ribbon一样好了,真是坑了半夜,昨晚都没有写,今天才复盘,希望能帮到大家,让更多在坑里的技术人爬出来。

zwrlj527的专栏 1998

hcaptcha无感验证码逆向实战:从接口分析到环境补全

本文详细解析了hcaptcha无感验证码的逆向实战过程。通过分析核心接口与加密逻辑,重点介绍了采用环境补全策略来模拟真实浏览器环境,从而绕过验证码检测。文章提供了从接口抓包、剖析hsw.js加密核心到使用Node.js搭建模拟环境的完整步骤,为自动化操作提供了一种稳健的解决方案。

weixin_29324401的博客 1155

FFmpeg源码学习笔记:Makefile是怎么组织编译过程的

本文记录了FFmpeg源码中Makefile的几个关键点,尝试跟着源码学习Makefile的写法。

SannyWoods的备忘录 1879

手把手教你用smarteye搭建免费GB28181监控平台(含海康设备接入避坑指南)

本文提供了一份基于SmartEye搭建免费GB28181视频监控平台的实战指南。详细介绍了从服务器部署、GB28181协议核心配置,到海康威视等主流设备接入的完整流程,并重点分享了设备注册失败、无法预览等常见问题的深度排错方法,旨在帮助中小企业及开发者低成本实现多品牌监控设备的统一管理。

pz89012345的博客 326

FFmpeg源代码简单分析:makefile

本文记录FFmpeg的Makefile的源代码。Makefile用于编译FFmpeg的源代码。通过分析Makefile文件,可以了解FFmpeg的源代码生成的流程。有关Makefile这部分我本身基础不算很牢,很多地方还在慢慢摸索,所以分析的内容不能保证完全准确。以后有时间和其他朋友多交流再慢慢完善这篇文章。注:make有一个很有用的命令:“make -n”。该选项会显示命令,但不会执行命令,十分

雷霄骅(leixiaohua1020)的专栏 4万+

Lumerical INTERCONNECT 中的自相位调制 (SPM) 仿真实践指南

本文详细介绍了在Lumerical INTERCONNECT中进行自相位调制(SPM)仿真的实践指南。从SPM的基础物理原理出发,深入解析非线性薛定谔方程和克尔效应,到INTERCONNECT中NLSE波导元件的配置技巧,以及时域与频域中SPM效应的观测方法。文章还提供了常见问题排查和进阶联合仿真技巧,帮助用户高效完成从仿真到实测的校准过程。

weixin_42565652的博客 187

013 PID参数整定:Ziegler-Nichols法

几年前在调试一台伺服压机,客户要求位置精度±0.01mm,响应时间小于50ms。我按照教科书上的经验值设了P=1.5,I=0.02,D=0.01,结果电机一启动就开始尖叫,位置超调直接干到0.3mm,然后开始震荡,像极了喝醉的舞者。现场工程师看我的眼神,就像在看一个刚毕业的实习生。那次之后我明白了一个道理:PID参数不是靠猜的,也不是靠经验公式硬套的。你需要一个系统的方法,而Ziegler-Nichols法就是那个让你从“瞎调”走向“有章可循”的起点。

m0_50546716的博客 101

FFmpeg,Fplay,clion调试环境搭建

本系列 以 ffmpeg4.4 源码为准。本文主要讲解如何搭建 ffplay 的CLion调试环境。 ffmpeg 在 Linux 环境下更好调试。 本文系统是 Ubuntu 18,首先下载 FFmpeg-n4.4.1.zip ,虽然 FFmpeg 是通过 makefile 编译的,但是还是可以用Clion来调试,比 gdb 更直观一些。CLion 目前的最新版本比较完善,早几年我用的时候,调试好像必须提供 CMakeList 文件,现在只有 makefile 文件也能用 Clion 调试了。 操作..

u012117034的博客 2221

第二大脑的觉醒:一个寄生在代码里的小生命,如何悄无声息地接管我的工作流

所有记忆都存在本地。

步子哥的博客 1064

SRS4.0源码分析-makefile

本文采用的 SRS 版本是 4.0-b8 , 下载地址:github makefile语法请看《跟我一起写Makefile》,SRS 的makefile是configureshell 脚本生成的。 为了方便读者对着代码行数,我的 makefile 下载地址,百度网盘,提取码:5n9w 虽然makefile是代码生成的,但是并没有做太多的封装,抽象,所以还是比较容易阅读的。 SRS 的makefile总共 150 行左右,依赖非常清晰。 开始分析 makefile 。 因为...

u012117034的博客 2581

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

FFmpeg二次开发

本文主要讲解 FFmpeg 的二次开发,ffmpeg.exe 的命令行功能特别强大,很多需求都能直接用命令行实现,但是总有一些需求用 命令行实现不太好做。而你实现那些特殊需求,通常需要把 ffmpeg.exe 里面的某部分代码抄过来,本文讲的主要就是如何抄代码。

u012117034的博客 4180

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。

iOS 的app项目入口进入,如何在不重新编译ffmpeg的情况下添加断点调试ffmpeg源码

Dream_Dynasty的博客 1570

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

极速优化:ffmpeg.wasm多环境编译配置全攻略

你是否还在为WebAssembly(WASM)版本的FFmpeg编译配置头痛?不同环境下的性能差异、单线程与多线程的取舍、开发与生产环境的参数调优——这些问题都将在本文中得到一站式解决。读完本文,你将掌握ffmpeg.wasm的编译选项管理技巧,轻松应对从开发调试到生产部署的全流程需求。 ## 编译系统架构概览 ffmpeg.wasm的编译系统基于Makefile和Docker构建流程,通过分...

gitblog_01106的博客 575

makefile编译一个工程碰到的问题(仅做为记录,没有逻辑)

编译知识太差导致我在这个问题浪费了好多时间,是因为我生成的库名字是libDecoderFFMPEGLive.so.1.0.0.7,我以为这样也能识别到......,想了好久,最后面突然开悟,将libDecoderFFMPEGLive.so.1.0.0.7重命名为libDecoderFFMPEGLive.so解决问题,当然也可以加软链接。四、下面的函数都是在libavcodec中的,libDecoderFFMPEGLive.so明明加了-lavcodec选项,还是U(未定义),好奇怪。

想挣五斗米的博客 1321

SRS4.0源码分析-configure

本文采用的 SRS 版本是 4.0-b8 , 下载地址:github SRS4.0源码分析-CMake讲了 SRS 在Clion里面的调试 中使用的CMake 的逻辑。但是实际编译的时候,通常 使用 configure 跟 makefile。 对于一个 开源项目来说,理解了 configure 跟 makefile ,基本上就理解了这个开源项目的50%。 何时阅读 configure 跟 makefile ?这个问题不好说,我看开源项目,有时候是调试,理解完他的大部分代码逻辑,才开始看 conf...

u012117034的博客 1379

将ffmpeg改造成一个可以链接的library

一、事件起因: 最近有个项目,需要搞音频格式转换,需要满足一下功能: 1. amr wav 2. amr mp3 3. 已接口加动态库的形式提供上面1和2的功能 在网上搜索了很久,没有找到合适的library。 在找的过程中发现ffmpeg能实现1和2的功能,但是它不满足3的功能,所以有了将ffmpeg改造成library。 二、改造的步骤: 1. 提取必要的参

手边笔记 1941

untrunc与ffmpeg集成指南:兼容新版ffmpeg的最佳实践

📹 **untrunc** 是一个强大的视频修复工具,专门用于恢复损坏的MP4、MOV、3GP等视频文件。通过与**FFmpeg**深度集成,untrunc能够高效解析视频编码数据,实现精准的视频恢复。本文将为您详细介绍如何将untrunc与不同版本的FFmpeg完美集成,确保最佳的兼容性和修复效果。 ## 🔧 为什么需要关注FFmpeg版本兼容性 FFmpeg作为多媒体处理的核心库,不同

gitblog_01119的博客 451

FFmpeg录制程序跨平台架构

本文分析了基于FFmpeg的音视频录制程序,从系统架构到具体实现。主要内容包括: 系统架构分析 采用分层设计,包含Linux内核层、FFmpeg库层和应用程序层 内核处理文件I/O和设备驱动,FFmpeg负责媒体封装编解码 应用程序通过清晰接口调用FFmpeg功能 核心数据流 视频数据:H.264帧经分析、封装后写入文件 音频数据:AAC帧经格式转换后交错写入 详细追踪了从用户空间到内核磁盘写入的全过程 关键设计特点 高内聚低耦合架构 生产者-消费者模式处理音视频流 完善的错误处理和资源管理 应用场景 适用

zhilin_tang的专栏 737

FFmpeg video filter FATE测试过程介绍

FATE (FFmpeg Automated Testing Environment) 是FFmpeg社区开发的自动化测试框架,支持对FFmpeg API的测试,也支持对FFmpeg内部函数的测试。对FFmpeg video filter的测试,就属于对API的测试。之前为了为一个video filter增加fate测试,大概研究了一下,感觉FFmpeg官方主页的资料还可以更详细,在酝酿写一篇介绍...

那遁去的一 1913

Folia 全屏歌词动画播放器下载安装与首次跑通指南:10 分钟装好桌面版

Folia 是把歌词渲染成全屏动画的桌面播放器,覆盖 Windows、macOS、Linux,音源含网易云、QQ 音乐、酷狗、Navidrome 与本地音乐库。这篇 Folia 下载安装指南讲清从拿包到验证的四步流程,读完约 10 分钟装好桌面版。 ## 先看结果 [![Folia 下载安装指南全屏歌词动画效果](https://raw.gitcode.com/GitHub_Trending/

gitblog_00248的博客 452
上一篇: 【视频直播技术干货】H.264编码下直播视频添加水印的优化
下一篇: linux内存管理之malloc、kmalloc、kzalloc、vmalloc的区别
江太翁
博客等级 码龄15年 271粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值