编译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 配置管理员会话安全的备注

    禁用密码确定. Confluence 安装使用自定义授权机制有可能会在密码校验的时候遇到问题.如果必要的话,你可以设置 password.confirmation.disabled 系统属性来禁用密码 ...

  2. Confluence 6 查看索引和提示

    查看索引 Confluence 使用被称为 Lucene 的搜索引擎.如果你希望在你的 Confluence站点中查看更多有关索引的细节,你可以下载并且运行 Luke.Luke 是一个开发和诊断工具, ...

  3. Confluence 6 与其他应用整合

    你可以使用 应用链接(Application Links)将 Confluence 与其他应用进行整合.应用链接允许你连接 Confluence 到其他的应用,例如 JIRA 软件或者 JIRA 服务 ...

  4. day10 函数

    函数基础 函数概念 为什么用函数 什么是函数 定义函数 调用函数 返回值详解上节回顾 文件处理 修改文件 1.读取要修改文件内容 read可能导致内存溢出 赋值给变量 修改 将修改后的内容重新写入文件 ...

  5. BeautifulSoup的基本操作

    >>> from bs4 import BeautifulSoup   #导入 >>> soup = BeautifulSoup(url.content," ...

  6. Nginx详解十一:Nginx场景实践篇之Nginx缓存

    浏览器缓存: HTTP协议定义的缓存机制(如:Expires.Cache-control等) 当浏览器第一次请求的时候,浏览器是没有缓存的 第二次请求开始就有缓存了 校验过期机制 配置语法-expir ...

  7. Java 9 中的 9 个新特性你知道吗

    摘要: Java 8 发布三年多之后,即将快到2017年7月下一个版本发布的日期了. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 J ...

  8. Unet 项目部分代码学习

    github地址:https://github.com/orobix/retina-unet 主程序: ################################################ ...

  9. CentOS 6.9 NFS安装和配置

    1.安装依赖包 yum install nfs-utils rpcbind -y 2.开机启动 chkconfig rpcbind on chkconfig nfs on 3.创建一个共享目录和加权限 ...

  10. HTTP max-age与Expires的分别

    主要重点在于我们要明白一个相对(Expires)一个绝对(max-age). 分别 max-agemax-age是HTTP/1.1中,他是指我们的web中的文件被用户访问(请求)后的存活时间,是个相对 ...