调试FFmpeg

来源:互联网 发布:老婆胸大的体验知乎 编辑:程序博客网 时间:2024/05/20 17:09

花满楼原创,转载须授权。


小白:约会完FFmpeg没多久,你就准备调戏它了?

花满楼:是调试!而且我之前已经讲了几节FFmpeg的组装车怎么开了,是时候看一看FFmpeg内部的代码是怎么执行的了。

本文解决一个问题:如何单步调试FFmpeg的代码。

(一)为什么要调试

调试的好处,一来可以理解程序的执行流程,二来有助于定位问题。

小白:这两个好处,看源码不是就可以了吗?

花满楼:的确是。但如果单步看数据的变化,会深刻很多,而且定位问题时也很直观快速,你甚至可以修改变量的值或下条件断点,充分发挥调试器的功能。

小白:那这就是更好的选择了。

(二)怎么调试

因为我用的是mac机,所以我介绍的是在macos系统上调试FFmpeg。

(0)下载FFmpeg源码

git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg或者: curl -0  http://ffmpeg.org/releases/ffmpeg-${VERSION}.tar.bz2tar jxvf ffmpeg-${VERSION}.tar.bz2VERSION设置为最新的ffmpeg版本号。 

小白:噢耶,终于下到这个伟大而巨大的源码了!可是,我怎么看这种源码啊?这么多文件!

花满楼:这个,是 软件基础的话题, 西门吹雪会专门讲这些东西的。我简单提一下,可以用soureinsight(+CrossOver)、sublime甚至vim或emacs来看这种项目,当然用xcode或AS也是不错的选择。

小白: 软件基础? 西门吹雪?

(1)编译FFmpeg

编译要使用到编译器,在mac机上最简单的办法就是安装xcode了,这样保证编译器clang是存在的。

小白:……安装xcode不简单好不好,几G的东西都要下载半天好不好?

花满楼:从这个角度来说,你对!但是,你单独下载clang,那也不小的。而且,如果使用xcode来调试FFmpeg,会直观很多,特别是对于你来说。

小白:欺负我是小白是吧?如果我不用xcode,还能不能调试FFmpeg了?

花满楼:当然可以,直接使用gdb或lldb都可以。

小白:这都是什么啊?……

为了调试,这次的编译可以很简单,只要把优化选项去掉,再make即可:

make clean./configure --disable-optimizationsmake 

小白:等等,为什么要编译啊?直接把ffmpeg源码拉到调试项目不就好了?

花满楼:聪明喔。直接拉源码也可以,拉编译后的二进制库也可以。因为实际使用时总是以二进制库的方式,所以编译FFmpeg在所难免。既然总是要编译了,那就用二进制库来调试呗。

小白:有道理。那make是什么,优化选顶又是什么?

花满楼:……这种编译的基础问题,你还是留意 西门吹雪的软件基础的讲解吧。不过,后续我会介绍FFmpeg在两大移动平台上的编译。

小白:又是 西门吹雪…… 我知道这次编译是要把优化取消,但那单词也太长了吧!

花满楼:是很长,但你可以通过./configure –help来查看所有的选项,再找到这个单词的。make clean,是清一下之前的编译污染,如果之前都没有编译过,那就不需要了。另外,如果加上make install,就会顺随带把FFmpeg也安装到mac系统而已,但对于调试是不重要的,只要make出二进制库就好了。对于FFmpeg的安装和我体验,我在前几节有介绍啦。

小白:好吧,你广告打得够多了!不就多打一行命令么!

花满楼:……

小白:还有,这个./configure,是什么?

花满楼:这个是FFmpeg提供的脚本,用来生成Makefile跟config.h文件,Makefile在编译时使用;而config.h(里面各种宏的定义)被FFmpeg源码使用,也会影响到FFmpeg的功能裁剪。

小白:好了,好了,听不进去了!以后再说吧。

花满楼:那你又问……

成功编译后,可以看这几个文件:
FFmpeg带调试信息的程序

(2)用gdb调试FFmpeg

小白:喂,不要讲这么陈旧的东西啦!

花满楼:是有点陈旧,但对于喜欢命令行的人是很实用的,所以我还是要讲一下。

为了便利,直接用FFmpeg的组装程序来切入调试,比如可以选择ffplay这个程序来切入调试它所依赖的基础即FFmpeg。

调试ffplay需要输入参数,在gdb ffplay_g后,r “xxx/file.mp3”即可,表示用ffplay来播放这个文件。

以下是演示视频:

gdb调试FFmpeg

小白:那为什么是ffplay_g而不是ffplay呢?

花满楼:带_g的是有调试信息的程序,那才是调试需要的,不要弄错了。

(3)用xcode来调试FFmpeg

参考这一篇文章吧,图文并茂,对着操作就可以了:
http://www.jianshu.com/p/226c19aa6e42

小白:为什么调试时能跳到FFmpeg的源码的。

花满楼:因为有符号信息啊,包括源码的路径,在编译时写进去了,注意是debug版本才有,也不能优化。具体你还是问 西门吹雪吧。

小白:又是吹雪兄……那lldb调试工具也是问他了?

花满楼:是也!但如果你用xcode来调试的话,这个也不是必须的。


开心时间

程序员A:哥们儿,最近手头紧,借点钱? 程序员B:成啊,要多少? A:1000行不? B:咱俩谁跟谁!给你凑个整,这1024,拿去吧。一个程序员在肯德基编程,一个乞丐边上坐下来,向他乞讨。他给了一块钱,继续写代码。乞丐没有走,看着他。过了一会,悄悄地说:“这行少了一个分号” 他惊诧地睁大眼睛问:“这个你也懂? ” 乞丐满眼含泪:“就是因为懂这个,所以我才落的今天这下场。”一个女程序员 twitter 上发了一条 tweet:昨晚梦见男朋友和别的女人在逛街,梦里我的第一反应是查源代码…结果调试半天查不出来为什么显示的是那个女人不是我,最后含泪把那个女人给注释掉了,再一运行就是我男朋友自己逛街了…醒来囧字脸呆了很久…囧 rz评论:2 楼:把那个女人的指针指向你即可3 楼:谁让你把男朋友设成 public 的 加个断点看看那女人是谁4 楼:心真软,就该把他的接口屏蔽掉。5 楼:是我想多了么 protected 逛街(youOnly)6 楼:设计问题,应该采用单例模式7 楼:没做回归测试8 楼:查一下 Log,只逛街了吗

多媒体开发,关联阅读

FFmpeg第一次约会

ffplay看直播,简洁就是美

摄像头启动,开启监控


如果你对音视频开发有兴趣,那请关注我们的公众号,并在输入框中发送数字5,花满楼会加你到专业的音视频开发群中。

欢迎关注我们