在上一篇《音视频一、音视频本质及ffmpeg安装》中介绍了视频文件格式,视频封装格式,音视频编码格式,以及利用ffmpeg验证音视频主要由音频和视频组成。
本章主要是对音视频一些基础概念的理解。
块结构的混合编码
第一种采用 “块结构的混合编码” 方案的编码标准:音视频鼻祖H261。
先看一个例子:假如一个渐变的图片,按像素保存的方式和块结构保存的方式,两种方式对比:
按像素保存的方式:一张200*100的图片,一共需要2万个像素保存,一个像素用RGBA保存,一共8万个字节。
如果换一种方式:图片宽,图片高,起始点(宽、高),终止点(宽、高),起始点颜色(RGBA),终止点颜色(RGBA)。只需要14个字节就能保存这张图片的所有信息,而且能完整还原。
这个例子中,在没有损坏画质的前提下,图片的压缩效果非常好。
音视频中某一帧的图片,肯定不会那么巧,刚好整张图片渐变,但科学家利用这个特点,应用到音频领域编码算法上,以下面这张图片为例:
科学家对图片放大很多倍后的微观层面分析,在图片的一些部分,可以采用渐变处理方法来达到压缩数据的目的,而一些像素差异很大的地方,按他原本的数据进行处理。这样来达到画质在人眼中分辨不出来的效果。人眼对微观分辨没有那么敏感,所以这种处理后,人眼基本感觉不出来。即使放到微观层面,小块并不都是绝对的渐变,但是不影响效果,当然这种编码算法是有损的,权衡利弊之后值得采用。
拓展知识点:实际上存在无损编码格式的应用,电影院采用的
jpeg2000
,它是一种通过存储原图片
的方式进行视频播放,因为它要放大到巨型屏幕上,如果采用压缩编码,还原之后就会出现上图中的情况,为了观影体验,所以没法压缩,当然这不在我们考虑的范围内。
H264压缩技术
了解了块结构混合编码后,理解H264的基本原理其实非常简单,下我们就简单的描述一下H264压缩数据的过程。通过摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。
以下面这张图为例:
划分宏块
H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。
划分好宏块后,计算宏块的象素值。
以此类推,计算一幅图像中每个宏块的像素值,所有宏块都处理完后如下面的样子。
划分子块
H264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。
上幅图中,红框内的 16X16 宏块中大部分是蓝色背景,而三只鹰的部分图像被划在了该宏块内,为了更好的处理三只鹰的部分图像,H264就在 16X16 的宏块内又划分出了多个子块。
这样再经过帧内压缩,可以得到更高效的数据。下图是分别使用mpeg-2和H264对上面宏块进行压缩后的结果。其中左半部分为MPEG-2子块划分后压缩的结果,右半部分为H264的子块划压缩后的结果,可以看出H264的划分方法更具优势。
宏块划分好后,就可以对H264编码器缓存中的所有图片进行分组了。
宏块的划分规则
来源于《H.264视频编码官方中文帮助文档》第6.3节 图像和条带的空间分割
一幅图像如何分割为条带和宏块。图像被划分为条带。条带由一系列的宏块组成,当使用宏块自 适应帧/场解码时则由一系列宏块对组成。
每个宏块均包含一个 16×16 的亮度阵列,当视频格式不是单色时,还包含和两个相应的色度阵列。如果没 有使用宏块自适应帧/场解码,每个宏块代表图像中的一个空间矩形区域。例如,如图 6-7 所示,一幅图像被分为 两个条带。
6.4节 反向扫描过程和相邻数据的推导过程
规定反向扫描过程,例如索引值到位置的映射,以及相邻数据的导出过程。
6.4.1 反向宏块扫描过程
这里我们需要知道的是编码算法会将每帧图片每个宏块都进行扫描。进行计算后,得到最优的划分结果。
6.4.2 反向宏块分割和子宏块分割的扫描过程
如果一个16x16的宏块,数据波动比较大,那我们就接着对宏块进行划分,知道划分成4x4为止。