编译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的更多相关文章

  1. 多媒体开发(4):在视频上显示文字或图片--ffmpeg命令

    小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗? 小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令: ffmpeg -i 小白.flv -vcodec copy -a ...

  2. tomcat开发远程调试端口以及利用eclipse进行远程调试

    一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...

  3. [Tools] 多媒体视频处理工具FFmpeg

    FFMpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/ ...

  4. 使用 VS2015 编译并调试 ffmpeg

    导读 ffmpeg 是音频处理方面非常强大非常有名的开源项目了,然而如 雷神 所说,“FFMPEG 难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大, ...

  5. 使用VS Code 从零开始开发并调试.NET Core 应用程序

    最新文章:http://www.cnblogs.com/linezero/p/VSCodeNETCore.html 使用VS Code 从零开始开发并调试.NET Core 应用程序,C#调试. 上一 ...

  6. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

  7. 用eclipse开发和调试postgresql-8.4.1

    按照书本<PostgreSQL数据库内核分析>根据第一章讲解的linux下,编译 安装:不同的是libreadline5-dev版本没有了,就用新的版本代替:我的ubuntu 14 所以必 ...

  8. 在Windows下利用Eclipse调试FFmpeg

    目录 [隐藏]  1 环境与软件 2 第一步:安装MinGW 3 第二步:配置编译环境 4 第三步:配置SDL 5 第四步:编译 5.1 编译faac 5.2 编译fdk-aac 5.3 编译x264 ...

  9. 在CentOS下利用Eclipse调试FFmpeg

    所需软件 64位软件打包下载链接:http://pan.baidu.com/s/1i3B08Up 密码:o50u https://yunpan.cn/cBKDSbrGDgBvz  访问密码 1f55 ...

随机推荐

  1. Confluence 6 如何备份和恢复

    如何备份 有关备份你数据库使用的命令与你使用的具体数据库有关,例如针对 PostgreSQL 数据库,备份命令为 pg_dump dbname > outfile. 你应该针对你使用的数据库不同 ...

  2. index_select ,clamp,detach

    1.torch.clamp(input,min,max,out=None)-> Tensor 将input中的元素限制在[min,max]范围内并返回一个Tensor 2.index_selec ...

  3. IP的计算

    IP的计算 时间限制: 1 Sec  内存限制: 32 MB 位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192 ...

  4. C++ 关闭显示器

    好困,想躺一下,关灯.上床,笔记本的屏幕还亮着,好刺眼,睡不着! 脑子里出现一个疑问,怎么用C++写一个关闭屏幕的小程序呢? 参考了网上已有的例子,最简化: #include <windows. ...

  5. Jmeter 自动化测试报告扩展

    首先了解下生成测试报告的过程,我们看到的测试报告是由.jtl格式转换为.html,html报告的样式由extras目录下xsl文件决定.优化测试报告需要分为两部分内容,首先我们要优化输出的测试内容,其 ...

  6. 多版本python安装第三方库

    1.先进入对应版本的python 2.使用命令安装:./pip install xxx

  7. # 20165206 2017-2018-2 《Java程序设计》第4周学习总结

    20165206 2017-2018-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承:继承是一种由已有的类创建新类的机制. 子类和父类:由继承得到的类称为子类,被继承的类称 ...

  8. python requests 正则爬虫

    代码: import requests from multiprocessing import Pool from requests.exceptions import RequestExceptio ...

  9. C#正则Groups高级使用方法

    正则表达式号称开发者得瑞士军刀,使用好正则表达式尤其重要. 拆分多个正则: public static string[] SplitByManyRegex(string text, string[] ...

  10. echo的运行

    例子:编译.链接examples中的echo. 编译: g++ -c -I ~/build/release-install-cpp11/include echo.cc -std=c++11 g++ - ...