使用Xcode调试FFmpeg内部代码
Posted vonchenchen1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Xcode调试FFmpeg内部代码相关的知识,希望对你有一定的参考价值。
分享一下Xcode调试FFmpeg的方法。
1.配置configure文件
首先需要配置configure生成Makefile,Makefile成功生成后再使用Xcode的External Build System执行make命令,这些操作和使用命令行编译是一样的。需要注意的是ffmpeg默认configure会去掉调试符号和进行编译优化,这样会导致debug进入的时候没办法看到每个变量的值,通过执行帮助命令
./configure -h
目前最新的FFmpeg可以看到下面两个选项
这里需要手动指定,下面是我自己的Mac下的configure命令
./configure --prefix=$BASE_PATH/build/ffmpeg_build \\
--enable-debug=3 \\
--disable-optimizations \\
--disable-stripping \\
--enable-yasm \\
--enable-gpl \\
--enable-pthreads
这样生成Makefile即可。
2.导入Xcode的External Build System
新建一个target,选择下面的External Build System,这里专门用于执行外部编译工具的命令编译。由Makefile管理的这种C/C++工程都可以使用这个。
点击next输入target名字后保存即可。可以看到一个红色圆圈圈的target,就是上一步创建的结果,如下图。
这时可以先在生成的Makefile目录(也就是FFmpeg的主目录)下先 make clean一下,然后执行刚才创建的ffmpeg-xcode,这时正常应该是通过Xcode执行make命令,重新执行Makefile。
3.执行fftool中的可执行文件
编译完毕后就可以执行或者调试ffmpeg、ffplay、ffprobe这三个程序了。
首先还是建一个控制台程序,建完后删除自动生成的main文件,如下
下一步就是把Makefile生成的ffmpeg_g设置给这个target。也就是说这个target我们不写代码,而是通过schema设置一个生成好的可执行文件给target。
在文件中找到刚才执行make生成好的可执行文件,注意需要选择后缀为_g的。
到这一步就可以给ffmpeg在schema中输入参数,进行源码调试了。下面随便给ffmpeg输入一个264文件。
进入断点
4.xcode查看FFmpeg源码
现在可以调试代码了,还有一个问题,如何直接在Xcode中查看整个工程的源码。这里我一直没有找到特别靠谱的办法,使用一个比较临时的方法。先建一个控制台target,然后把FFmpeg源码目录拖入Xcode,如下
随后会弹出对话框,第一步不要选择外部编译,如下
下一步直接把这些代码关联到刚才新建的target
然后编译一波,这样虽然编译不过,但是代码跳转正常。
5.自己代码调用FFmpeg库调试
上文完成了fftools中三个应用的调试设置,下面看一下自己调用库调试的方法。
还是建一个控制台程序。首先需要把生成静态库的路径以及头文件路径设置好。
下一步需要导入Mac本地的链接库,可以一边编译,看缺什么符号再添加,这里贴一下需要的最基本的库,如果遇到找不到符号需要调整一下。
对于ffplay,由于其依赖SDL,需要更多的库,下面贴出我用到的,如果编译缺东西可以在这个基础上调整。
下面可以在新建target中加入一段测试代码,尝试运行
#include <iostream>
#include <unistd.h>
extern "C"
#include "libavformat/avformat.h"
#include "libavcodec/avcodec.h"
int main(int argc, const char * argv[])
AVFormatContext *format_context;
av_log_set_level(AV_LOG_VERBOSE);
format_context = avformat_alloc_context();
avformat_open_input(&format_context, "xxx/mac_build/Debug/out.h264", nullptr, nullptr);
avformat_find_stream_info(format_context, nullptr);
av_dump_format(format_context, 0, 0, 0);
while (true)
sleep(1);
return 0;
这里存在一个问题,在FFmpeg内部执行断点时点击continue后面的断点无法停止,不知道什么原因,希望了解的朋友可以指点一下,目前这里我使用命令行进行操作,手动打断点,然后用c命令执行。
b xxxx.c:1234
c
以上是关于使用Xcode调试FFmpeg内部代码的主要内容,如果未能解决你的问题,请参考以下文章
音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体
音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体
音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体