25 June 2013

从今天起,我将在此记录自己学习视频编码的过程,希望能写成一个系列的博客,和大家分享自己的学习经历。如有不足,欢迎讨论。

H.264/AVC,是一种视频压缩标准,被广泛使用的高精度视频的录制、压缩和发布格式。作为初学者,H.264拥有大量的技术细节,让我们无从下手。其实,对于一门复杂的技术,我们先要掌握其大的框架,拥有了一个整体概念后在逐个难题击破。我们来看一个最简单的视频编码框图:

从图中可以看到,原始视频流经过时域模型处理后,输出两路数据:残差和向量(不明白不要紧,后面我们会说到)。残差经过空域模型输出一系列系数,系数和向量一起进入熵编码器,最后输出编码后的数据。

我们从左到右一个一个看看每一部分都有什么用。

1.时域模型:时域模型主要作用是消除时间冗余,那么它是如何消除时间冗余的呢?这就涉及到了一个重要的技术——运动补偿技术。我们来举一个非常简单的例子,我们传输视频是一帧一帧的传输,如果不做任何处理,每一帧就要整体全部传输过去,当然起不到任何的压缩效果。由于每一帧与前后帧存在相关性,相当于我们有很大一部分重复传输了,聪明的你可能也会想到,我们将重复的部分传输一次就好,这样就起到了压缩的效果。那么,我们取前一帧作为预测帧,用当前帧与预测帧相减,得到的就是残差(图中的存储的帧就是用来存储这些预测帧的)。很明显,残差的能量要小的多,数据量大大的减少了。假设第一帧画面中有一个人,第二帧他基本没有动,则残差非常小,那如果他移动的位移较大呢?实际上,H.264将每一帧分为M×N大小的宏块,通过在参考帧中寻找最优匹配的宏块,假设第一帧一个人从A位置移动到B位置,那么这个A位置(宏块)就是B位置的最优匹配宏块,做差得到残差宏块。第一帧的人从A位置移动到B位置,那么这个相对位移需要记录下来,这就是向量的作用了(运动矢量)。

2.空域模型:与时域模型作用类似,是用来消除空间冗余的,消除方法就是经过处理,使数据有尽可能多的零值。这里会用到频域变换,量化等技术。这些技术不明白没关系,以后慢慢学,反正知道输出了一系列的系数,里面有大量的零值。

3.熵编码器:熵编码器主要用来对输入的数据(运动矢量和变换系数)进行熵编码,消除统计冗余(比如某一部分数据出现10个0,我们把它编码到尽量短的码字中)。熵编码完成后输出的就是编码后的数据。

解码过程其实就是上述编码过程的反过程,在此不多叙述。怎么样,对视频编码大体有个概念了吧?其实H.264后面有大量的技术细节需要掌握,作为新手,任重而道远啊。

附加问题:图像的组成

一幅图像就是一帧或者一场。我们知道,一段视频并不是连续的,而是由许多离散的画面连续播放,利用人的视觉暂留,达到连续的效果。你可以认为这一幅一幅的画面就是帧。而场只是在空间上的奇数行和偶数行组成。这里需要提到两种采样方法,逐行采样和隔行采样。顾名思义,逐行就是一帧无论奇数行还是偶数行,都保留下来。而隔行采样则每隔一帧(每一帧分为两个场:顶场和底场)只采样奇数行或偶数行,奇偶间隔。根据百度百科(隔行扫描):

但是这种方法(隔行采样)造成了两幅图像显示的时间间隔比较大,从而导致图像画面闪烁较大。 因此该种扫描方式较为落后,通常用在早期的显示产品中。

看起来,隔行采样已经属于落后的技术了。



blog comments powered by Disqus