摘要:
本文作为“x264视频编码器应用与实现”系列博文的第四篇,主要讨论如何利用编译生成的libx264的库文件实现x264的编码器示例程序。
1. x264的命令行工具与静态库
上一篇中我们已经实现了x264源代码的编译,并且实现了对x264命令行工具(CLI)在xcode中的单步调试。但是一个很容易理解的问题是,x264 CLI 在实际应用场景下几乎没有任何扩展性,除了可以传递的部分参数之外,对整个编码的流程完全无法进行控制与自定义操作。因此,在实际应用的场景中,使用x264相应的库文件,并调用其中的API是更为常用的操作。
关于如何使用x264的库与API,源代码中也为我们提供了可以参考的 demo 程序,即根目录下的 example.c 文件。该文件非常短小精悍,只有142行,整个文件的实现如下(省略头部注释):
1 |
|
由于我们在上一篇中生成的是静态库 libx264.a,在这里我们也将使用静态库来运行example.c这个文件,以求对 x264 的整体编码流程有一个大体的认识。
2. 使用Xcode新建x264-example工程
在 xcode 中新建一个命令行工程:
将库文件、头文件添加到项目中:
添加后,我们在工程配置中可以看出,libx264.a 已经被添加到工程中:
指定头文件和库文件路径:
将 example.c 中的内容复制到 main.c 中。
Edit Scheme中指定运行参数,调试运行:
例如运行参数可以为:
1
1280x720 /Users/yinwenjie/Video/input_1280x720.yuv /Users/yinwenjie/Video/lib_output.h264
3. 使用CMake新建x264-example工程
在实际的项目开发中,使用CMake进行工程构建在业界取得广泛应用。CMake是一项开源的跨平台代码构建系统,具有配置灵活、功能强大且易于维护等特点,支持如Linux、Windows和macOS等常见操作系统。在本节中,为了更加适应业界主流的方案,在编译生成了libx264.so以及对应的头文件后,我们使用CMake引用x264库文件并实现x264-example工程。
3.1 配置文件CMakeLists.txt
使用CMake配置工程的核心是配置文件CMakeLists.txt,工程构建过程中几乎所有的步骤都可以通过配置文件CMakeLists.txt控制。在工程目录下创建CMakeLists.txt:
1 | cmake_minimum_required(VERSION 3.5 FATAL_ERROR) # 指定CMake版本 |
3.2 工程目录结构和编译方法
工程目录结构如下所示:
1 | . |
其中编译脚本 build.sh的内容如下:
1 |
|
源代码可参考在线代码仓库:https://gitee.com/yinwenjie-1/x264_encoder
4. 浅析example.c中的代码实现
整个example.c中只有一个用于判断错误退出的宏定义和一个主函数。在主函数main.c中,首先是定义一些变量和结构:
1 | int main( int argc, char **argv ) |
上述变量和结构定义完成后,获取或指定编码的参数:
1 | int main(int argc, char **argv) |
随后需要做的工作是,按照图像的格式和大小分配相应的内存空间,并打开编码器对象:
1 | int main(int argc, char **argv) |
接下来便是程序中最重要的编码循环体:
1 | int main(int argc, char **argv) |
当输入的YUV文件读取完成后,还需要继续进行编码以输出还在编码器中的剩余视频码流数据,也就是俗称的flush操作,其主要流程与编码过程类似:
1 | int main(int argc, char **argv) |
最后,在全部编码完成后,进行编码器的释放以及输入图像内存的释放:
1 | int main(int argc, char **argv) |