Ubuntu20.04下编译并使用VVC测试软件VTM

前言

目前,在视频压缩领域,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值。
生成的文件如下所示:
在这里插入图片描述
编码日志如下所示:
在这里插入图片描述
如果需要同时编码许多视频,就需要编写脚本代码来批量化进行压缩和保存,由于篇幅关系,这部分的内容将留到下次进行分享。如果本文对你有帮助的话,点个赞再走吧~

结束~

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值