龙空技术网

MPEG系列视频编码技术浅析(上)

DevOps工程师老林 148

前言:

此时朋友们对“基于块的运动估计”可能比较着重,咱们都想要分析一些“基于块的运动估计”的相关内容。那么小编在网上收集了一些有关“基于块的运动估计””的相关知识,希望我们能喜欢,小伙伴们一起来了解一下吧!

之前在两家公司工作过,涉及MPEG视频编码系列中的MPEG2、MPEG4 part2、MPEG4 part10(H.264)以及H.265(HEVC),现在从技术原理层次对这些编解码技术进行剖析,印证之前工作中的一些粗浅理解,作为对自己技术分析能力的一次锻炼和检验。

本文仅限于视频编码方面,音频编码暂不涉及,也不包含音频与视频的打包传输等过程。

在整理材料的时候,才发现之前真的只懂了皮毛,估计文中应该有不少谬误,还是跟之前一样,先树一个靶子作为进一步学习的基线,欢迎各方指导!

一、MPEG系列视频编码的过程

视频编码过程主要包含两大步骤,第一个步骤是将原始视频信号读取,形成帧结构GOP,即帧内图像I帧、前向预测图像P帧和双向预测图像B帧;第二个步骤是分别针对I帧、P帧、B帧进行编码,形成最终的结果。

(1)帧内图像I(intra-picture),简称为I帧(I-frame)。I帧包含了完整内容的图像,用于为其他帧图像的编解码做参考,这也就是我们常说的关键帧。

(2)预测图像P(predicated picture),简称P帧(P-frame)。P帧是指以它之前出现的I帧或P帧作为参考的图像,而对P帧进行编码,其实就是对它们之间的差值进行编码。

(3)双向预测图像B(bidirectionally-predictive picture),简称B帧(B-frame)。B帧是以在它之前和之后的图像,也就I帧和P帧作为参考的图像。对B帧进行编码,就是对它和I帧、P帧的差值分别进行编码。

这里有一个细节,一些文章的对于P帧的定义是,仅针对它之前的I帧作为参考帧进行差值的编码,去问百度的文言一心多次,会得到两个相反的结果。后经过分析和查证,因为编码时,所有被编码的帧实际上都是有完整图像的,所以应该是针对它之前的I帧或P帧进行差值计算,而不是要到GOP开头找到I帧再进行计算,否则GOP的尾部,差值可能越大。

二、不同格式视频编码在过程中的技术分析

1、I帧编码

(1)MPEG1

MPEG1的I帧编码过程见下图:

I帧压缩编码算法与JPEG的有损压缩算法一致,都是以离散余弦变换DCT为基础。

(2)MPEG2

I帧编码过程与MPEG1相同,主要不同有两点:

一是支持的参数不同,MPEG1的色度采样格式只有4:2:0,而且支持的分辨率很低,PAL制下只有352*288,而MPEG2在此基础上支持4:2:2以及4:4:4,支持分辨率可以到PAL制下的SD(720*576)、HD(1920*1152)。

二是在算法上也有改进,DCT系数采用了更细的量化,MPEG1中DC系数的加权位固定位8,量化范围为(-256,255),而MPEG-2中DC系数的加权位可为8、4、2、1,量化范围可到(-2048,2047)。

DC系数的加权位和量化范围决定了图像亮度的量化精度,越高则整体亮度越接近原始图像,压缩效果更差。

就目前分析的情况看,MPEG2在I帧压缩算法上并没有大的升级,仅仅在参数上有更大的选择余地,所以I帧压缩上质量的提升更多是由于码流提高带来的效果。

在标准的MPEG-2视频编码器中,P帧或B帧以16*16的宏块为单位进行运动估计,获取对应的运动矢量和残差数据,为了保持系统的一致性,减少编码位数以提高编码效率,对I帧的宏块数据进行DCT变换之前也要做类似P帧或B帧宏块的运动估计,因为运动矢量为0,所以每个宏块的亮度或色差元素值都分别减去同一常数(如128)获得残差数据,然后再对这个数据进行DCT变换和编码。

(3)MPEG4 part2

MPEG4编码感觉突然跳出了原来的技术分支,引入了VO视频对象的概念,将整个视频图像进行对象拆分,以VO为基础进行预测和编码,在复杂度上可谓提升了一大步。

但也可能就是这样的原因,导致MPEG4在广播电视的业务上没有得到广泛应用,反而成为网络视频上流行的编码格式。

当然,在编码过程中,因为采用了视频对象化的方法,编码过程与MPEG1/2就有所差别,需要将图像分割成不同的对象,针对视频对象进行形状编码以及纹理编码,形状编码是MPEG4独有的,而纹理编码与MPEG1/2的编码过程非常相似。

MPEG4的形状编码信息有两种格式,二进制格式和灰度格式,二进制格式的每个像素值信息为0或1,指明该像素在VOP之内还是之外,而灰度格式的每个像素有一个表示透明度的值(0~255)。两种格式的帧内编码都采用基于改进的G4传真压缩方法MMR算法。

MPEG4的纹理编码可能采取了与MPEG2不同的DCT变换方式,但并未了解到具体的细节,从14496标准文档上,看到解码时IDCT有一些特别的操作,从而做的推测,还需要进行进一步的学习了解。

(4)H.264(MPEG4 part10)

从H.264开始,抛弃了MPEG4的视频对象编码的模式,重新回到了MPEG1/2的宏块编码。

H.264仍然采用了混合编码技术框架,包括变换、量化和编码三个步骤,不过每个步骤都有了新的技术。

MPEG1/2的宏块都是16*16,而H.264增加了16*8、8*16、8*8等,宏块更小可以更贴近物体的运动模型,计算量增大,但编码效果提升。

在变换上,之前的DCT变换系数矩阵中存在无理数,会产生误差,导致反变换不能完全复原,H.264采用整数余弦变换,可以进行4*4和8*8数据块的计算,反变换时可进行无损还原,提高了视频质量。

在量化参数上,相比MPEG2的31个量化参数,H.264可以提供51个量化参数。

在熵编码环节采用上下文自适应的可变字长编码CAVLC、二进制算术编码CABAC,并采用了内部环路滤波去除DCT变换带来的块效应。

同时,H.264第一次引入了帧内预测,利用图像的空间相关性,提升压缩效率。对于亮度分量,块大小分16*16和4*4两种,16*16有4种预测模式,4*4有9种预测模式;对于色度分量,块大小为8*8,有4种预测模式。

(5)H.265(HEVC)

H.265继续采用混合编码技术框架,包括变换、量化和编码三个步骤,同样在每个步骤都进行了一些改进。

在变换步骤,所有尺寸都可以使用DCT进行变换,对于4*4的帧内预测亮度残差块,使用离散正弦变换DST。

在量化步骤,H.265以变换单元(TU)为基本单位,处理对象包括TU中的亮度分量和色度分量。H.265采用了非线性标量量化,通过量化参数(QP)控制每个编码块的量化步长,QP 和量化步长的关系近似呈指数关系。QP是个整数,亮度分量的QP值范围是0~51,色度分量的亮度QP值范围是0~45。

在编码步骤,H.265使用了CABAC。

H.265也采用了环路滤波技术,在去方块滤波(DBF)的基础上,新增了样点自适应补偿(SAO)。

虽然在编码步骤上没有革命性地革新,但是H.265通过对分块的机制和预测模式的调整,以增加计算量的代价取得了编码质量的提升。

H.265在分块上进行了调整,采用四叉树对视频进行划分,具体见下图,编码树单元CTU相当于H.264的宏块,可以从16*16到64*64,而CTU可以继续划分到编码单元CU、预测单元PU等。

H.265在帧内预测采用了更加丰富的预测块尺寸和预测模式,预测块尺寸在4*4到32*32,所有尺寸的预测块都有35种预测模式。

2、B帧编码和P帧编码(待续)

相对于不同视频编码标准在I帧编码上的“小步改进”来说,B帧和P帧才是体现编码技术发展的核心之一,也是笔者需要进一步学习、了解和分析的。

标签: #基于块的运动估计