1. FFmpeg和Cygwin介绍
FFMPEG是目前功能比较强大的开源数字媒体处理项目之一。将FFmpeg源代码移植到VisualStudio上进行编译和调试已经 在前一篇文章中说明。本章主要说明如何利用Eclipse对FFmpeg进行调试。
MinGW (MinimalistGNU for Windows)提供了用于开发原生Windows应用的开发环境,它主要提供了针对Windows应用的GCC和GNU binutils等工具,从编译后的可执行文件的运行效率来讲MinGW可能更快一些。Cygwin项目的目的是提供运行于 Windows 平台的类 Unix 环境,因此从这个层面来说能够和FFmpeg最大限度兼容的平台无疑是Cygwin。本文将利用Cygwin提供的Linux相关工具链,直接在Windows上不加修改地编译和调试整个FFmpeg库。
1.1. Windows上Cygwin的安装
网上提供了很多如何在Windows上利用MinGW和Msys编译和调试FFmpeg的方法,但是大多配置繁琐,且避重就轻容易误导读者。本文开创性地采用了Cygwin平台作为类Unix环境的模拟器,进行FFmpeg库的编译和调试。由于Win 7系统环境的原因,本文采用64位Cygwin和64位的Java JDK以及64位的Eclipse作为编译和调试平台,以减少因为系统环境问题而导致出现各种各种奇葩问题的概率。
1) 从https://www.cygwin.com/ 网站上下载setup-x86_64.exe安装程序;
2) 按照普通软件的安装方法进行软件安装,直到步骤“Choose A Download Site”停止,如图1-1所示;
3) 由于国外网站访问速度慢,我们可以利用国内提供的Cygwin仓库的开源镜像下载软件包,如图1-2所示;并将地址http://mirrors.163.com.cn/cygwin/添加到“User URL”条目里,然后点击“Add”按钮,点击“下一步”后将出现图1-3所示选择安装软件包的界面;
4) 为了编译和调试FFmpeg可能需要安装的软件包有:Base、binutils、gcc、gdb、make、pkg-config、pthread、git、mingw-runtime、texinfo、diffutils、yasm和libSDL-devel等;
5) 最后可以选择“Cygwin64 Terminal”或者“cygwin64\bin\mintty.exe”启动Cygwin。
图1-1 选择下载地址 图1-2软件包下载地址 图1-3选择软件包
1.2. Windows上Cygwin编译FFmpeg
经过1.1中的步骤完成安装后,将下载的最新FFmpeg放到Cygwin的某个目录下,本文将FFmpeg放在“D:\cygwin64\home\xxx”目录下,并命名为ffmpeg。
FFmpeg库的编译和Linux上所有其他软件的编译方式一样,遵循./configure、make和make install三步。图1-4给出了一个在我的环境下的配置参数。其中configure有一些参数需要设置,可以使用./configure –help查看。
图1-4 FFmpeg configure
其中, --disable-optimizations 表示禁止编译器对代码进行优化,--disable-stripping禁止make install的时候去掉编译出的库中调试用的符号信息,--enable-debug开启调试功能。
configure结束后就可以进行make和make install的操作。其中make install操作不是必要的。
为了验证编译好的FFmpeg库是否可以正确的调试,可以使用gdb进行试验,如下图1-5(a)和(b)所示。(a)是利用“gdb./ffmpeg_g.exe”命令开启调试,(b)使用了几个命令进行了简单的调试。如果编译之后的库可以进行类似图1-5(a)和(b)所示的调试,则说明编译的库也同样可以在Eclipse中进行正确的调试。
(a) (b)
图1-5 GDB调试FFmpeg
2. 使用Eclipse调试FFmpeg
Eclipse是一个基于Java的开源可扩展开发平台,在Linux平台中使用较多。对于大多数Windows程序员来说接触较少。由于Eclipse基于Java,因此为了使用Eclipse需要首先安装JavaSE的JDK,安装完成后还需要一些环境变量的配置,在此不再赘述。
2.1. Eclipse FFmpeg工程
1) 将编译好的ffmpeg工程拷贝到Eclipse的Workspace中;
2) 打开Eclipse建立“C Project”,并选择“Makefile project”中的“Empty Project”,编译工具链选择“Cygwin GCC”,如图2-1(a)和(b)所示;
(a) (b)
图2-1 建立FFmpeg的CygwinMakefile工程
3) 右击“FFmpeg”项目,选择“DebugAs”,如图2-2(a)所示,并选择“ffmpeg_g.exe”作为被调试的应用程序,随后将出现图(b)所示界面,根据红色文字的提示,我们可以知道gdb无法找到ffmpeg.c文件的具体路径。由于我们最开始将最新的FFmpeg项目放在了“D:\cygwin64\home\xxx”路径下,并改名为ffmpeg。当启动“Cygwin64 Terminal”编译FFmpeg项目时,Cygwin采用了Linux的目录组织方式,将路径“D:\cygwin64\home\xxx”,看待为“/home/xxx/”,即,用户“xxx”的家目录,因此“D:\cygwin64\home\xxx\ffmpeg\ffmpeg.c”,自然而然就被Cygwin理解为“/home/xxx/ffmpeg/ffmpeg.c”。解决这个问题的方法,如图(c)所示,添加一个“Path Mapping”,将路径正确映射即可。最终运行效果如图(d)所示,从2-2(d)中,可知:gdb已经正确地映射到了源代码上,且各种调试信息也都可以正确的获得。
在以上的方法中,将经过Cygwin编译之后的代码拷贝到了Eclipse的Workspace中。在实际的操作中也可以不用拷贝,那么在第二步的时候选择项目路径的时候选择正确的路径即可,比如本文中的“D:\cygwin64\home\xxx\ffmpeg”路径。当出现了路径问题时只要采用同样的方式进行“Path Mapping”即可。至此,经过以上三步就可以完整的调试整个FFmpeg库。接下来将简要介绍如何使用Eclipse调试FFmpeg中常规的解码库,比如HEVC、H264以及MPEG4等。
(a) (b)
(c) (d)
图2-2 调试ffmpeg_g.exe界面
2.2. Eclipse FFmpeg调试
在前一节中已经详细叙述了如何使用Eclipse建立FFmpeg的调试工程,并设置“PathMapping”,本节如要说明如何设置输入输出参数,并展示调试Mpeg4、H264和HEVC的调试截图。
在Eclipse中右键单击“ffmpeg”工程,并选择“DebugAs”条目下的“DebugConfigurations”,如图2-3(a)所示,接着在“C/C++ Applicaton”下建立一个“ffmpeg Default”的配置文件,然后单击“Search Project”按钮,并选中待调试的应用程序即可。最后单击“Arguments”选项卡,并在其中填入“-i test.bin -pix_fmtyuv420p test.yuv -y”,如图2-3(b)所示。 其中,
“-i”表示输入参数(码流等);
“-pix_fmt yuv420p test.yuv”表示输出文件格式采用YUV420格式,且输出YUV的名字为“test.yuv”,注:默认情况下也可以不用输入“-pix_fmt yuv420p”,直接输入“test.yuv”即可;
“-y”表示如果文件夹中已经存在“test.yuv”,则覆盖该文件。
(a)设置调试的工程 (b)设置输入输出参数
图2-3 输入输出参数设置
(a) Mpeg4调试实例 (b) H264调试实例
(c) HEVC调试实例
图2-4 FFmpeg调试实例
图2-4(a)、(b)和(c)三幅图分别展示了Mpeg4、H264和HEVC的调试实例。其中Eclipse调试的快捷键和VS略有差异,常用快捷键如下:
F5单步调试进入函数内部;
F6单步调试不进入函数内部;
F7由函数内部返回到调用处;
F8一直执行到下一个断点。
3. 在Mac系统Eclipse调试FFmpeg
前两章详细描述了如何在Windows系统里使用Eclipse搭建FFmpeg调试工程。由于FFmpeg和Eclipse天生就是由Linux系统的生产的,所以在Linux系统中不需要Cygwin之类的软件,所以在Linux操作系统中只需要按照第二章类似的操作建立一个工程即可方便的使用。Mac系统也是Linux操作系统的一个分支。Linux系统使用GCC和GDB作为系统的编译器和调试器,Mac系统使用的是Clang和LLDB作为系统默认的编译器和调试器,但在Mac系统中Eclipse不使用LLDB作为系统的调试工具,因此需要下载和安装Mac版的GDB。安装完成之后即可按照第二章所讲进行调试。
在Mac中建立好Eclipse工程后,启动调试可能会出现如下图3-1(a)所示的错误:找不到gdb命令。使用图3-1(b)所示的“Which”命令可以知道系统的gdb所在的路径,然后按照图3-1(c)所示操作,替换为绝对路径即可。接着调试可能会出现图3-1(d)所示的问题,导致该问题的主要原因是:Mac出于安全考虑,在没有特殊授权的情况下不允许gdb调试任何程序,因为可以调试就掌握了进程的控制权,如果是root用户就没有这个问题,不过谁愿意用root来调试程序呢。
(a) (b)
(c) (d)
图3-1 修改gdb路径
一个常用的解决方法就是给gdb授予系统完全信任的代码签名权利,首先,需要创建一个系统代码签名信任证书:步骤如下:
1) 从“Finder”进入“实用工具”,然后启动“钥匙串访问”,如图3-2(a)所示;
2) 打开菜单:钥匙串访问->证书助理->创建证书,如图3-2(b)所示;
3) 创建一个证书,证书名自己定义,例如“gdb-cert”,如图3-2(c)所示,选择身份类型为“自签名根证书”,选择证书类型为“代码签名”。“让我覆盖这些默认签名”可根据实际情况酌情勾选,比如已经存在有一个“gdb-cert”证书的情况下可以勾选;
4) 接下来的所有信息可以忽略,直接点击下一步即可,直到选择存放证书地址为“系统”,如图3-2(d)所示;
5) 右键刚才创建的“gdb-cert”证书,选择“显示简介”点击“信任”,会显示可以自定义的信任选项“代码签名”选择“总是信任”,如图3-2(e)和3-2(f)所示。
(a) (b)
(c) (d)
(e) (f)
其次,将证书授予gdb,执行如图3-2(g)所示,其中“-f”表示强制签名的意思,如果“gdb”已经被签名的话可以使用该选项,“gdb”的路径“/usr/local/bin/gdb”可以通过前面的“which”命令获得;
(g)
图3-2 给gdb授权
经过,以上几个步骤之后Eclipse即可调用GDB调试程序,如图3-3所示,在Mac系统中以及可以完整地使用Eclipse调试FFmpeg库。
图3-3 Mac下Eclipse调试FFmpeg实例