最近开始阅读x264、x265源码,并计划学习一些基于FFmpeg的视频编码开发流程,首先熟悉一遍对于x264、x265 源码编译及libx264.lib、libx265.lib的库调用流程。
准备
系统环境: Win10 + VS2019
编译环境: Mingw64 + msys2 + cmake + yasm + nasm
注意: Mingw64、 msys2 最好直接装在C盘根目录下,并加入环境变量,路径中不能出现中文或空格(如 Program Files),否则 gcc 编译过程中可能会报错。yasm 直接放到Mingw64 的 bin 文件夹中即可。
【Mingw64】 配置可如下选择
【msys2】
-
在安装好的msys64文件夹中,编辑 msys2_shell.cmd ,删去
rem set MSYS2_PATH_TYPE=inherit
中的rem
,即可在运行msys2时访问 windows 环境变量,方便使用装好的 Mingw64 进行编译。 -
安装成功后,打开 MSYS2 MinGW 64bit,运行
gcc -v
, 显示如下,即证明正确安装了 msys2和 Mingw64,可以开始后续编译过程。
X264编译
- 将获取的源码拷到msys2中;
- 在msys2的命令行中输入
./configure
获取编译选项,如下图所示,具体各选项含义见链接:x264 编译选项详细说明;
./configure --enable-static --enable-shared --enable-debug --prefix=/home/x264/
make
make install
--prefix==/home/x264
为生成的lib、dll文件地址,可更改- 本人在编译过程中遇到多种小问题,多与路径有关,在将 Mingw64 和 msys2 都装在C盘根目录下后基本解决,具体在 configure 或 make 阶段遇到的报错可查看
x264-master/config.log
文件,有详细说明错误原因。
- 编译完成后 x264文件夹中包含bin、include、lib三个文件夹;
- bin文件夹中包含 x264.exe 及 libx264-161.dll 动态库链接,将此目录加入环境变量,直接调用 x264.exe 进行视频编码。
- 需要注意的是,x264 直接编译完成后,是不会生成.lib文件的,其静态库文件为lib\libx264.a,无法直接在 VS2019 中调用。
为了生成libx264.lib,需要利用 pexports 和 VS2019,将libx264-161.dll转换为.def文件,再转换为libx264.lib,具体操作可见:libx264.lib生成方法
pexports libx264-157.dll > libx264-157.def
LIB /machine:X64 /DEF:libx264-157.def
X265编译
在Win10环境下,对于 x265 的编译过程要相对 x264 温和许多,直接使用 cmake-gui 即可实现编译过程。
- 解压 x265 源码文件(x265的编译过程无需用到 msys2,因此解压文件夹不用放在 msys2 中),解压出来的文件夹包含 build、doc、source 三个子文件夹;
- 打开cmake-gui,分别在 source 和 build 处选择 x265_3.3/source 以及 x265/build (自选地址),然后点击 configure,在选择 generator 时选择VS2019(自选VS版本),其余默认,选择 Finish ,会在方框5中开始运行;
- 在弹出的编译选项中,勾选需要选择的配置,然后分别点击 configure、generate,最终即在选择的build文件夹中生成 x265.sln 工程;
- x265在运行时有 profile 参数选项,选择输出 HEVC 比特流的位深度,也是编码器内部的位深度,并根据此选项为编码器绑定API,具体绑定方法如下:如果所要求的位深度与所连接的libx265位深度不一样,它就会尝试去为8位编码器绑定libx265_main,为10位编码器绑定libx265_main10,为12位编码器绑定libx265_main12,使用与连接的libx265版本相同的API;
- 因此,如果工作需用到 10bit 编码器,即需在 CMake 中勾选 HIGH_BIT_DEPTH 并重新 configure;同时,重新configure后,配置界面会出现 Main12 选项,如果需要 12bit 编码器,则还需勾选此选项并再次重新 configure。
- 打开x265工程,调试器分别选择 Debug->x64 和 Release->x64,点击生成解决方案,即可生成最终调试可用和可直接运行的 x265.exe,分别在 build 目录下的 Debug 和 Release 文件夹中。
libx264.lib、libx265.lib的库调用
本人目前仅对 libx264.lib、libx265.lib 的库调用进行简单测试,在这里记录测试过程。
- 利用VS2019新建解决方案,在工程中创建 lib文件夹(放入libx264-161.lib 和 libx265.lib)、include文件夹(放入x264.h、x264_config.h 和 x265.h、x265_config.h)
- 调试器选择 Debug->x64!
- 右键工程名,属性,在C/C++:常规->附加包含目录中,添加 $(SolutionDir)include;在链接器:常规->附加库目录中,添加 $(SolutionDir)lib;在链接器:输入->附加依赖项中,添加libx264-161.lib 和 libx265.lib ;
- 添加源文件,调用 libx264.lib、libx265.lib 中 api 函数,测试两个库文件的正确性
#include <iostream>
#include <string>
#include "stdint.h"
#if defined ( __cplusplus)
extern "C" // 在C++代码中调用C语言代码,在C++的头文件中使用
{
#include "include\x264.h"
#include "include\x265.h"
};
#else
#include "include\x264.h"
#include "include\x265.h"
#endif
using namespace std;
int main(int argc, char** argv)
{
x264_param_t x264_param; // x264编码配置结构体
x265_param x265_param; // x265编码配置结构体
x264_param_default(&x264_param); // x264编码配置初始化
x265_param_default(&x265_param); // x265编码配置初始化
cout << "hello,x264" << endl;
return 0;
}
- 【报错】无法解析的外部符号 _x264_param_default,无法解析的外部符号 _x265_param_default
错误原因:调试器选用了Debug->x86,或链接器未设置正确。改为Debug->x64后生成成功!
project 测试成功!