前言
目前,在视频压缩领域,VVC(H.266)有着最优秀的编码性能,也得到了大家的广泛关注。对于刚开始接触VVC的研究者来说,可能不太清楚如何使用其来对图像、视频进行压缩。因此,本文想就VVC的具体使用方法进行详细说明,希望能够帮到需要的人。
软件下载
对于每种编码标准,都有其对应的测试软件。而VVC对应的测试软件成为VTM,它可以在VVC官网进行下载。其官网首页如下图所示,红色框所圈的即为软件链接。如果由于一些原因进不去网站,可以至公众号“图像和视频处理学习日记”回复“VTM编码”下载目前的最新版本:VTM-19.0。
如下图,进入软件仓库后,点击1号圈的下拉标签选择需要下载的版本,接着点击二号圈的下载按钮,选择对应的压缩包类型进行下载。
编译前的准备工作
在开始编译前,需要电脑的环境中中有gcc、g++、cmake、make这四中工具,如果没有,可以通过如下命令进行下载。
sudo apt-get install gcc g++
sudo apt-get install cmake
sudo apt-get install make
软件编译
下载好的软件是一个压缩包文件,首先将其解压到你自己喜欢的位置,并点击进入文件,到下图所示的状态。在当前文件下新建一个空的文件夹,将其命名为”build“。
接着,双击进入build文件,右键鼠标在build目录下打开终端。
接着,输入如下命令:
cmake .. -DCMAKE_BUILD_TYPE=Release
或
cmake .. -DCMAKE_BUILD_TYPE=Debug
完成后,接着继续输入
make -j
等待编译达到100%后,即完成编译。
软件使用
获取编解码器
编译好之后,我们需要进入退出”Build“文件夹,进入”bin“文件夹,并不断用鼠标往里点,直到出现如下图所示的状态:
其中,"EncoderApp"是用来编码视频,获取编码码流的,”DecoderApp“是用来解码编码所得码流,获得解码视频的。需要注意的是,"EncoderAPP"也可以获得压缩后的视频。
准备YUV格式的视频
对于VTM,它只能接收YUV格式的输入,因此,对于普通的MP4格式的视频,首先需要转换为YUV格式,才能够输入VTM进行编码。通过ffmpeg工具可以将MP4视频转换为YUV格式,一般我们选择YUV420格式。这个教程网上很多,后面有空的话,我会出一期ffmpeg的基础教程。如果只是想体验一下VTM的使用过程,我在公众号里放入了编码所需的一切文件,包括配置文件、YUV文件,大家可以直接下载使用。
编码模式介绍
首先,我先解释一下常见的编码模式(配置),主要有四种:AI(All intra) 全帧内模式、RA(Random access)随机接入模式、LDP(Low delay P)低延迟P帧、LDB(Low delay B)低延迟B帧。它们对应的配置文件(位于cfg文件夹下)如下图所示(用鼠标写字有点抽象,理解一下~)。
其中,AI模式下,所有视频帧都采用帧内编码,因此其预测方式仅限于帧内预测,所得的压缩视频质量很高,但是压缩完的码流也很大。同时,这个模式可以用来进行图像压缩,将一个图像先转换为YUV格式,然后使用AI模式对其进行压缩,即可实现基于VTM的图像压缩。需要注意的是,对于AI模式,VTM默认每隔8帧压缩一帧,举个例子,假如一个视频有80帧,最后压完的视频只有10帧。如果你想在AI模式下逐帧编码,则需要修改AI配置文件中的参数TemporalSubsampleRatio,如下所示:
TemporalSubsampleRatio: 1
准备待编码视频的配置文件
现在,我们有了EncoderApp、YUV视频文件、编码模式所对应的cfg配置文件,要进行编码,我们还需要当前编码视频的配置文件,其主要内容如下所示:
#======== File I/O ===============
InputFile : BasketballDrill_832x480_50.yuv
InputBitDepth : 8 # Input bitdepth (输入视频的bit深度)
InputChromaFormat : 420 # Ratio of luminance to chrominance samples
FrameRate : 50 # Frame Rate per second(输入视频的帧率)
FrameSkip : 0 # Number of frames to be skipped in input
SourceWidth : 832 # Input frame width(输入视频的宽-横向长度)
SourceHeight : 480 # Input frame height(输入视频的宽-纵向长度)
FramesToBeEncoded : 500 # Number of frames to be coded (需要编码的总帧数)
Level : 3.1
在使用时,只需新建一个txt文件,并将后缀名改为cfg,然后将上面的内容复制进去,并根据待视频的特性更改其中对应的内容即可。
最后的预备工作
此时,我们可以在喜欢的地方新建一个文件夹,然后放入上面的文件,如下图所示:
其中:
1-待编码视频的cfg文件,包含视频的一些基本信息
2-待编码的YUV视频文件
3-编码器
4-当前编码模式的配置文件,使用哪种模式编码,就使用对应的配置文件
编码
在此,我以在AI模式下压缩视频BasketballPass_416x240_50.yuv为例,对编码方法进行阐述。
如下图所示:
在当前命令行,输入:
./EncoderApp -c encoder_intra_vtm.cfg -c BasketballPass.cfg -i BasketballPass_416x240_50.yuv -q 42 -b out.bin --PrintMSSSIM=1 -o out.yuv > out.txt
此时,VTM便开始了对视频的编码,其中BasketballPass.cfg和BasketballPass_416x240_50.yuv根据自己当前编码的视频进行调整,”-q“表示量化参数QP的数值,值越大编码越快,失真越大,”-b“指示输出的bin文件(码流)地址,”-o“指示输出的压缩视频地址,”>“指示输出的编码日志地址,”–PrintMSSSIM=1“表示在编码日志中,输出每帧的MSSSIM值。
生成的文件如下所示:
编码日志如下所示:
如果需要同时编码许多视频,就需要编写脚本代码来批量化进行压缩和保存,由于篇幅关系,这部分的内容将留到下次进行分享。如果本文对你有帮助的话,点个赞再走吧~