用Ubuntu18与clion调试FFmpeg

简介: 用Ubuntu18与clion调试FFmpeg

FFmpeg 项目是由 C语言写的,C语言的跨平台性是比较差的,不同的平台有各自的线程API 以及一些各自的系统函数。因此 用 C 语言来实现跨平台是一件困难的事情。

但是 FFmpeg 克服了这个问题,FFmpeg 主要通过一个 shell 脚本 (configure),在编译之前检测当前的系统环境,生成一个用于当前系统的 config.h 头文件。

config.h 头文件 定义了非常多的宏,根据这些宏,引入不同的平台函数跟代码,以此实现跨平台。


在FFmpeg 支持的众多系统中,Ubuntu 的调试环境是最容易搭建的,所以本书先讲 Ubuntu 的环境搭建。

如果是刚接触 FFmpeg,希望学习 FFmpeg 的 API 使用,我个人建议,直接使用 Ubuntu18 + clion 环境即可。因为 ffmpeg.c 的逻辑在所有平台都是一样的,选一个最容易搭建的平台来了解 ffmpeg.c 的逻辑即可,ffmpeg.c 的 5 千行代码里面有所有 API 函数的使用方法。


下面开始搭建,先下个 VMware ,然后安装上 Ubuntu18 的系统,安装完成后,如下:

然后上 Github 下载 FFmpeg-n4.4.1.zip 代码,我放到 Document 目录下面,如下:

虽然 FFmpeg 是通过 makefile 编译的,但是还是可以用 clion 来调试,比 gdb 更直观一些。clion2021 的版本比较完善,早几年我用的时候,调试好像必须提供 CMakeLists.txt 文件,现在只有 makefile 文件也能用 clion 调试了。

先安装一些必要的软件:

# 安装以下软件。
apt-get install diffutils make pkg-config yasm
apt-get install libsdl2-2.0
apt-get install libsdl2-dev

开始执行 configure 脚本检测编译环境:

#创建目录
mkdir -p /home/ubuntu/ffmpeg/build64/
#进入 FFmpeg 源码目录
cd /home/ubuntu/Documents/FFmpeg-n4.4.1
#执行检测脚本
./configure \
--prefix=/home/ubuntu/ffmpeg/build64/ffmepg-4.4-ubuntu \
--enable-gpl \
--enable-nonfree \
--enable-debug=3 \
--disable-optimizations \
--disable-asm \
--disable-stripping

这里有三个重点要注意:

1,要编译出 ffplay 可执行文件,必须安装 sdl2

2,上面的 configure 不要开启动态库,静态库调试会方便很多。ffmpeg 4.4.1 你不加 --enable-shared 就是使用静态库编译。configure 的规则是静态库动态库只能二选一。

3,后面有好几个选项是开启 debug 模式,告诉编译器不要优化代码,因为有时候优化代码 会改变 代码原来的运行顺序,导致调试的时候跳转看起来很奇怪。

这是 编译器的优化技巧,改变代码原来的运行顺序是为了能让更多的指令能并行,最后运行的结果跟原来是一样的。指令级并行(Instruction-Level Parallelism)相关的技术可以看《深入理解计算机系统》第5章 跟 《计算机体系结构》第3章。


正式开始编译,执行以下命令,-j 参数可以指定编译线程数量,请选择合适的数量:

make -j16

到这里,FFmpeg 的编译就完成了,不需要执行 make install,因为不需要移动生成的二进制可执行文件到别的地方,我们直接用 clion 在项目目录进行调试。

现在 已经 编译生成 了 ffmpegffplay 可执行文件了,如下图:

现在就可以用 clion 来调试这个 ffmpeg_g 文件了,clion 也是调 gdb 来做这个事情的。

提醒:后面有 _g 的代表有调试符号,没有 _g 的是进行了 strip 操作,把调试信息去掉了,所以要选择 _g 后缀的可执行文件来调试。要不会无法进行断点调试


下载 clion2021,打开 FFmpeg-n4.4.1 目录,然后找到 根目录的 Makefile 文件,右键执行 "Load Makefile Project",如下图:

注意:不要执行 clean 操作,clean 会把之前编译的文件删掉。

提示2:如果没有 "Load Makefile Project" 选项可以选,请跳到文章后面查看解决方法。

如果 Load 失败,再执行多几次 Load 就可以了。 clion 有时候是有点抽风的。你 reload 多几次 makefile project。

执行完之后,就会看到 很多 编译目标 (target),,如下图:

上图中有很多 target,makefile 可以单独编译某个模块的target。但为了方便起见,我们选择 all ,全部编译。Makefile 有编译缓存,没修改的文件不会重新编译,所以 all 编译也没问题。

点击 "Edit Configurations " ,配置一些东西,如下:

walking-dead.mp4,下载地址:网盘


然后 ffmpeg 这个可执行文件的源代码是 fftools/ffmpeg.c ,直接找到这个 文件,在 main 函数打一个断点,点击右上角的小蟑螂,即可调试 ffmpeg 的整个转封装 转码过程。如下图:


下面讲一下 如何调试 ffplay 播放器,也是只需要改动一下 "Edit Configurations " 即可,如下:

ffplay 播放器的源码文件是 fftools/ffplay.c ,也是在 main 函数打个断点即可调试播放器的流程,如下图:


到这里 Ubuntu18 + clion2021 调试 FFmpeg 已经讲解完毕,最后补充一些 clion 的使用技巧。

上面的搭建过程,我们是右键用的 Load Makefile Project,有时候 clion 会出点问题,没有这个 "Load Makefile Project" 给你选,这种情况,你需要自己添加。

Makefile 类型的项目 在 clion 里面有两种 configuration (配置):Makefile TargetMakefile Application

可以这么理解 Makefile Target ,他就跟 在命令行 执行 make xxx 一样,xxx 是target,不填就是默认的,ffmpeg 默认的 target 是all。

Makefile Application 这个功能,就类似 在 命令行 执行 gdb ./ffplay 一样。Makefile Application 主要是 clion 调 gdb 来调试 Makefile Target 编译生成的文件。

因此 如果 clion 出问题,没有这个 "Load Makefile Project" 给你选,你需要先 添加 Makefile Target ,把下面这些信息填好,如下:

把 Makefile Target 信息填好之后,就需要添加 Makefile Application,把之前添加的 Makefile Target 绑定到 Makefile Application,这样 clion 就能调试项目了。


clion 调试的时候有一个 watch point 功能,也叫做 data breakpoint (数据断点),通过这个功能,你可以快速定位到哪些代码修改了某个变量。

例如我知道 avcodec_alloc_context3 会申请一个编码器内存,但是我不知道什么哪里设置了 pix_fmtwidthheight 之类的编码器信息,那我就可以在 avcodec_alloc_context3 的时候设置行数断点,然后 再针对 pix_fmt 设置一个 watch point ,如下:

生命周期请选择 Persistence,如下:

设置好 watch point 之后,让代码继续跑,碰到 修改 pix_fmt 的地方就会停下,如下:

从上面的函数调用栈,可以看到,是在 init_output_stream_encode 函数里面设置 编码器的 pix_fmt 的



相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
NoSQL IDE Java
使用CLion调试Redis源码的超详细步骤
因为我本人主要是写Java的,有强烈的IDE依赖症,不喜欢使用文本编辑器或者命令行这样的工具,所以选择使用CLion搭建一个IDE环境来辅助 Redis 源码阅读。
490 1
使用CLion调试Redis源码的超详细步骤
|
弹性计算 并行计算 NoSQL
Clion配置远程CUDA调试环境
在阿里云GPU ECS实例上搭建Remote CUDA开发环境,使用Jetbrains Clion作为Develop IDE。
723 1
Clion配置远程CUDA调试环境
|
Java 开发工具 数据安全/隐私保护
在Clion上调试LeetCode代码
在Clion上调试LeetCode代码
932 0
在Clion上调试LeetCode代码
|
关系型数据库 MySQL 开发工具
Mac下使用Clion调试MySQL版本5.7源码
Mac下使用Clion调试MySQL版本5.7源码
165 0
Mac下使用Clion调试MySQL版本5.7源码
|
关系型数据库 C++ iOS开发
【从入门到放弃-MySQL】CLion调试MySQL8.0源码
前言 想对的MySQL底层实现做一些了解,奈何没有用过C++不知道怎么调试一个大型项目,一日和大神交流时大神扔给我了一份《XCode调试MySQL8秘籍》。于是在几经波折(主要是因为菜)之后终于打开了MySQL的调试大门。
3145 0
|
编解码 开发工具 C++
VS2008+ffmpeg SDK3.2调试tutorial01
最近研究ffmpeg,在ubuntu下感觉不太好调试,老是找不到函数的声明。所以我就把他移到windows下用vs2008分析 关于环境的搭建,我参考了 http://hi.baidu.com/forever803/blog/item/ba90cdd2cca917093af3cf9e.html ,这里我把步骤整理一下,顺便奉上图文 第1步: 下载ffmpeg SDK3.2:点击下载,并解压。
1035 0
|
开发工具 C++
ffmpeg基础与编译_在VS2008下调试output_example.c(详细步骤)
注意:这个是编译Debug版本的。必要资源:FFMPEG SDK 3.2(已经编译好的,可以去http://www.bairuitech.com/html/ruanjianxiazai/ffmpeg/20080414/89.html下载)1.建立一个空的VC++工程  建立好之后,将FFMPEG SDK 3.2下的output_example.c文件拷贝至路径“%Project Dir%/%Project Name%/”下  其“%Project Dir%”为你所建立的工程的路径,“%Project Name%”为工程名。
1063 0
|
Android开发 C++ C语言
使用Eclipse对FFMpeg进行调试
在研究代码的过程中,调试运行是一种非常有效的方法。我们常用的Visual Studio建立的工程可以很方便地对程序进行调试运行。但是对于FFMpeg这样的工程,想要进行单步调试就没这么容易了。
1250 0
|
Linux Android开发 C++
linux + ffmpeg + eclipse 调试
使用linux + ffmpeg + eclipse调试步骤OS : ubuntu 12.04Eclipse : 3.7.2 为Eclipse安装cdt插件,使其支持c/c++ 导入ffmpeg项目 File —-> Import —-> c / c++ —-> Existing Co...
1119 0
|
3月前
|
存储 Ubuntu 开发工具
ffmpeg笔记(二)windows下和ubuntu-16.04下ffmpeg编译
ffmpeg笔记(二)windows下和ubuntu-16.04下ffmpeg编译