电影后期工作流程 第一章 附录01 Part.D 编码压缩技术

第一章 Capture 拍摄
附录01 什么是编码
Part.D 编码压缩技巧

(接上篇)

Part.D 编码压缩技术(Codec Compression Techniques)
各种编码(Codecs),如H.264,H.265(即HEVC格式),都使用了各式各样的高级压缩技巧来压缩视频数据。纵使八仙过海各显神通,但是有两种最主要的压缩技巧是我们需要熟知的:空域压缩(spatial compression)和时域压缩(temporal compression)。
空域压缩(spatial compression)是一种在视频的每一帧(individual frames of video)上节省空间的压缩技巧。这种方法其实我们常常称为帧内压缩(intraframe compression),一般是将几个像素点归为一组,仅给存储一种颜色。这些各自只有一种颜色的组就称为块(Blocks)。这些块因为存储的颜色只有一种了,而不像原来每一个像素点都得存储一个特定的颜色值,所以只占用更少的存储空间。不过,因为块中的几个像素点共享了颜色信息,就一定会有画质细节上的损失。为了解决这个问题,各种编码使用了不同灵活的块 (blocks),其拥有不同种类的形状和大小 (any shape and size),以降低压缩后肉眼可见的画质损失。
时域压缩(temporal compression),或者帧间压缩(interframe compression),是一种横跨多个帧的压缩技巧。它同样使用类似的块 (blocks) 进行压缩,只不过不限于对每一帧中。相反,时域压缩/帧间压缩 利用前后几帧之间的差距来节省空间。如果两帧之间有一半以上的图像内容相似,那么我们只保留第二帧中改变的、多出来的那一部分图像信息,和第一帧相同的图像信息就从第一帧那里获取。使用这样一种方式进行数据压缩的视频编码叫做long-GOP (group of pictures) codecs,中文应该叫长画面组编码。因为不需要完完全全存储每一帧的全部画面,所以这些编码非常高效。但是,因为每一帧存储的信息都没有那么完全(一般是从前后的几帧中借过来的),剪辑时候就电脑需要更大的计算量,特别是大家在处理素材的时候,以非顺序的形式排列(比如你剪辑的时候,需要把视频拆成多份,放在不同的地方),计算量就会特别特别大,电脑也容易变卡。总的来说,使用时域压缩的编码虽然很利于节省存储空间,但是因为需要计算量很大,在剪辑、处理视频的时候就没有那么便利了。
视频压缩是一个由数学、计算机科学、神秘的玄学(x) 构成的神奇领域。当然,你其实不用称为学术大佬、工程师、或者魔术师来了解它的基本逻辑。下面我们会更加详细地介绍我们选择编码时候,每一种编码都具体用了什么样的技术。
1. 空域压缩 Spatial Compression
我们前面讲到,时域压缩 / 帧内压缩 只让每一帧各自进行压缩。为了省下存储空间,这种方法不会存储每一个像素各自的色度信息(chroma data)。相反,一群群像素们会组成一个个的组,这每一个组就叫做宏块(Macro-Blocks ),而每一个宏块的色度信息,就是宏块中所有像素各自的色度信息的平均值。

不同的视频编码会使用不同形状的宏块。有的编码的宏块大小相同,有的大小不一。不过宏块最简单的形状,就是类似上图中的正方形或者长方形方格。

但是,更加高级的编码会使用更加复杂的、不同形状或不同大小的宏块排列。比如上图中,我们可以看到HEVC即H.265编码如何高效、灵活地利用宏块。这样一来相比其他死板的空域压缩来说,能获得一个更加干净的画面。
而宏块让画面损失最大的,则是原本精细的色彩渐变。

在上面的例图中,我们可以发现天空的颜色渐变还是非常的精细。这一版本的图片的压缩非常轻微,所以色彩渐变非常顺滑。

但是质量不大好的空预压缩就会使得颜色渐变变得非常的不连贯、不自然,甚至出现色彩断层。这就是丢掉一堆像素的色度信息、让一个个宏块里的像素们共享一个平均的颜色的直接结果。
但是,即使有这样的问题,帧内压缩(intraframe compression)技术广泛用于各式各样的软件和编码中。比较流行的中间编码如苹果的ProRes,Avid的DNxHD,以及一些All-I (All-Intraframe 全帧内)的专业相机拍摄用编码如索尼A7S3上的XAVC S-I Intra(I代表Intra,即帧内。对应XAVC-L是帧间压缩,L指的是前面提到过的long-GOP*)。
2. 时域压缩 Temporal Compression
另一种类型就是时域压缩 / 帧间压缩(interframe compression)。(后文我们都统一称空域压缩为帧内压缩,时域压缩为帧间压缩)。帧间压缩用的方法和帧内压缩类似,但是却横跨了前后好几帧,而不仅限于一个。这意味着每一帧都不是100%的图像信息。虽然概念上也许很抽象,但是其实非常简单。

在上图中,被摄人物坐在一个静态背景前,摄像机保持不动。显然在拍摄的过程中,人物会有各种的动作。人物的脸会随着说话而变化,手会挥舞着,而且人物的屁股肯定也不是死死地钉在座位上,因此人物的体态也会稍稍变化。但是,整个画面中,大部分的图像信息(即后面一大块灰色的静态砖墙背景)将不会有太多的变化,甚至人物主体在极短的时间内也不一定在动作上会有太大的变化。所以实际上,在时间上、帧与帧之间来说,很多画面信息是多余的,因为第1帧和第2帧甚至第n帧之间的背景估计都长得差不多。
所以,帧间编码通过只保留这一帧相对上一帧的变化信息,消除了这些冗余的图像信息。比如上面人物的动作,作为变化的图像信息存储,而背景只需要保存一次可能就够了。就如下图所示。

这种复杂的过程其实由帧间编码将图像信息分割成各种大大小小的宏块(macroblocks)。在这种情况下,帧内编码会傻傻地将每一帧的所有宏块都存储下来,而帧间编码会找到帧与帧之间的关联,不记录那些相似的宏块,而只存储相邻帧之间的不同宏块。而解码的时候,如果需要这些相似的宏块,只需要找到对应的引用(reference)到之前的参考帧(比如图中的第一帧即可)中的对应宏块即可。
而且更骚的是,即便帧与帧之间,这些相似宏块的位置发生了变化(比如摄像机移动了),很多编码依然会检测到宏块从一个位置,移动到了另一个位置,然后利用运动向量来标注对应宏块的在新的一帧的新位置。这样一来,我们即使在摄像机运动的时候,背景也只是稍微变化了一下,我们也不需要完全创建新的宏块供后面几帧参考。
当然,帧间编码也很难做到只用一帧就能推测出后面十几二十帧。毕竟,有些场景的变化会使得帧与帧之间常常没有相似的细节,所以总是编码如果耗费过量的算力去查找类似的宏块常常是无功而返。这也是帧间编码将只同样的几帧分成一组来进行高效编解码的原因。
因此,帧间编码也被称作Group of Pictures (long-GOP) codecs(中文大概是长画面组编码)。这些组由三种不同类型的帧组成:I-帧,P-帧,B-帧(I-Frames, P-Frames, and B-Frames)。
a) I-帧:I-帧是帧内编码后的图像/帧(Intraframe-Coded images)。这意味着这些帧只会有帧内压缩/空域压缩。正如上面那张图的第一帧,I-帧们不仅保留了完整的图像信息,还作为其他帧间压缩类型的帧的参考 (reference)。
b) P-帧:P-帧是预测帧(Predictive-Coded images)。这些帧依赖于之前的参考帧 (reference frame),即I-帧。任何P-帧中和I-帧相同的宏块都只会被存在I-帧中,并在P-帧需要的时候引用即可。
c) B-帧:B帧是双向预测帧(Bidirectionally-Predictive-Coded images)。B-帧和P-帧相似,但是可以同时从前后的帧获取引用 (reference),比如从I-帧或者P-帧中获取引用,来填充那些相似、相同的宏块。

基于我们的压缩设置,每一组的帧数量会有变化。如果我是一个PPT演示文档的录屏,那么帧与帧之间的图像信息变化就会非常小,我可以在两个I-帧之间塞一堆的B-帧和P-帧。而在变化复杂的视频中,I-帧之间的B-帧和P-帧可能就只有寥寥几张。当然,用户也从技术上来说也可以自定义每组的这些帧的个数。
很多常见的编码都使用帧间压缩,比如H.264、MPEG-4即MP4、AVCHD、XDCAM、H.265即HEVC。帧间压缩也是一种很不错的拍摄编码,因为相对于帧内压缩编码,能够更加节省拍摄时候的存储空间,长时间拍摄就不用频频更换内存卡了。
(译者补充:帧间压缩其实也运用了帧内压缩的一些方法,比如在I-帧中,所以压缩效率会更高。但是因为要在B-帧和P-帧进行引用I-帧的运算,所以需要花费大量的计算资源,所以剪辑视频的时候如果视频的压缩率特别高,运用了帧间压缩,那么剪辑起来就特别特别吃电脑性能。甚至现在压缩率非常高的H.265编码,在大部分电脑上都没法流畅地进行剪辑。)

※ 所有内容的版权都属于原作者(侵删):workflow.frame.io
※ 希望大家多多投币 点赞 收藏 转发,你们的支持是我更新的动力~ 你给力我就不咕咕咕。
※ 本系列涵盖电影后期制作流程中的:1. 视频拍摄 2. 准备工作 3. 剪辑 4. 套底 5. 特效 6. 调色 7. 音效 8. 成品 9. 实例 。对影视制作有兴趣的小伙伴可以在闲暇的时候多看看,涨姿势。
※ 本篇我仅搬运第一章Capture,关于前期拍摄,往后每一章的翻译不定期更新。
※ 因为内容繁多,其它的第一章的附录还没有更新完,请点一波关注,收藏~ 我会不定时放送搬运。
下期的内容:编码的种类
翻译:Heric(索饭君)
英文原文:https://workflow.frame.io/guide/
*参考资料:https://www.filmaker.cn/thread-58764-1-1.html 3楼,作者fxytj
修改于:2021-4-30