上一节我们讨论了音视频开发领域中最基础的知识,而音视频领域的知识结构多而杂,只用短短的几章不足以全部讲解,本章接上一章继续讲解音视频领域中最基础的知识点,多为一些概念性的知识,但也有部分知识需要理解其原理,才能真正的掌握。
我们所看到的图像是由显示器等图像输出设备根据色彩的不同或者颜色强度的不同组合而成而一个个像素点构成,这么说是不是有些抽象?那我们可以用一个例子来简要的说明一下,不知道大家是否有这样的经历:比较老的彩色电视或者手机等彩色显示设备,不小心滴上了一滴水,我们可以透过这个水滴看到几种不同的颜色,这是因为水滴相当于一个透镜,将那一小部分的屏幕放大了,放大后就会看到如图1所示的样子:
我们可以看到,电视机显示器其实是由一个个的不同色彩的小块块组成,红绿蓝三种色彩的小块交替排列,这样微观上是一个个栅栏一样的小块,而我们视力无法看到这么细致,因此宏观上看上去就将这些不同色彩的小块构成了不同色彩的最终像素点,那么为什么利用红绿蓝三种色彩就可以表现出如此多的颜色呢?那就不得不说一下RGB图像表示原理了,RGB是工业界一种应用广泛的图像表示标准,其中R代表红色(Red)、G代表绿色(Green)、B代表蓝色(Blue),利用这三种颜色改变其不同的强度值,即可显示出几乎人类视觉所感知的所有颜色(不得不佩服人类的智慧),这样通过0~255这样的256的值表示色彩强度从低到高,将三种颜色调节其强度,即可得到最终的色彩,三种颜色,每种颜色有256级强度,因此理论上所得到的色彩种类可达到 256 * 256 * 256 即 16,777,216 种,这样我们可以得知,三种颜色强度所表示的像素点,每个像素点的存储都需要8 bit * 3 = 3字节(256=28),而如此以来一张1920 * 1080的图像采用 RGB888 进行存储需要 1920 * 1080 * 3 = 5.933MB,而我们知道,视频是由一帧一帧的图像连续播放而成的,若视频的帧率为25fps,那么一部90分钟的电影存储空间需要占用782.183GB,如此大的媒体文件显然我们很难对其进行存储和传输(虽然不都是 RGB888 ,还有RGB565 、RGB555 等),显然这太大了,不利于音视频的存储与传输,因此必然需要对其进行压缩,此外,我们接下来将学习一种适用于视频的颜色编码方式——YUV格式,YUV只需要占用RGB一半的带宽,即可达到较好的效果。
有的小伙伴可能感到奇怪了,RGB根据描述每个像素点的色彩,来表示一幅图像,那么黑白电视机这种显示设备的存在是如何进行工作的呢?我们已经知道了,RGB通过不同的颜色强度构成不同的色彩,而不同颜色的像素点构成了一幅具有多种颜色的图像,但是黑白电视机似乎通过黑白灰也能表示出图像的细节,虽然没有色彩,但是也能看出显示的分别是什么东西,其实,通过YUV格式的理解,我们可以很清楚地明白,图像 = 明亮度(也可以叫灰阶值) + 色度,明亮度即可表示出图像的细节,色度用来表示图像的色彩,这样黑白电视机即可通过明亮度对图像细节进行显示,而彩色显示设备,只需要在细节的基础上,对图像的色彩以及饱和度进行渲染即可显示出彩色图像,同时,YUV分量还与采样方式有关,常用的采样格式有YUV444、YUV422、YUV420等。
以YUV444格式为例,planar格式和packed格式是YUV编码的两种存储格式,其中planar格式是按照像素点的顺序,将Y、U和V分量分开,按照顺序分别进行存储,如图2左半图所示;packed格式的存储方式可理解为将每个像素的Y、U和V分量打包,然后针对每个像素点将YUV信息按顺序进行存储,如图2右半图所示。
这几种YUV格式指的是采样格式中Y分量和UV分量之间的关系,YUV4:4:4格式指的是完全取样,这种采样格式下每1个Y分量都对应1组UV分量,而YUV4:2:2格式指的是每2个Y分量对应1组UV分量,同样,YUV4:2:0格式每4个Y分量对应1组UV分量,其实这里需要强调一下,YUV后边的三个数值并不是指Y、U、V三个分量,而是指像素采样关系,这里非常重要,一定要弄明白:
如图3(引自论文Chrominance Subsampling in Digital Images)所示,YUV a : b : c格式中,a指的是采样中的单位采样块为一个水平为a个像素,竖直为2个像素的采样块,b指的是在第一行中对b个像素点进行采样,c指的是在第二行中对c个像素点进行采样,如YUV 4:2:0格式中,采样时以4*2像素大小作为采样块,采样块第一行中对两个像素点进行采样,第二行中不采样。
在1.2.1中,我们计算了一部90分钟、帧率为25fps、1920*1080分辨率的电影的存储大小为782.183GB,这对于存储和传输来说太大了,如果利用YUV4:2:0格式进行编码,每个像素应该存有Y分量1Byte,UV分量0.5Byte,每一帧图片的大小应为1920 * 1080 * (1 + 0.5) = 2.966MB,这样一部同等参数的电影大小应为90 * 60 * 25 * 2.966 = 391.025GB,虽然还是很大,不便于传输和存储,但相较于RGB888格式编码,已经减小了近一倍的文件大小。
在视频编码过程中,每一帧都是一个图片,连续的图片流播放便构成了视频,但是视频中的场景、动作都是连续的,且短时间内并不会发生太多的变化(小时候我们都玩过翻页动画,每一张动画都有一点点不同,但是快速翻动,就能看到连贯的动作,和这里的道理一样),那么我们可以收到启发,只需要复制前一个图片,改动较少的部分,就可以得到下一帧,这样我们就可以避免每一帧都占有较大的存储空间或带宽,同时,再次以翻页动画为例,我们在发现卡顿的时候,可以在中间补上一张,起到一个中和的作用,即可消除卡顿的现象,这样就引出了I帧、P帧和B帧的概念。
I帧即帧内编码图像帧,听起来是不是很晦涩,但只需要记住,I帧是由自己即可解码出完整图像的帧即可,视频总要有一个开始播放的开头帧,这个帧无法从别处获取信息,因此一段视频开头的帧必定是I帧,关于其他的特性,我们在往后的文章中深入讨论。
P帧为前向预测编码图像帧,P帧的解码需要前向的帧提供信息,在加上编码信息,解析出完整的图像,这样在P帧里可以借助前向帧,就可以减少大量的重复信息编码,即对视频进行了有效的压缩。
B帧是双向预测编码图像帧,前边我们说过,如果视频卡顿,可以在卡顿的两帧中间增加一帧,用于中和双向之间的卡顿,但是这一帧既需要前向帧信息又需要后向帧信息,因此不宜解码,但由于其借助前后向帧,其所需要记录的信息更少,因此压缩率是最高的。
I帧、P帧和B帧的核心思想即给出一个一个初始信息,后续的图像记录为图像的改变(P帧)与两帧间的过渡信息(B帧),这样就实现了视频的压缩与编码,由于篇幅原因,本章中对其特点说明不详细,但入门阶段只需要理解这些即可,后续随着学习的深入,我会对这些原理进行深入的介绍。
音频的压缩编码核心思想即略去音频中的冗余信号,所谓冗余信号,即对我们接受声音信息的过程中有没有都不会产生太大影响的信号,举个例子,假如我们去听演唱会,前边的小情侣在说悄悄话,在理论上来说悄悄话的信息也会在一定范围内进行传播,我们在后排其实也是可以接收到这个音频信号的,但对我们听偶像唱歌有影响吗?几乎没有,甚至根本不会影响到我们,小情侣的悄悄话就可以成为冗余信息,这些冗余信息虽然对我们造不成影响,但是在音频采集时还是会被记录下来,造成存储空间的无效占用,这些冗余信息我们完全可以用盖过它们的声音替代掉,这就是音频的掩蔽效应,音频编码过程中,我们可以采用掩蔽效应进行音频的压缩等操作。
频谱掩蔽效应即在同一频率下,强音信号会掩蔽掉弱音信号,因此在一定阈值内,可以将部分弱音信号直接剔除,这样就完成了音频数据的压缩。
当我们在一段强音信号中加入一小段弱音信号(很短,但是这种现象很多),我们也听不到这个弱音信号的,这就是音频的时域掩蔽效应,这些弱音信号也可作为冗余信号剔除。
本章我们介绍了音视频开发基础的剩余内容,虽然没有对所有基础知识进行全面、详尽的介绍,但是对于接下来音视频的学习能够有一定的理论基础了(当然有些较为复杂或者七七八八的基础理论还要在后面的章节随着深入的学习进行介绍),由于本人也是在学习中记录,因此难免有介绍不周到的地方,欢迎小伙伴们随时评论或者私信我,我会及时进行修正,以把文章最好的一面呈现出来。