多媒体开发(8):调试FFmpeg
编译FFmpeg得到二进制文件,之后就是对二进制库的调用,这时FFmpeg就像一个黑盒子。作为程序员,难道不想研究一下FFmpeg的具体实现?比如是怎么拿到歌曲信息的、怎么解码的、怎么推流的,等等。
看源码是理解代码实现的一个办法,而单步调试能从另一个维度去帮到你。本文介绍如何单步调试FFmpeg的代码。
(一)为什么要调试
调试的好处,一来可以理解程序的执行流程,二来有助于定位问题。
相对于看源码,单步调试,可以看到数据的变化,会深刻很多,而且定位问题时也直观快速,读者甚至可以修改变量的值或下条件断点,充分发挥调试器的功能。
所以调试是理解代码与定位问题的有效办法。
(二)怎么调试
小程用的是mac机。先完成FFmpeg源码下载与编译的准备工作。
(0)下载FFmpeg源码
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
或者:
curl -0 http://ffmpeg.org/releases/ffmpeg-${VERSION}.tar.bz2
tar jxvf ffmpeg-${VERSION}.tar.bz2
VERSION设置为最新的ffmpeg版本号。
至于用什么工具来打开这些源码文件,读者应该考虑适合自己,而且适合看大型项目的工具,比如sourceinsight、sublime、vim、emacs、xcode、Android Studio之类。
(1)编译FFmpeg
编译要使用到编译器,在mac机上最简单的办法就是安装xcode了,这样保证编译器clang是存在的。
为了调试,这次的编译可以很简单,只要把优化选项去掉,再make即可:
make clean
./configure --disable-optimizations
make
configure是FFmpeg提供的配置脚本,用来生成Makefile跟config.h文件,Makefile在编译时使用,而config.h(里面各种宏的定义)被FFmpeg源码使用,也会影响到FFmpeg的功能裁剪。
对于configure的参数,读者也可以通过./configure --help来查看所有的选项,然后再找到关于优化的选项。
这里的make clean,是为了清一下之前的编译污染,如果之前没有编译过,那就不需要执行。
另外,如果make之后,再执行make install,就会把FFmpeg安装到mac系统。对于调试来说这个是不必要的,只要make出二进制库就好了。
成功编译后,可以看这几个文件:

(2)用gdb调试FFmpeg
对于喜欢用命令行的读者,使用gdb或lldb来进行调试是不错的选择。
在使用gdb前,需要安装并给gdb签名,如果读者还没有准备好gdb,并且有兴趣使用gdb的话,可以阅读分割线以内的内容,这里面也包括了gdb常用的命令。
安装gdb:
brew install homebrew/dupes/gdb
对gdb授权,参照:https://blog.csdn.net/cairo123/article/details/52054280
写一个测试的例子:
touch gdbtest.c:
int main() {
int a = 10;
printf("%d\n");
}
编译:
gcc -o gdbtest gdbtest.c -g
注意须带-g,以生成符号dSYM文件。
然后就可以调试了,常用命令有这些:
gdb gdbtest --加载可执行程序
r --run,运行,可以带参数
i b --info break,断点信息
b 3 --break 3,第3行下断点
b main --main函数第一行下断点
b other_c:fun1 --文件other_c的fun1函数第一行下断点
b 120 --在120行下断点
clear --删除所有断点
d 3 --delete 3,删除断点3
disable 1 --禁用断点1
enable 1 --启用断点1
s --step,跳进去
f --finish,跳出来
n --next,执行一行
n 3 --next 3,执行3行
c --continue,继续直至下一个断点或结束
p a --print a,输出变量a的值
list/l --查看代码
q/kill --退出本次调试
bt --查看调用堆栈
return --把当前函数return
为了便利,小程直接用FFmpeg的程序来切入调试(当然也可以写自己的代码来调用FFmpeg),比如可以选择ffplay_g这个程序来切入,调试它所依赖的基础即FFmpeg。
调试ffplay_g需要输入参数,在gdb ffplay_g后,r "xxx/file.mp3"即可,表示用ffplay_g来播放这个文件。
以下是小程使用gdb来简单调试的演示视频:

需要留意,带_g的是带有调试信息的程序,那是调试需要的。
(3)用xcode来调试FFmpeg
显然,使用gdb来调试,对于阅读代码或操作都不算太直观,这时,读者可以考虑用xcode来调试FFmpeg。
小程这里不介绍每个配置环节了,因为,读者可以参考以下这一篇图文并茂的文章,按步操作就可以了:
http://www.jianshu.com/p/226c19aa6e42
至此,已经介绍完怎么调试FFmpeg。
总结一下,本文介绍了如何在macos上调试FFmpeg的源码,包括使用gdb或xcode来调试的办法,同时也介绍了如何编译带有调试信息的FFmpeg。

多媒体开发(8):调试FFmpeg的更多相关文章
- 多媒体开发(4):在视频上显示文字或图片--ffmpeg命令
小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗? 小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令: ffmpeg -i 小白.flv -vcodec copy -a ...
- tomcat开发远程调试端口以及利用eclipse进行远程调试
一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...
- [Tools] 多媒体视频处理工具FFmpeg
FFMpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/ ...
- 使用 VS2015 编译并调试 ffmpeg
导读 ffmpeg 是音频处理方面非常强大非常有名的开源项目了,然而如 雷神 所说,“FFMPEG 难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大, ...
- 使用VS Code 从零开始开发并调试.NET Core 应用程序
最新文章:http://www.cnblogs.com/linezero/p/VSCodeNETCore.html 使用VS Code 从零开始开发并调试.NET Core 应用程序,C#调试. 上一 ...
- Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”
整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...
- 用eclipse开发和调试postgresql-8.4.1
按照书本<PostgreSQL数据库内核分析>根据第一章讲解的linux下,编译 安装:不同的是libreadline5-dev版本没有了,就用新的版本代替:我的ubuntu 14 所以必 ...
- 在Windows下利用Eclipse调试FFmpeg
目录 [隐藏] 1 环境与软件 2 第一步:安装MinGW 3 第二步:配置编译环境 4 第三步:配置SDL 5 第四步:编译 5.1 编译faac 5.2 编译fdk-aac 5.3 编译x264 ...
- 在CentOS下利用Eclipse调试FFmpeg
所需软件 64位软件打包下载链接:http://pan.baidu.com/s/1i3B08Up 密码:o50u https://yunpan.cn/cBKDSbrGDgBvz 访问密码 1f55 ...
随机推荐
- oracle数据库定时任务dbms_job的用法详解
本文来源:Ruthless <oracle数据库定时任务dbms_job的用法详解> 一.dbms_job涉及到的知识点 1.创建job: variable jobno number; ...
- 配置一个 Confluence 6 环境
本部分对你 Confluence 的外部设置进行描述.包括有如何配置 Web 服务器,应用服务器,目录和文件等信息—— Confluence 运行所需要的所有环境.有关在服务器内部对配置进行修改的内容 ...
- Confluence 6 白名单表达式类型
表达式类型 当添加一个 URL 到白名单列表中的时候,你可以选择采取下面的表达式进行添加. 域名名称(Domain name) 允许 URL 为一个指定的域名. http://www.example. ...
- 【sqli-labs】Less11~Less16
学习sqli-labs的笔记,前面的笔记内容比较详细.后面的只记录关键点了. Less11: POST注入, 有回显,有错误提示 从11题起是POST注入,发现有两个输入框.用firefox的F12查 ...
- tomcat安装出现的闪退问题
如果闪退 在该文件中结尾添加pause 可以检测到路径问题是不是有问题
- Python(文件操作实例)
给定一个文件:以及给定的字符,比如“a”; 统计字符个数:(可选) # 文件的打开操作f = open("wyl.txt","r")# 文件的读取操作conte ...
- Eciplce ALT+/失效的解决方法
最近公司电脑上的Eclipse没有了自动提示功能,也不是全部不提示,大多数情况下按下“alt+/”键还会产生提示,但是当我在java项目中邪main方法和syso的时候,“alt+/”则会失效,今天在 ...
- 一 time与datetime模块
时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(time.time())”,返回的是float类型. 格式化的时间字 ...
- SQLServer 表连接种类
SQLServer 有3种物理连接:Nested Loop(嵌套循环).Merge Join(合并联接).Hash Join(哈希联接). T-SQL中的inner/left/right/full j ...
- 【Leetcode | 5】求和问题
一.1两数之和 二.15三数之和 C++ Soution 1: class Solution { public: vector<vector<int>> threeSum(ve ...