1. x265工程项目
https://x265.readthedocs.io/en/master/
新一代高效视频编码标准(HEVC,也称为 H.265)主要为应对高清、超高清视频的带宽和存储需求而生,可支持 8K 超高清视频,图片尺寸可达 8192x4320 像素。
x265编码器项目由 MulticoreWare 于 2013 年推出,旨在各种硬件平台上提供最高的压缩效率和最高的性能,成为最优秀的HEVC编码器。x265 编码器利用了 x264编码器中许多出色的视频编码功能和优化项,整体上可作为开源软件库使用,也提供了命令行形式的可执行文件以方便测试和开发。
本专栏基于最新的Release V3.5大版本对x265中涉及的编码工具、优化项等进行梳理。首先从VideoLan官网下载x265的最新源码:
git clone https://bitbucket.org/multicoreware/x265_git.git
2. 编译
要编译 x265,必须先安装 Git 和CMake(2.8.8 或更高版本)。如果需要将汇编代码也编译进去,还需要安装YASM(1.2.0 或更新版本),或者NASM(2.13 或更新版本)。然后按照以下简单步骤操作:
2.1 Linux/MaxOS
在Linux/MacOS系统下,编译可执行文件:
# ubuntu packages:
$ sudo apt-get install git-all cmake cmake-curses-gui build-essential yasm
# Note: if the packaged yasm is older than 1.2, you must download yasm (1.3 recommended) and build it
# If you are compiling off the default branch after release of v2.6, you must have nasm (2.13 or newer) installed and added to your path
$ git clone https://bitbucket.org/multicoreware/x265_git.git
$ cd x265/build/linux
$ ./make-Makefiles.bash
$ make -j8
使用make-Makefiles.bash脚本会进行基础的编译配置,检测电脑系统环境、寻找编译器、汇编器、生成版本号等;中间会生成以下配置界面,可以根据个人需要选择生成编码器可执行文件、Debug/Release版本、动态库等,使用“enter”进入并修改完成后,按“c”进行配置,按“g”结束配置并应用。初学和梳理代码时可使用 Debug+关闭汇编 的版本,便于跟踪代码。
make之后,可以在build/linux目录下,拿到可执行文件x265,动态库libx265.dylib, 静态库libx265.a。使用x265查看编译是否ok:
./x265 -V
x265 [info]: HEVC encoder version unknown
x265 [info]: build info [Mac OS X][clang 12.0.0][64 bit][noasm] 8bit
x265 [info]: using cpu capabilities: none!
2.2 Android
在x86环境下编译Android可使用的可执行文件/编码库,需要用到交叉编译工具,官方推荐cmake+交叉编译链的方式。在linux下交叉编译链比较完善,命令比较简单:
$ sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
$ sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
$ cd x265/build/arm-linux
$ ./make-Makefiles.bash
$ make -j8
同样在当前目录下会生成供Android使用的可执行文件x265与动态/静态库。注意在使用脚本配置时,此时就可以使用Release+开汇编的版本了,可以明显提升编码器的编码速度。
在MacOS下,使用ndk自带的toolchains中提供的aarch64-linux-android-gcc,aarch64-linux-android-g++未能编译成功,主要问题还是macOS下的cmake与交叉编译链的不适配。此时推荐自建jni+ndk-build的方式,来交叉编译可执行文件,相对会容易些。
3. 测试
3.1 序列准备
HEVC官方提供的数据集YUV:https://blog.csdn.net/ranghanqiao5058/article/details/93996377
下载需要较长时间,我们可以简单从官方测试码流(http://ftp.kw.bbc.co.uk/hevc/hm-10.0-anchors/bitstreams/ra_main/)中随意下载一个,使用ffmpeg解码为YUV格式,作为编码输入:
#解码
ffmpeg -i BQMall_832x480_60_qp22.bin BQMall_832x480_60_qp22.yuv
#播放验证
ffplay -video_size 832x480 -i BQMall_832x480_60_qp22.yuv
3.2 编码命令
一般编码必须包含的基础命令有 输入、分辨率、帧率、输出
#编码
./x265 --input BQMall_832x480_60_qp22.yuv --input-res 832x480 --fps 60 -o output.h265
#播放验证
ffplay -i output.h265
输入yuv大小为359MB,输出码流大小为1.4MB,压缩了约256倍,这也是视频必须编码压缩的意义所在。
x265提供了三百多个编码命令可供选择,包含了预处理、intra/inter工具、量化、变换、后处理等各个编码优化项,psnr/ssim等质量把控工具、线程/内存等工程优化项、以及rc、rdo等工具。详细可参考官方文档:
https://x265.readthedocs.io/en/master/cli.html#executable-options
另外x265也根据压缩率和编码速度划分出了0-9共10个预设preset,每个preset包含了不同的工具集,我们也可根据某一preset基础上进行微调。10个preset为:
0:ultrafast (编码速度最快,压缩率最低)
1:superfast
2:veryfast
3:faster
4:fast
5:medium (default)
6:slow
7:slower
8:veryslow
9:placebo (编码速度最慢,压缩率最高)
//各preset所包含工具集可参考官方文档:https://x265.readthedocs.io/en/master/presets.html
学术研究可采用CQP方式,一般使用(22,27,32,37)QP对儿计算bdrate,主要衡量和其他编码器的压缩率(后续有时间会补充一些x265与x264的对比测试)。
实际应用多采用ABR模式,在给定带宽下进行编码压缩。一般不在乎延时的需求(类似短视频、长视频)会以高压缩率为主要指标,如placebo档位;而低延时的转码环境则会在压缩率与编码速度之间进行综合考虑,在延时可接受的情况下尽可能提高压缩率(如直播场景);针对超低延时场景,则会牺牲压缩率与画质,尽可能保证实时,(如视频通话、视频会议等RTC场景),会倾向于在ultrafast、superfast档位中做fine-tune。