macos系统上调试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.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来播放这个文件。

以下是演示视频:

macos系统上调试FFmpeg的三种方式_第1张图片

小白:那为什么是ffplay_g而不是ffplay呢? 答:带_g的是有调试信息的程序,那才是调试需要的,不要弄错了。

(3)用xcode来调试FFmpeg

  1. 下载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新项目

macos系统上调试FFmpeg的三种方式_第2张图片

这里选择Command Line Tool

macos系统上调试FFmpeg的三种方式_第3张图片

添加图片注释,不超过 140 字(可选)

4 . 引用FFmpeg

macos系统上调试FFmpeg的三种方式_第4张图片

macos系统上调试FFmpeg的三种方式_第5张图片

​5 .添加linked 信息

首先添加Header Search Paths

macos系统上调试FFmpeg的三种方式_第6张图片

接着添加Library Search Paths

macos系统上调试FFmpeg的三种方式_第7张图片

6 .添加target

macos系统上调试FFmpeg的三种方式_第8张图片

添加文件夹路径

macos系统上调试FFmpeg的三种方式_第9张图片

配置ffmpeg_make运行信息

macos系统上调试FFmpeg的三种方式_第10张图片

配置executable

macos系统上调试FFmpeg的三种方式_第11张图片

最后结果是这样的

macos系统上调试FFmpeg的三种方式_第12张图片

7 .大功告成 现在到ffmpeg.c main函数打个断点试试

macos系统上调试FFmpeg的三种方式_第13张图片

小白:为什么调试时能跳到FFmpeg的源码的。 答:因为有符号信息啊,包括源码的路径,在编译时写进去了,注意是debug版本才有,也不能优化。 小白:那lldb调试工具呢? 答:但如果你用xcode来调试的话,这个也不是必须的。

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

你可能感兴趣的:(音视频开发进阶,音视频)