天天看點

視訊編解碼器是如何工作的

1.是什麼?

 就是用于壓縮或解壓數字視訊的軟體或硬體。為什麼? 人們需要在有限帶寬或存儲空間下提高視訊的品質。還記得當我們計算每秒 30 幀,每像素 24 bit,分辨率是 480x240 的視訊需要多少帶寬嗎?沒有壓縮時是 82.944 Mbps。電視或網際網路提供 HD/FullHD/4K 隻能靠視訊編解碼器。怎麼做? 我們将簡單介紹一下主要的技術。

2.通用編解碼器

1.圖檔分區

第一步是将幀分成幾個分區,子分區甚至更多。

但是為什麼呢?**有許多原因,比如,當我們分割圖檔時,我們可以更精确的處理預測,在微小移動的部分使用較小的分區,而在靜态背景上使用較大的分區。

通常,編解碼器将這些分區組織成切片(或瓦片),宏(或編碼樹單元)和許多子分區。這些分區的最大大小有所不同,HEVC 設定成 64x64,而 AVC 使用 16x16,但子分區可以達到 4x4 的大小。

2.預測

一旦我們有了分區,我們就可以在它們之上做出預測。對于幀間預測,我們需要發送運動向量和殘差;至于幀内預測,我們需要發送預測方向和殘差。

3.轉換

在我們得到殘差塊(預測分區-真實分區)之後,我們可以用一種方式變換它,這樣我們就知道哪些像素我們應該丢棄,還依然能保持整體品質。這個确切的行為有幾種變換方式。

盡管有其它的變換方式,但我們重點關注離散餘弦變換(DCT)。DCT 的主要功能有:

  • 将像素塊轉換為相同大小的頻率系數塊。
  • 壓縮能量,更容易消除空間備援。
  • 可逆的,也意味着你可以還原回像素。

4.量化

當我們丢棄一些系數時,在最後一步(變換),我們做了一些形式的量化。這一步,我們選擇性地剔除資訊(有損部分)或者簡單來說,我們将量化系數以實作壓縮。

我們如何量化一個系數塊?一個簡單的方法是均勻量化,我們取一個塊并将其除以單個的值(10),并舍入值。

我們如何逆轉(重新量化)這個系數塊?我們可以通過乘以我們先前除以的相同的值(10)來做到。

3.時間備援(幀間預測)

讓我們探究去除時間上的重複,去除這一類備援的技術就是幀間預測。

我們将嘗試花費較少的資料量去編碼在時間上連續的 0 号幀和 1 号幀。

我們可以做個減法,我們簡單地用 0 号幀減去 1 号幀,得到殘差,這樣我們就隻需要對殘差進行編碼。(整塊殘差存儲)

但我們有一個更好的方法來節省資料量。首先,我們将0 号幀 視為一個個分塊的集合,然後我們将嘗試将 幀 1 和 幀 0 上的塊相比對。我們可以将這看作是運動預測。

我們預計那個球會從 x=0, y=25 移動到 x=6, y=26,x 和 y 的值就是運動向量。進一步節省資料量的方法是,隻編碼這兩者運動向量的差。是以,最終運動向量就是 x=6 (6-0), y=1 (26-25)。

實際情況下,這個球會被切成 n 個分區,但處理過程是相同的。

幀上的物體以三維方式移動,當球移動到背景時會變小。當我們嘗試尋找比對的塊,找不到完美比對的塊是正常的。

我們能看到當我們使用運動預測時,編碼的資料量少于使用簡單的殘差幀技術。

4.空間備援(幀内預測)

如果我們分析一個視訊裡的每一幀,我們會看到有許多區域是互相關聯的。

這是一個 I 幀,我們不能使用前面的幀來預測,但我們仍然可以壓縮它。我們将編碼我們選擇的那塊紅色區域。如果我們看看它的周圍,我們可以估計它周圍顔色的變化。

我們預測:幀中的顔色在垂直方向上保持一緻,這意味着未知像素的顔色與臨近的像素相同。

我們的預測會出錯,是以我們需要先利用這項技術(幀内預測),然後減去實際值,算出殘差,得出的矩陣比原始資料更容易壓縮。

繼續閱讀