2020-10-30 7764 5
在龙芯3A4000上使用x264编码视频,无论是在UOS20还是Fedora28中,默认情况下都非常慢。慢到什么程度呢?能慢每秒只能编码1帧。那么为什么会这么慢?有办法解决吗?带着这个问题,我进行了一番测试,试图找到简单有效的办法提高视频编码的性能。
首先,我在http://trace.eas.asu.edu/yuv/index.html下载了一个YUV帧序列进行测试,下载的是有14315帧的"Big Buck Bunny"的1920*1080的序列文件,解压后有40多G,帧率24,视频长度有10分钟。这个动画片段足够长,场景变化和画面复杂度都比较合理,可以真实反应编码电影类视频的性能。而如果是通过录制桌面这类方式来测试,由于桌面画面通常变化很少也很慢,视频编码的计算量就低,编码速度会很快,无法反应对电影类视频编码时的性能。测试编码性能时,我是把YUV文件放在了一块nvme接口的ssd上,然后把它通过nvme to pci-e x4 的转接卡插在PCI-E的插槽上。由于龙芯的主板是PCI-E 2.0的规范,且CPU主频较低,因此读文件的速度只有 1GB/s 左右,但这个速度已经足够读取YUV文件进行视频编码了,硬盘I/O的性能对编码速度的影响不会很大。
然后在UOS中安装x264,x264是一个可执行的二进制文件,在编译时与libx264.so这个库文件同时产生,使用与libx264相同的核心代码和编译参数,只是x264可以通过命令行调用进行一些测试,以及转换无音频的视频文件。
安装x264:
sudo apt-get installl x264
然后查看x264的版本,使用 x264 --help,输出信息的第一行就是版本信息:
x264 core: 155 r2917 0a84d98
从版本信息中可以看出这是 x264 155 版的一个分支,之后在解压了YUV的文件夹中打开终端,输入类似下面的命令来测试编码性能。
x264 --preset ultrafast -o /dev/null --fps 24 --qp 23 --input-res 1920x1080 ./BigBuckBunny_1920_1080_24fps.yuv
在上面的命令行中,--preset 后面是编码参数的预设方案,ultrafast是最快的模式,其它还有superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo,通常很少使用medium之后的设置,因为后面的实在太慢,即使i7等级的CPU在画面变化幅度大、变化速度快时,也难以维持30fps的编码速度。--qp是指定码率控制方式是cqp,也就是使用固定的量化值而不使用码率控制,编码的视频文件会比较大。-o 后面是输出文件,现在是仅测试性能,不需要输出视频文件,因此设置为 /dev/null。我测试了ultrafast、veryfast、medium这三种编码参数预设方案,结果是很不乐观的。
从上表看出,即使使用最快的ultrafast模式,编码帧率也才20左右,而medium模式的编码帧率还不到2。这样的编码性能,基本无法正常使用,即使是用于屏幕录像编码,也只有在桌面变化速率较低时,使用ultrafast设置才可以保持30fps的编码速度。不过,注意一下我在表格第一列中,版本号155后面加了一个 noasm,这是因为x264编码时输出的第一行信息中有“using cpu capabilities: none!” 的字样,none请表示没有在编译时没有使用任何汇编代码优化。那么,提高编码性能的方法就呼之欲出了,只要下载同版本的x264源码重新编译一下不就可以了吗?
于是,我下载了 http://download.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20190310-2245-stable.tar.bz2 这个文件,这是x264-155版的最后一次更新。下载之后在解压目录打开终端,输入 ./configure --help 查看配置参数,发现了 --disable-asm 这个参数,如果在配置是加上它,就会禁用所有的汇编代码,而默认是打开的。说明 fedora28 和 UOS 中编译 x264 时都特别加上了 --disable-asm,这是什么原因呢?现在先不管原因,重新编译测试一下再说。
./configure --enable-shared --prefix=./build-asm
make -j4
make install
上面在--prefix后面指定的文件夹就是当前目录的子目录,因为现在是要测试,而不是要去替换掉系统中的库。完成后在build-asm下面的bin文件中就是编译好的 x264 可执行文件了,lib 文件夹中是 libx264.so.155 库文件。把 x264 复制到 yuv 文件所在的文件夹,再打开终端,使用与之前相同的参数设置进行编码测试。只是命令行之前直接输入 x264,现在要改成 ./x264,表示是要运行当前文件夹下的 x264 程序。运行输出的第一行有“using cpu capabilities: MSA”的字样,说明已经启用mips的向量指令集MSA。测试结果性能提升非常明显,而且是编码速度越慢的、越消耗CPU的配置性能提升的比例就越大。
ultrafast的性能提升为2倍多点,而veryfast和medium则达到了原编码速度的5倍以上。虽然这样的性能与主流CPU相比仍然很低,但也算是达到了对1920*1080的影视类视频进行1倍速编码的下限。