经典视频编解码框架理解

来源:互联网 发布:剑灵动漫捏脸数据 编辑:程序博客网 时间:2024/04/29 06:28

(本人原创,欢迎转载,但希望附上原文链接,谢谢)
前言

经典的视频编解码标准有H.264和HEVC,这两种标准的编码框架(见图1)大致相同,只是其中某几个模块的技术得到了一定的发展,目前在研究的H.266也是基于这个基本框架,在用成百上千次的运算复杂度去获取一点点的编码效率提升。
图1 经典视频编码框架
图1 经典视频编码框架
具体理解
1. 总体把握
这个框架,左上角是我们输入的视频,其实也就是描述一个运动的多帧图像的集合,这段视频要经过中间的盒子进行编码,再进行解码;右下角是解码输出的视频序列。
整个编码过程有一个编码控制,控制一些模式的参数,比如说四叉树的划那些块需要再划分,哪些块不需要,这些都是控制参数,具体的包括对帧内预测、帧间预测、变换、量化的一些控制参数,最后需要传给解码端。
对一段视频序列的处理,首先是从第一帧图像开始。对这幅图像进行slice行划分,再进行块划分,最小单元是编码单元(coding unit)。第一帧图像的编码是从左上角第一个块开始的,然后再按照zigzag之字形的路线进行下一个块的编码,这样保证接下来每一个块都能够参考左边和上面的编码块,提升帧内预测的性能。
第一帧图像编码完成以后,就是下一帧图像的编码。此时,图像既可以做帧内预测,也可以做帧间预测,因为前一帧的图像已经编码完成,就可以拿来作为预测帧。帧内预测与上一段的过程大致相同;帧间预测呢,因为视频序列一般都会描述运动情况,所以为了提高帧间预测性能,我们要对运动情况也做一个预测,这就涉及到运动估计和补偿。运动估计,从字面上讲,其实就是估计预测我的运动,那参照的肯定是我当前帧的前一帧图像了。对于我目前编码块来说,去前一帧当中搜索与我这个编码块最相近的块,然后对比就得出运动矢量,衡量出这两帧的运动情况。搜索相近块的方法有很多,也有很多快速算法,感兴趣的可以去针对性的学习。运动补偿呢,就是得到了运动矢量,去前一帧图像当中取出这个和我最相近的块,因为这个参考块是不会传到解码端的,只有运动矢量会传到解码端,所以根据运动矢量去解码端解出来的前一帧图像中取出那个最相近的块,这个块就是我的预测块,再去相减得到残差完成帧间预测。
然后重复上面的过程,完成视频序列中所有帧的处理,在解码端解码就可以了。
有一个重点,要敲一敲黑板。那就是编解码预测块要选择统一的问题了。比如,视频序列第一帧的第一个块,预测值是提前置入的128,在解码的时候把残差加上128就恢复了信息;解码端第二个块在做预测的时候,是以第一个块作为预测块,但一定是以第一个块的解码块作为预测,再把残差送入编码器编码,最后在解码器处理。此时解码端,把前一个块解出来,加上此时的残差,得到我当前块的解码块。这样编码端和解码端的误差就只来自于残差在编码过程中的损失。如果,再对第二个块编码时,以第一个块的原始块作为预测,把这部分残差去做编码;在解码端得到这个处理后有失真的残差,在把前一个块进行解码得到解码块,两者相加得到第二个块的解码块。这样,误差就由两部分组成,残差编码前后的失真和前一个块编码前后的失真,误差一步一步累计,最后会严重影响编码质量。所以,在编码器当中,也要有解码部分,图中虚线框就是解码器的部分。
解码端的处理,其实就是编码的反过程,但处理顺序相反。编码的第一步是预测,再是变换、量化、编码。所以在解码端要先对残差做个熵解码,再做反量化、反变换,得到处理后的残差。再对前一个图像块做解码,这就是当前块预测块的信息。把残差加上预测块的信息,就实现了解码的全过程。
2. 编码序列第一帧第一个块的处理
第一帧图像的第一个块,块信息要传给编码控制端,决定此时的一些模式参数,这些模式控制着伺候的预测、变换、量化和熵编码。
接下来就是做预测的过程,此时只有帧内预测,没有帧间预测。由于是第一个块,没有其他块可以参考,但为了减少编码信息量,我们就选择像素的中间值128作为参考值,“帧内预测模块”会把此时的块和128做差值,这就是残差。残差再经过变换、量化,此时的残差值,会存到两个buffer里,一个是放在熵编码前,最后进行熵编码;一个是反量化前,最后用来解码给下一个块作为预测。 熵编码后就得到我们编码的码流。熵编码是无损过程,量化和变换都是有损过程。此时的编码码流中,包括编码好的残差值和控制数据
3. 编码序列第一帧第二个块的处理
第一帧第二个块,只有帧内预测,也没有帧间预测。但此时做帧内预测,就可以把前一个块作为参考,但要注意是前一个块的解码块作为预测值。所以,编码路线相当于第一帧第一块来说,多了把上一个块熵编码之前的残差做反量化和反变换。此时的编码码流中,包括编码好的残差值和控制数据
4. 编码序列第一帧其他块的处理
其他块的处理,顺序是按照zigzag的顺序,如图2所示;具体处理和之前所讲的基本相同。
图2 块的编码顺序
图2 块的编码顺序
5. 编码序列第二帧第一个块的处理
第二帧第一个块,有帧内预测和帧间预测。帧内预测是把128作为预测值,帧间预测是去前一帧当中搜索最相近的块先做运动估计,再做运动补偿得到残差值。然后变换、量化,此时残差值存入buffer,再做熵编码。此时的编码码流中,包括编码好的残差值、运动数据和控制数据。
6. 编码序列第二帧第二个块的处理
第二帧第二个块的处理和第二帧第一个块基本相同,但帧内预测的参考值不同,此时的参考值是第一个块的解码值。
7. 编码序列第二帧其他块的处理
其他块的处理,顺序是按照zigzag的顺序,具体操作和之前所讲的基本相同。
8. 编码序列其他帧的处理
编码序列的其它帧就是迭代重复上述过程,难的开头做完了,后面就是迭代重复啦。
至此,编解码基本框架就介绍结束啦。我们下期同一时间再见~

5 0