音视频数据压缩及编解码基础
好文章,来自【福优学苑@音视频+流媒体】
音视频压缩编码基础
音视频为何需要压缩?
压缩编码的分类
常用压缩编码的方法
编码器中的关键技术
预测
量化
变换
熵编码
编解码中的情况
音视频为何需要压缩?
未经压缩的数字视频的数据量巨大
存储困难:一张DVD只能存储几秒钟的未压缩数字视频。
传输困难 : 1兆的带宽传输一秒的数字电视视频需要大约4分钟。
压缩编码的重要性:
数据压缩是通过减少计算机中所存储数据或者通信传播中数据的冗余度,达到增大数据密度,最终使数据的存储空间减少的技术
压缩编码的依据:
1、空间冗余。在很多图像数据中,像素间在行、列方向上都有很大的相关性,相邻像素的值比较接近,或者完全相同,这种数据冗余叫做空间冗余。
2、时间冗余。在视频图像序列中,相邻两帧图像数据有许多共同的地方,这种共同性称为时间冗余,可采用运动补偿算法来去掉冗余信息.
3、视觉冗余。视觉冗余度是相对于人眼的视觉特性而言的,人类视觉系统对图像的敏感性是非均匀和非线性的,并不是图像中的所有变化人眼都能观察到。
4、信息熵冗余。信息熵是指一组数据所携带的信息量,信息熵冗余指数据所携带的信息量少于数据本身而反映出来的数据冗余。
5、结构冗余。在有些图像的纹理区,图像的像素值存在着明显的分布模式。
6、知识冗余。有许多图像的理解与某些先验知识有相当大的相关性。这类规律性的结构可由先验知识和背景知识得到,称此类冗余为知识冗余
常用压缩编码方法的分类
编码器中的关键技术
预测:通过帧内预测和帧间预测降低视频图像的空间冗余和时间冗余。
变换:通过从时域到频域的变换,去除相邻数据之间的相关性,即去除空间冗余。
量化:通过用更粗糙的数据表示精细的数据来降低编码的数据量,或者通过去除人眼不敏感的信息来降低编码数据量。
熵编码:根据待编码数据的概率特性减少编码冗余。
预测编码:
空间预测:利用图像空间相邻像素的相关性来预测的方法
帧内预测技术:利用当前编码块周围已经重构出来的像素预测当前块
Intra图像编码(I帧)
时间预测:利用时间上相邻图像的相关性来预测的方法
帧间预测:运动估计(Motion Estimation,ME),运动补偿(Motion Compensation,MC)
Inter图像编码:前向预测编码图像(P帧),双向预测编码图像(B帧)
帧间预测编码:
采用预测编码方法消除序列图像在时间上的相关性,传送前后两帧的对应像素之间的差值,这称为帧间预测。
帧内预测编码:
I帧图像的每个宏块都采用帧内(Intra)预测编码模式。
宏块分成8x8或者4x4块,对每个块采用帧内预测编码,称作Intra8x8或者Intra4x4。
帧内预测有多个预测方向:水平,垂直,左下,右上。
帧内预测还有直流(DC)预测。
色度块预测还有平面预测。
变换:
变换编码也是去除冗余的一种最基本的编码方法。
不同的是变换编码首先要把压缩的数据变换到某个变换域中(如频域),然后再进行编码。
变换域中表现为能量集中在某个区域,可以利用这一特点在不同区域间有效地分配量化比特数,或者去掉那些能量很小的区域,从而达到数据压缩的目的。
例如声音信号,从时域变换到频域以后,可以清楚的看到能量集中在哪些频率范围内,从而根据频率范围分布有效地分配不同的量化位数。
量化:
量化操作实质上是将连续的模拟信号采样得到的瞬时幅度值映射成离散的数字信号,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示。
量化位数:量化位数是每个采样点能够表示的数据范围,常用的有8位、12位和16位。
量化过程是,先将整个幅值划分为有限个小幅度(量化阶距)的集合,把落入某个阶距内的样值归为一类,并赋予相同的量化值,如图所示,其中虚线箭头表示采样值量化后的电平值。
均匀量化
采用相等的量化间隔对采样得到的信号做量化就是均匀量化,也称为线性量化。
量化后的样本值Y和实际值X的差E=Y-X称为量化误差或量化噪声。
非均匀量化
非均匀量化的基本思想是,对输入信号进行量化时,大的输入信号采用大的量化间隔,小的输入信号采用小的量化间隔,这样就可以在满足精度要求的情况下用较少的位数来表示。声音数据还原时,采用相同的规则。
熵编码:
为了进一步压缩数据,对DPCM编码后的直流系数DC和RLE编码后的交流系数AC采用熵编码。
在JPEG有损压缩算法中,使用哈夫曼编码器的理由是可以使用很简单的查表方法进行编码。
压缩数据符号时,哈夫曼编码器对出现频率比较高的符号分配比较短的代码,而对出现频率低的符号分配比较长的代码。
这种可变长度的哈夫曼编码表可以事先进行定义。为了实现正确解码,发送端和接收端必须采用相同的哈夫曼编码表。
熵与冗余
在所有的实际节目素材中,存在着两种类型的信号分量:即异常的、不可预见的信号分量和可以预见的信号分量。
异常分量称为熵,它是信号中的真正信息。
其余部分称为冗余,因为它不是必需的信息。冗余可以是空间性的,如在图像的大片区域中,邻近像素几乎具有相同的数值。
冗余也可以是时间性的,例如连续图像之间的相似部分。
在所有的压缩系统编码器中都是将熵与冗余相分离,只有熵被编码和传输,而在解码器中再从编码器的发送的信号中计算出冗余。
帧内编码
帧内编码是空间域编码,利用图像空间性冗余度进行图像压缩,处理的是一幅独立的图像,不会跨越多幅图像。
空间域编码依赖于一幅图像中相邻像素间的相似性和图案区的主要空间域频率。
JPEG标准用于静止图像(即图片),只使用了空间域压缩,只使用帧内编码。
帧间编码
帧间编码是时间域编码,是利用一组连续图像间的时间性冗余度进行图像压缩。
如果某帧图像可被解码器使用,那么解码器只须利用两帧图像的差异即可得到下一帧图像。
比如运动平缓的几帧图像的相似性大,差异性小,而运动剧烈的几幅图像则相似性小,差异性大。
当得到一帧完整的图像信息后,可以利用与后一帧图像的差异值推算得到后一帧图像,这样就实现了数据量的压缩。
时间域编码依赖于连续图像帧间的相似性,尽可能利用已接收处理的图像信息来“预测”生成当前图像。
MPEG标准用于运动图像(即视频),会使用空间域编码和时间域编码,因此是帧内编码和帧间编码结合使用。
运动矢量
一组连续图像记录了目标的运动。运动矢量用于衡量两帧图像间目标的运动程度,运动矢量由水平位移量和垂直位移量二者构成。
运动补偿
目标的运动降低了图像间的相似性,增加了差异数据量。
而运动补偿则通过运行矢量来降低图像间的差异数据量。
下图为运动补偿的示意图。当某一目标运动时,其位置会变化但形状颜色等基本不变。
编码器则可利用运动矢量减低图像差值,解码器根据图像差值中的运动适量移动目标到合适的位置即可。
假设图中是理想情况,目标除移动位置外其他任何属性无任何变化,则两幅图像间的差值仅包含运动矢量这一数据量。
显然运动补偿可以显著减少图像差值数据量。
双向预测
先看示意图:
连续的三幅图像中,目标块有垂直位置上的移动,背景块无位置移动。
我们考虑如何取得当前帧图像(画面N):
画面N中,目标向上移动后,露出背景块。
画面N-1中,因为背景块被目标块遮挡住了,因此没有背景块相关信息。
画面N+1中,完整包含背景块的数据,因此画面N可以从画面N-1中取得背景块。
如何可以得到画面N呢?
解码器可以先解码得到画面N-1和画面N+1,通过画面N-1中的目标块数据结合运动矢量即可得到画面N中的目标块数据,通过画面N+1中的背景块数据则可得到画面N中的背景块数据。
三幅画面的解码顺序为:N-1, N+1, N。
三幅画面的显示顺序为:N-1, N, N+1。
画面N通过其前一幅画面N-1和后一幅画面N+1推算(预测,predicted)得到,因此这种方式称为双向预测(或前面预测、双向参考)。
I帧/IDR帧/P帧/B帧
I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在I帧图像处可以切换频道,而不会导致图像丢失或无法解码。I帧图像用于阻止误差的累积和扩散。在闭合式GOP中,每个GOP的第一个帧一定是I帧,且当前GOP的数据不会参考前后GOP的数据。
IDR帧:IDR帧(Instantaneous Decoding Refresh picture, 即时解码刷新帧)是一种特殊的I帧。当解码器解码到IDR帧时,会将DPB(Decoded Picture Buffer,指前后向参考帧列表)清空,将已解码的数据全部输出或抛弃,然后开始一次全新的解码序列。IDR帧之后的图像不会参考IDR帧之前的图像。
P帧:P帧(Predictive-coded picture, 预测编码图像帧)是帧间编码帧,利用之前的I帧或P帧进行预测编码。
B帧:B帧(Bi-directionally predicted picture, 双向预测编码图像帧)是帧间编码帧,利用之前和(或)之后的I帧或P帧进行双向预测编码。B帧不可以作为参考帧。
GOP
GOP(Group Of Pictures, 图像组)是一组连续的图像,由一个I帧和多个B/P帧组成,是编解码器存取的基本单位。
GOP结构常用的两个参数M和N,M指定GOP中首个P帧和I帧之间的距离,N指定一个GOP的大小。
例如M=1,N=15,GOP结构为:IPBBPBBPBBPBBPBGOP有两种:闭合式GOP和开放式GOP:
闭合式GOP:闭合式GOP只需要参考本GOP内的图像即可,不需参考前后GOP的数据。这种模式决定了,闭合式GOP的显示顺序总是以I帧开始以P帧结束。
开放式GOP :开放式GOP中的B帧解码时可能要用到其前一个GOP或后一个GOP的某些帧。码流里面包含B帧的时候才会出现开放式GOP。
开放式GOP和闭合式GOP中I帧、P帧、B帧的依赖关系如下图所示:
DTS和PTS
DTS(Decoding Time Stamp, 解码时间戳),表示packet的解码时间。
PTS(Presentation Time Stamp, 显示时间戳),表示packet解码后数据的显示时间。
音频中DTS和PTS是相同的。
视频中由于B帧需要双向预测,B帧依赖于其前和其后的帧,因此含B帧的视频解码顺序与显示顺序不同,即DTS与PTS不同。
当然,不含B帧的视频,其DTS和PTS是相同的。
下图以一个开放式GOP示意图为例,说明视频流的解码顺序和显示顺序
采集顺序指图像传感器采集原始信号得到图像帧的顺序。
编码顺序指编码器编码后图像帧的顺序。存储到磁盘的本地视频文件中图像帧的顺序与编码顺序相同。
传输顺序指编码后的流在网络中传输过程中图像帧的顺序。
解码顺序指解码器解码图像帧的顺序。
显示顺序指图像帧在显示器上显示的顺序。
采集顺序与显示顺序相同。编码顺序、传输顺序和解码顺序相同。
图中“B[1]”帧依赖于“I[0]”帧和“P[3]”帧,因此“P[3]”帧必须比“B[1]”帧先解码。
这就导致了解码顺序和显示顺序的不一致,后显示的帧需要先解码。
好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***