视频压缩在干嘛?看懂H.264、H.265、VP9等视频的文件瘦身原理

无论我们使用手机拍摄视频,或是通过YouTube、Netflix观赏视频,这些文件都会经过压缩手续,来节省存储空间与传输流量,然而视频压缩的原理是什么,或是目前大家会遇到林林总总的文件编码格式,是不是让你觉得眼花缭乱,就让我们一起来看看这些技术背后的原理吧。

其实计算机存储数字图片的方式很简单,但在说明其原理之前,笔者想要先介绍一下点描派艺术大师秀拉,他通过堆砌色点的方式绘画,当观赏者与图画保持较长距离时,因为不容易看清楚每一个色点,所以就会感觉是一幅正常的画作。

数字图片的原理与点描画很接近,计算机会通过存储很多色点的方式记录像像,不过在计算机领域会以“像素”(Pixel,也可称为像素)称呼色点,画面上的每个像素除了有固定位置外,还记录了红、绿、蓝等3原色的信息(即RGB信息),当累计足够多像素之后,就能拼凑出细腻的画面。

以Full HD的图片为例,它的分辨率为1920 x 1080,代表,画面上会有宽1920个像素、高1080个像素,通过共207万3600个像素记录像像。

《大碗岛的星期日下午》是点描派大师秀拉最具代表性的画作之一。

将画作放大来看,可以发现是由许多色点所构成。

45 x 30分辨率(共1,350像素)的图片因像素太少,所以相当粗糙。

若把分辨率提升至720 x 480(共345,600像素),由更多像素组合出的图片就清晰许多。

目前主流的Full HD的分辨率为1920 x 1080,代表宽、高分别有1920、1080个像素,虽然不及更高端的4K分辨率,但已经能够提供高画质的视觉体验。

目前常见的颜色采样深度为24bit,代表分别使用8个位元存储RGB信息,因此3原色可以有256种不同色阶变化,组合起来共可呈现16,777,216(约1677万)种颜色。

由于每个像素需占用24bit,所以存储Full HD画面上的200多万个像素总共需要的存储空间如下

1920 x 1080 x 24 = 6,220,800bit

,若以无压缩的BMP格式存储这种图片,则需额外加上54 bit的档头资料,总共会占用5.93MB左右的存储空间。

在不压缩画面的情况下,光是存储1张静态画像就会占用不少空间,若以60FPS的视频为例,每秒存储60张画面,就需占用356MB左右,这样下来1个小时的视频的画面部分(不含声音信息),就会占用约1.22TB的存储空间。

这样无论是对于存储或是传输视频来说都是很大的负担,举个例子来说,如果我们以手机拍摄无压缩、Full HD、60FPS视频,那么64GB的空间大约只够存储3分钟的视频,若以10GB的移动上网流量观赏流媒体视频,则只能观看28秒视频,看来不把视频压缩一下真的让人吃不消。

24bit虽然可以还原美丽的色彩,在未压缩的情况下存储静态画像就耗费不少空间。

降低颜色采样深度虽然可以节省存储空间,但也会大幅折损色彩表现,图为16色范例。

从上面的范例可以看到,降低颜色采样深度并不是个可行的解决方案,所以我们需要使用其他方式压缩视频以节省容量,由于这个部分牵扯到许多艰深的图片处理技术,会让文章内容太过发散,所以笔者仅以概念性的方式解说视频压缩的原理。

由于视频是由许多静态图片组合而成,所以压缩的过程首先可以先考虑把每张图片都压缩起来,举例来说,将BMP位图压缩成JPEG格式,就能节省许多容量。

而这类图片压缩的技术大多为破坏性压缩,意即编码器会舍弃些许原始信息以换取更高的压缩效率,这类压缩方式大家比较容易理解的案例是MP3音频格式。由于一般人耳大多只能听到频率20,000Hz以下的声音,所以MP3就舍弃这些人耳不易发现的高频信号,让压缩后的文件会更小,但由于被舍弃的部分在解压缩后无法还原到与原始信息相同,因此称为破坏性压缩。

回到图片部分,压缩的重要程序就是舍弃人眼难以分辨的细节,由于人眼对亮度比较敏感,而对颜色比较迟钝,因此在压缩过程中,会将RGB信息转换成YUV,在维持记录每个像素亮度(Luma)的情况下,降低色度、浓度(Chrominance、Chroma)的记录密度,达到节省容量的效果。

接着通过离散余弦变换(Discrete Cosine Transform)、量化(Quantization)、熵编码(Entropy Coding)等数学运算方式,再次将YUV信号进行破坏性压缩,进一步缩小文件容量。

此外在压缩视频时,编码器也会进行画格内预测(Intra-Frame Prediction),找出空间上的信息冗余(简单地说就是分析画面内临近像素是否是相近颜色),并以差分编码(Delta Encoding)方式节省记录容量。

以JPEG格式图片格式为例,将品质参数设为96(最高为100),可以把原先容量为854KB的BMP图片压缩至87.9KB,且肉眼不易分辨差异。

但是把品质参数设为10的话,虽然能把容量进一步压缩至12.8KB,但可以看出破坏性压缩对画质造成负面影响。

当考虑完单张的静态画面后,接下来就是要处理把多张画面串起来后的问题,比方说60FPS的视频就代表每秒播放60张静态画面,但是画面中可能会有很多区域是重复的,如果可以不用记录这些重复的部分,是不是就可以省下很多容量呢?

我们可以想象一个都会区马路的场景,摄影机高处俯瞰街景,视频中的行人、车辆会移动,但是道路、建筑物却固定不动。另一个例子是电影结束后所播放的工作人原列表,会有许多人的名字从画面下方向上卷动,字体内容不会改变,只是持续往相同方向移动。

这个时候就是进行画格间预测(Inter-Frame Prediction),找出时间上的信息冗余(简单地说就是分析视频播放过程中没有变动的对象),并以动态补偿(Motion Compensation)方式找出视频中有变动的部分,只记录差异的资料,至于没有变动的部分则重复利用先前的信息。

回到前面的例子,在街景的范例中,编码器会先以I画格(I Frame)记录完整画面,然后使用P画格(P Frame,可以参考前一画格内的信息)与B画格(B Frame,可以参考前一与后一画格内的信息,可以提升压缩率,但会增加运算负担)记录行人、车辆移动时造成的画面差异,至于没有变动的部分则沿用先前画面上的信息,如此一来就能大幅减少需要记录的信息,进而发挥降低压缩后的文件容量。

笔者随手拍摄的范例视频,可以看到画面中只有行人、车辆在移动。 (为降低容量所以画质较差请见谅)

视频的I画格会记录完整画面,但P或B画格则只需记录红框标注的区域,其他部分的信息则可省略并节省容量。

早期常见的视频压缩格式包含VCD与DVD使用的MPEG-1、MPEG-2,还有网络视频常用的RM、RMVB。到了MPEG-4盛行的年代,则因公开规格的关系,让各公司、机构可以根据MPEG-4标准开发不同的格式,而产生如DivX、XviD、3ivx等繁多的衍生格式,直到H.264出现,才算是统一MPEG-4的“业界标准”,而H.264也是目前最主流的视频压缩格式之一。

以YouTube所采用的H.264格式视频为例,笔者先前以Full HD分辨率录制的《实感赛车7》开场动画时间长度约为30秒,若以未压缩的方式存储需要占用10.43GB的空间,而经YouTube压缩后文件容量大幅下降为10.4MB,差距大约为1000倍。

除此之外,Google也先后推出VP8、VP9等视频压缩格式,改善线上视频流媒体的观赏体验,而H.264的后续技术H.265也能在维持相近图片品质时,节省一半视频容量,对于往4K或更高分辨率的视频播放来说相当关键。