FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源项目。FFmpeg是在Linux等平台下开发,如果想在Windows平台下调试,主要有两种方法:第一使用Cygwin+Eclipse的方式模拟Linux环境进行调试;第二种方法是提取FFmpeg中对应的解码库在Visual Studio 2013及以上的VS中IDE中调试,之所以要在VS2013及其以上的IDE中调试主要从VS2013开始才支持FFmpeg代码中的C99语法。
本章主要介绍如何提取FFmpeg中的H264代码并在VS2013中调试的详细步骤,H265代码的提取方式雷同。主要分为:选择解码库源文件,修改配置文件和源文件和调试解码源代码三部分。
1. 选择解码库源文件
FFmpeg中包含了众多的代码,要确定哪些是H264解码库的代码,哪些是H265解码库的源代码也不是一件容易的事。但可以利用FFmpeg提供的Makefile文件简单分析出各解码库对应的源文件。
1) 使用Cygwin或者Ubuntu等环境或者系统,运行configure命令,如图1.1(a)和(b)所示。由于我们需要提取的是h264解码库的源代码,所以图1.1(a)中的“External libraries”中的四个库都是多余的,可以使用FFmpeg中configure提供的参数“--disable-xxx”关掉,使用“--disable-xxx”配置后的结果如图(c)和(d)所示(图c比图a中还多了一个—enable-demuxer参数)。在configure的时候在不同的系统和环境下出现的情况不完全一样,所以需要disable和enable的库也可能不完全一样;
2) 然后使用图1.2(a)所示的make命令,得到图1.2(b)所示的文件,该文件中对应的源程序即为H264解码库VS工程所需的源代码;
3) 将第二步中获得的源代文件写入“CMakeLists.txt”中,如图1.3(a)所示,然后编译如图1.3(b)所示,同时将生成的“config.h”也要拷贝到相应目录中。
(a) (b)
(c) (d)
图1.1.FFmpeg中configure配置
(a) (b)
图1.2. FFmpeg中make编译
(a) (b)
(c)
图1.3. CMake编译
2. 修改配置文件和源文件
经过第一部分的操作,已经利用CMake生成了一个VS工程,编译该VS工程还会出现很多警告或者错误,主要原因是“config.h”中有的宏配置不正确,未包含对应头文件,已经部分函数定义不存在等。
1) 第一种情况是“config.h”中宏配置不正确,如图2.1(a)所示可以看出这些是与264解码无关的一些东西,那么可以直接将这些代码删除掉,也不会对结果有影响;由于我们是在Cygwin环境下进行configure和make的,所以config.h中的部分配置也是错的,如图2.1(b)所示,我们只需要把GCC相关配置关闭,打开Windows相关配置即可;同时将config.h中Linux相关功能的宏关闭,并将多线程相关啊的宏设置为“W32THREADS”,如图2.1(3)所示;
(a) (b)
(c)
图2.1 config.h中没有对应的宏
2) 第二种情况是缺少头文件引用,只要添加对应的头文件即可,如图2.2(a)和(b)所示。
(a) (b)
图2.2 缺乏对应头文件引用
3) 前两种情况解决后只剩下第三种情况了,如图2.3所示。由于我们提取了FFmpeg中部分代码,所以有的函数找不到定义就很正常了,解决该问题,要么就是讲无用的函数注释或者删除,要么就是将相应的文件添加到CMakeList.txt中进行编译。
图2.3 无法解析外部引用
以上只是粗略大概的讲述了三种情况对配置文件和源文件的修改方法,并未对每个文件的修改做详细说明。
3. 调试FFmpeg的H264工程
该项目的的制作过程中利用了网上OpenHEVC工程的部分代码,如图3.1(a)所示的“gpac”和“main_hm”目录,只是已将里面的部分代码改成了调用H264解码库,其中CMakeList.txt已经在第一章第三节做过更改。其中程序运行的配置参数如图3.1(b)所示,其中-n表示不用SDL显示,-i表示输入,-o表示输出,-p表示线程数。
(a) (b)
图3.1 OpenHEVC中的代码
该工程的工程代码可以在此下载,当然提取了源码后也可以不用CMake方式编译,可以直接将其代码建成VS2013工程。