赞
踩
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.bz2 tar jxvf ffmpeg-${VERSION}.tar.bz2 VERSION设置为最新的ffmpeg版本号。
小白:噢耶,终于下到这个伟大而巨大的源码了!可是,我怎么看这种源码啊?这么多文件! 答:这个,是 软件基础的话题, 我简单提一下,可以用soureinsight(+CrossOver)、sublime甚至vim或emacs来看这种项目,当然用xcode或AS也是不错的选择。 小白: 软件基础?
(1)编译FFmpeg
编译要使用到编译器,在mac机上最简单的办法就是安装xcode了,这样保证编译器clang是存在的。
小白:......安装xcode不简单好不好,几G的东西都要下载半天好不好? 答:从这个角度来说,你对!但是,你单独下载clang,那也不小的。而且,如果使用xcode来调试FFmpeg,会直观很多,特别是对于你来说。 小白:欺负我是小白是吧?如果我不用xcode,还能不能调试FFmpeg了? 答:当然可以,直接使用gdb或lldb都可以。 小白:这都是什么啊?......
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
为了调试,这次的编译可以很简单,只要把优化选项去掉,再make即可:
make clean ./configure --disable-optimizations make
小白:等等,为什么要编译啊?直接把ffmpeg源码拉到调试项目不就好了?
答:聪明喔。直接拉源码也可以,拉编译后的二进制库也可以。因为实际使用时总是以二进制库的方式,所以编译FFmpeg在所难免。既然总是要编译了,那就用二进制库来调试呗。
小白:有道理。那make是什么,优化选顶又是什么?
答:……这种编译的基础问题,不过,后续我会介绍FFmpeg在两大移动平台上的编译。
成功编译后,可以看这几个文件:
(2)用gdb调试FFmpeg
小白:喂,不要讲这么陈旧的东西啦! 答:是有点陈旧,但对于喜欢命令行的人是很实用的,所以我还是要讲一下。
为了便利,直接用FFmpeg的组装程序来切入调试,比如可以选择ffplay这个程序来切入调试它所依赖的基础即FFmpeg。
调试ffplay需要输入参数,在gdb ffplay_g后,r "xxx/file.mp3"即可,表示用ffplay来播放这个文件。
以下是演示视频:
小白:那为什么是ffplay_g而不是ffplay呢? 答:带_g的是有调试信息的程序,那才是调试需要的,不要弄错了。
(3)用xcode来调试FFmpeg
下载ffmpeg源码 https://github.com/FFmpeg/FFmpeg 8月18日更新 编译ffmpeg 依赖 yasm组件
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew install git brew install yasm
2.编译ffmpeg
cd FFmpeg ./configure -–enable-debug ./configure --disable-optimizations --disable-asm make -j8
3.创建Xcode新项目
这里选择Command Line Tool
添加图片注释,不超过 140 字(可选)
4 . 引用FFmpeg
5 .添加linked 信息
首先添加Header Search Paths
接着添加Library Search Paths
6 .添加target
添加文件夹路径
配置ffmpeg_make运行信息
配置executable
最后结果是这样的
7 .大功告成 现在到ffmpeg.c main函数打个断点试试
小白:为什么调试时能跳到FFmpeg的源码的。 答:因为有符号信息啊,包括源码的路径,在编译时写进去了,注意是debug版本才有,也不能优化。 小白:那lldb调试工具呢? 答:但如果你用xcode来调试的话,这个也不是必须的。
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。