電影后期工作流程 第一章 附錄01 Part.D 編碼壓縮技術

第一章?Capture?拍攝
附錄01 什么是編碼
Part.D?編碼壓縮技巧

(接上篇)

Part.D?編碼壓縮技術(Codec Compression Techniques)
各種編碼(Codecs),如H.264,H.265(即HEVC格式),都使用了各式各樣的高級壓縮技巧來壓縮視頻數據??v使八仙過海各顯神通,但是有兩種最主要的壓縮技巧是我們需要熟知的:空域壓縮(spatial compression)和時域壓縮(temporal compression)。
空域壓縮(spatial compression)是一種在視頻的每一幀(individual frames of video)上節(jié)省空間的壓縮技巧。這種方法其實我們常常稱為幀內壓縮(intraframe compression),一般是將幾個像素點歸為一組,僅給存儲一種顏色。這些各自只有一種顏色的組就稱為塊(Blocks)。這些塊因為存儲的顏色只有一種了,而不像原來每一個像素點都得存儲一個特定的顏色值,所以只占用更少的存儲空間。不過,因為塊中的幾個像素點共享了顏色信息,就一定會有畫質細節(jié)上的損失。為了解決這個問題,各種編碼使用了不同靈活的塊 (blocks),其擁有不同種類的形狀和大小 (any shape and size),以降低壓縮后肉眼可見的畫質損失。
時域壓縮(temporal compression),或者幀間壓縮(interframe compression),是一種橫跨多個幀的壓縮技巧。它同樣使用類似的塊 (blocks) 進行壓縮,只不過不限于對每一幀中。相反,時域壓縮/幀間壓縮 利用前后幾幀之間的差距來節(jié)省空間。如果兩幀之間有一半以上的圖像內容相似,那么我們只保留第二幀中改變的、多出來的那一部分圖像信息,和第一幀相同的圖像信息就從第一幀那里獲取。使用這樣一種方式進行數據壓縮的視頻編碼叫做long-GOP (group of pictures) codecs,中文應該叫長畫面組編碼。因為不需要完完全全存儲每一幀的全部畫面,所以這些編碼非常高效。但是,因為每一幀存儲的信息都沒有那么完全(一般是從前后的幾幀中借過來的),剪輯時候就電腦需要更大的計算量,特別是大家在處理素材的時候,以非順序的形式排列(比如你剪輯的時候,需要把視頻拆成多份,放在不同的地方),計算量就會特別特別大,電腦也容易變卡??偟膩碚f,使用時域壓縮的編碼雖然很利于節(jié)省存儲空間,但是因為需要計算量很大,在剪輯、處理視頻的時候就沒有那么便利了。
視頻壓縮是一個由數學、計算機科學、神秘的玄學(x) 構成的神奇領域。當然,你其實不用稱為學術大佬、工程師、或者魔術師來了解它的基本邏輯。下面我們會更加詳細地介紹我們選擇編碼時候,每一種編碼都具體用了什么樣的技術。
1. 空域壓縮 Spatial Compression
我們前面講到,時域壓縮 / 幀內壓縮 只讓每一幀各自進行壓縮。為了省下存儲空間,這種方法不會存儲每一個像素各自的色度信息(chroma data)。相反,一群群像素們會組成一個個的組,這每一個組就叫做宏塊(Macro-Blocks ),而每一個宏塊的色度信息,就是宏塊中所有像素各自的色度信息的平均值。

不同的視頻編碼會使用不同形狀的宏塊。有的編碼的宏塊大小相同,有的大小不一。不過宏塊最簡單的形狀,就是類似上圖中的正方形或者長方形方格。

但是,更加高級的編碼會使用更加復雜的、不同形狀或不同大小的宏塊排列。比如上圖中,我們可以看到HEVC即H.265編碼如何高效、靈活地利用宏塊。這樣一來相比其他死板的空域壓縮來說,能獲得一個更加干凈的畫面。
而宏塊讓畫面損失最大的,則是原本精細的色彩漸變。

在上面的例圖中,我們可以發(fā)現天空的顏色漸變還是非常的精細。這一版本的圖片的壓縮非常輕微,所以色彩漸變非常順滑。

但是質量不大好的空預壓縮就會使得顏色漸變變得非常的不連貫、不自然,甚至出現色彩斷層。這就是丟掉一堆像素的色度信息、讓一個個宏塊里的像素們共享一個平均的顏色的直接結果。
但是,即使有這樣的問題,幀內壓縮(intraframe compression)技術廣泛用于各式各樣的軟件和編碼中。比較流行的中間編碼如蘋果的ProRes,Avid的DNxHD,以及一些All-I (All-Intraframe 全幀內)的專業(yè)相機拍攝用編碼如索尼A7S3上的XAVC S-I Intra(I代表Intra,即幀內。對應XAVC-L是幀間壓縮,L指的是前面提到過的long-GOP*)。
2. 時域壓縮 Temporal Compression
另一種類型就是時域壓縮 / 幀間壓縮(interframe compression)。(后文我們都統一稱空域壓縮為幀內壓縮,時域壓縮為幀間壓縮)。幀間壓縮用的方法和幀內壓縮類似,但是卻橫跨了前后好幾幀,而不僅限于一個。這意味著每一幀都不是100%的圖像信息。雖然概念上也許很抽象,但是其實非常簡單。

在上圖中,被攝人物坐在一個靜態(tài)背景前,攝像機保持不動。顯然在拍攝的過程中,人物會有各種的動作。人物的臉會隨著說話而變化,手會揮舞著,而且人物的屁股肯定也不是死死地釘在座位上,因此人物的體態(tài)也會稍稍變化。但是,整個畫面中,大部分的圖像信息(即后面一大塊灰色的靜態(tài)磚墻背景)將不會有太多的變化,甚至人物主體在極短的時間內也不一定在動作上會有太大的變化。所以實際上,在時間上、幀與幀之間來說,很多畫面信息是多余的,因為第1幀和第2幀甚至第n幀之間的背景估計都長得差不多。
所以,幀間編碼通過只保留這一幀相對上一幀的變化信息,消除了這些冗余的圖像信息。比如上面人物的動作,作為變化的圖像信息存儲,而背景只需要保存一次可能就夠了。就如下圖所示。

這種復雜的過程其實由幀間編碼將圖像信息分割成各種大大小小的宏塊(macroblocks)。在這種情況下,幀內編碼會傻傻地將每一幀的所有宏塊都存儲下來,而幀間編碼會找到幀與幀之間的關聯,不記錄那些相似的宏塊,而只存儲相鄰幀之間的不同宏塊。而解碼的時候,如果需要這些相似的宏塊,只需要找到對應的引用(reference)到之前的參考幀(比如圖中的第一幀即可)中的對應宏塊即可。
而且更騷的是,即便幀與幀之間,這些相似宏塊的位置發(fā)生了變化(比如攝像機移動了),很多編碼依然會檢測到宏塊從一個位置,移動到了另一個位置,然后利用運動向量來標注對應宏塊的在新的一幀的新位置。這樣一來,我們即使在攝像機運動的時候,背景也只是稍微變化了一下,我們也不需要完全創(chuàng)建新的宏塊供后面幾幀參考。
當然,幀間編碼也很難做到只用一幀就能推測出后面十幾二十幀。畢竟,有些場景的變化會使得幀與幀之間常常沒有相似的細節(jié),所以總是編碼如果耗費過量的算力去查找類似的宏塊常常是無功而返。這也是幀間編碼將只同樣的幾幀分成一組來進行高效編解碼的原因。
因此,幀間編碼也被稱作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。幀間壓縮也是一種很不錯的拍攝編碼,因為相對于幀內壓縮編碼,能夠更加節(jié)省拍攝時候的存儲空間,長時間拍攝就不用頻頻更換內存卡了。
(譯者補充:幀間壓縮其實也運用了幀內壓縮的一些方法,比如在I-幀中,所以壓縮效率會更高。但是因為要在B-幀和P-幀進行引用I-幀的運算,所以需要花費大量的計算資源,所以剪輯視頻的時候如果視頻的壓縮率特別高,運用了幀間壓縮,那么剪輯起來就特別特別吃電腦性能。甚至現在壓縮率非常高的H.265編碼,在大部分電腦上都沒法流暢地進行剪輯。)

※ 所有內容的版權都屬于原作者(侵刪):workflow.frame.io
※ 希望大家多多投幣 點贊 收藏 轉發(fā),你們的支持是我更新的動力~ 你給力我就不咕咕咕。??
※ 本系列涵蓋電影后期制作流程中的: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