一、说明
当你正在观看你最喜欢的节目,出现缓冲的时候,这是什么原因?当 Wi-Fi 带宽不足以下载传输视频流所需的数据时,就会发生缓冲。也有可能是视频网站发布了未压缩版本的视频文件,因此视频文件太大而无法流畅地流式传输。
在高清模式下,图像分辨率为1080x1920像素,如果我们想象一个视频由许多这些图像组成,称为帧,那么 Wi-Fi 连接必须多快才能播放24帧/秒?
答案是超1000兆,没错。由于每一帧都是48兆比特的数据,它实际上需要48×24每秒兆比特 (Mbps) 以观看视频24帧/秒。但大多数高清视频在10兆Wi-Fi速度下都能很好地传输。
二、视频压缩
1、简述
这是通过视频压缩实现的。
视频压缩是使用算法来减少在视频文件中传达视觉信息所需的数据量。
从编辑软件导出文件时,通常 使用压缩算法(如 JPEG、MPEG 或 H.264)对其进行编码。下载或查看时,相应的解压缩算法会对 压缩文件进行解码,以便查看图像或播放视频。
视频压缩通过减少单个帧中的数据量(称为帧内编码)和减少多个帧中的数据(称为帧间编码 )来工作。
帧内编码使用图像压缩技术单独压缩每个帧。
MJPEG 视频压缩算法正是这样做的,将每个帧视为单独的图像并对其进行压缩。MJPEG可以实现大约10:1压缩,所以我们的48Mb 高清帧可以降低到4.8Mb。这样的压缩足以传输高清视频吗?
可以。
如果每个帧是4.8Mb,它仍然需要Wi-Fi速度4.8×24Mbps 以流畅地传输。
今天,网络上的大多数视频都是使用 H.264 压缩的(新一代H.265也有使用,但是相对还是少一点),H.264是一种强大的算法,结合了帧内和帧间编码以实现200:1压缩。
鉴于 MJPEG 和 H.264 之间的压缩能力差异,帧内压缩和帧间压缩哪个似乎更强大?
答案是帧间压缩。没错。H.264 和其他现代算法的强大功能来自帧间压缩的进步,这使得 H.264 能够实现200:1压缩比。
让我们看看帧间压缩是如何工作的。
2、Macroblocks(宏块)
这些帧非常相似。我们如何减少显示它们所需的数据量?
我们只存储帧之间的变化。没错。
在类似的帧序列中,我们只需要完全存储第一帧。该算法可以根据它们与前一帧之间的相似性来预测后续帧。
帧间编码记录帧如何变化,而不是完全存储每个帧。
首先,编码器将它试图预测的帧(我们称之为当前帧)划分为宏块 - 矩形像素组。
除非前一帧来自完全不同的场景,否则当前帧中的大多数宏块都可以与前一帧中的像素组匹配。而且,这正是编码器试图找到的。
编码器使用块匹配算法来查找前一帧中宏块的最佳拟合匹配。
识别匹配区域后,编码器需要哪些信息才能从前一帧生成当前帧?
没错。要生成预测帧,编码器需要知道当前帧中的宏块来自前一帧的位置。
箭头或运动矢量描述当前帧中的宏块在上一帧中的位置。确定宏块的运动矢量的过程称为运动估计。
让我们看看如何使用它来预测帧。
3、运动补偿和残差
到目前为止,我们已经将要编码的帧划分为宏块,使用匹配算法查找前一帧中的匹配区域,并计算运动矢量来描述宏块的来源。,当这种情况发生时:
我们可以使用运动矢量和前一帧重建当前帧吗?
实际上,我们可以。
运动矢量描述当前帧中的宏块在前一帧中来自何处。编码器可以使用此信息来创建运动补偿帧。
运动补偿帧足以单独使用吗?不能,我们还需要原始帧的一些信息,进行修复运动补偿帧。
为了在不显著增加数据的情况下提高图像质量,我们必须包含来自全分辨率当前帧的一些信息。
下面是显示运动补偿帧和原始帧的不同之处。
残差图像(有时称为预测误差)存储运动补偿帧与原始帧之间的差异。
残差图像残余通常比原始帧小几百近千倍。
压缩的视频文件包含序列中的第一帧、运动矢量和残差图像。
4、小结
播放压缩视频时,解码器使用运动矢量和第一帧创建运动补偿帧,然后将残余图像添加到运动补偿帧中以纠正预测错误。
现代视频压缩算法能够使用帧间编码实现高压缩率,该编码使用运动矢量和残差预测帧。这使我们能够以最少的缓冲观看和共享视频。