音视频基础知识-图像篇

1. 图像的数值表示

1.1 RGB

  • 浮点表示:取值范围为0.0~1.0,在 OpenGL ES 中对每一个子像素点的表示使用的就是这种表达方式

  • 整数表示:取值范围为0~255或者00~FF,8个 bit 表示一个子像素,32个 bit 表示一个像素,这就是类似于某些平台上表示图像格式的 RGBA_8888 数据格式。比如,Android平台上RGB_565的表示方法为16 bit 表示一个像素,R用5个 bit 来表示,G用6个 bit 来表示,B用 5个 bit 来表示

对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张 1280×720的RGBA_8888图像的大小,可采用如下方式:

1280 * 720 * 4 = 3.516MB

这也是位图(bitmap)在内存中所占用的大小,所以每一张图像的裸数据都是很大的。对于图像的裸数据来讲,直接在网络上进行传输也是不太可能的,所以就有了图像的压缩格式,比如JPEG压缩:JPEG是静态图像压缩标准,由ISO制定。JPEG图像压缩算法在提供良好的压缩性能的同时,具有较好的重建质量。这种算法被广泛应用于图像处理领域,当然其也是一种有损压缩。在很多网站如淘宝上使用的都是这种压缩之后的图片,但是这种压缩不能直接应用于视频压缩,因为对于视频来讲,还有一个时域上的因素需要考虑,不仅仅要考虑帧内编码,还要考虑帧间编码。视频采用的是更成熟的算法,有兴趣的朋友可以自行展开了解。

1.2 YUV

对于视频帧的裸数据表示,其实更多的是YUV数据格式的表示, YUV主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电 视。与RGB视频信号传输相比,它最大的优点在于只需要占用极少的频 宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度 (Luminance或Luma),也称灰阶值;而“U”和“V”表示的则是色度 (Chrominance或Chroma),它们的作用是描述影像的色彩及饱和度, 用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将 RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面——色调与饱和度,分别用Cr和Cb来表示。其中,Cr反映了RGB输入信号 红色部分与RGB信号亮度值之间的差异,而Cb反映的则是RGB输入信 号蓝色部分与RGB信号亮度值之间的差异。

之所以采用YUV色彩空间,是因为它的亮度信号Y和色度信号U、 V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解 决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电 视信号,最常用的表示形式是Y、U、V都使用8个字节来表示,所以取值范围就是0~255。在广播电视系统中不传输很低和很高的数值,实际 上是为了防止信号变动造成过载,因而把这“两边”的数值作为“保护 带”,不论是Rec.601还是BT.709的广播电视标准中,Y的取值范围都是 16~235,UV的取值范围都是16~240。

YUV最常用的采样格式是4:2:0,4:2:0并不意味着只有Y、Cb 而没有Cr分量。它指的是对每行扫描线来说,只有一种色度分量是以 2:1的抽样率来存储的。相邻的扫描行存储着不同的色度分量,也就是 说,如果某一行是 4:2:0,那么其下一行就是4:0:2,再下一行是 4:2:0,以此类推。对于每个色度分量来说,水平方向和竖直方向的 抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特 量化的视频来说,8×4的一张图片需要占用48字节的内存(如下图所 示)。


yuv.png

相较于RGB,我们可以计算一帧为1280×720 的视频帧,用 YUV420P 的格式来表示,其数据量的大小如下:

1280 * 720 * 1 + 1280 * 720 * 0.5 = 1.318MB

如果 fps 是24,按照一般电影的长度90分钟来 计算,那么这部电影用 YUV420P 的数据格式来表示的话,其数据量的大小就是:

1.318MB * 24fps * 90min * 60s = 166.8GB

所以仅用这种方式来存储电影肯定是不可行的,更别说在网络上进行流媒体播放了,那么如何对电影进行存储以及流媒体播放呢?答案是需要进行视频编码。

2. 视频编码

视频压缩是通过去除冗余信息来进行压缩的。相较于音频数据,视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息。使用帧间编码技术可以去除时间上的冗余信息,具体包括以下几个部分:

  • 运动补偿:运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,它是减少帧序列冗余信息的有效方法。
  • 运动表示:不同区域的图像需要使用不同的运动矢量来描述运动信息。
  • 运动估计:运动估计是从视频序列中抽取运动信息的一整套技术。

使用帧内编码技术可以去除空间上的冗余信息。

前面有提到过图像编码标准JPEG,对于视频,ISO同样也制定了标准:Motion JPEG即MPEG,MPEG算法是适用于动态视频的压缩算法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,这样可以大大提高视频的压缩比。截至目前,MPEG的版本一直在不断更新中,主要包括这样几个版本:MPEG1(用于VCD)、 MPEG2(用于DVD)、MPEG4 AVC(现在流媒体使用最多的就是它了)。

相比较于ISO制定的MPEG的视频压缩标准,ITU-T制定的H.261、 H.262、H.263、H.264一系列视频编码标准是一套单独的体系。其中,H.264集中了以往标准的所有优点,并吸取了以往标准的经验,采用的是简洁设计,这使得它比 MPEG4 更容易推广。现在使用最多的就是 H.264 标准,H.264创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/4、1/8)和新一代的环路滤波器,这使得压缩性能得到大大提高,系统也变得更加完善。

你可能感兴趣的:(音视频基础知识-图像篇)