視頻編解碼基礎概念


本文涉及視頻編解碼最基礎概念,從工程應用角度出發,幫助理解和編寫源碼。本文並不涉及深層次原理和算法。錯誤難免,逐漸完善。

本文為作者原創,轉載請注明出處:https://www.cnblogs.com/leisure_chn/p/10285829.html

1. 概述

音視頻領域早期采用模擬化技術,目前已發展為數字化技術。數字化的主要好處有:可靠性高、能夠消除傳輸及存儲損耗,便於計算機處理及網絡傳輸等。數字化后,音視頻處理就進入了計算機技術領域,音視頻處理本質上就是對計算機數據的處理。

圖像信息經采集后生成的原始視頻數據,數據量非常大,對於某些采集后直接本地播放的應用場合,不需要考慮壓縮技術。但現實中更多的應用場合,涉及視頻的傳輸與存儲,傳輸網絡與存儲設備無法容忍原始視頻數據的巨大數據量,必須將原始視頻數據經過編碼壓縮后,再進行傳輸與存儲。

本文僅關注視頻,不關注音頻。

2. 視頻壓縮原理

2.1 熵與冗余

引自參考資料[1]第1.5節

在所有的實際節目素材中,存在着兩種類型的信號分量:即異常的、不可預見的信號分量和可以預見的信號分量。異常分量稱為,它是信號中的真正信息。其余部分稱為冗余,因為它不是必需的信息。冗余可以是空間性的,如在圖像的大片區域中,鄰近像素幾乎具有相同的數值。冗余也可以是時間性的,例如連續圖像之間的相似部分。在所有的壓縮系統編碼器中都是將熵與冗余相分離,只有熵被編碼和傳輸,而在解碼器中再從編碼器的發送的信號中計算出冗余。

2.2 幀內編碼

幀內編碼是空間域編碼,利用圖像空間性冗余度進行圖像壓縮,處理的是一幅獨立的圖像,不會跨越多幅圖像。空間域編碼依賴於一幅圖像中相鄰像素間的相似性和圖案區的主要空間域頻率。

JPEG標准用於靜止圖像(即圖片),只使用了空間域壓縮,只使用幀內編碼。

2.3 幀間編碼

幀間編碼是時間域編碼,是利用一組連續圖像間的時間性冗余度進行圖像壓縮。如果某幀圖像可被解碼器使用,那么解碼器只須利用兩幀圖像的差異即可得到下一幀圖像。比如運動平緩的幾幀圖像的相似性大,差異性小,而運動劇烈的幾幅圖像則相似性小,差異性大。當得到一幀完整的圖像信息后,可以利用與后一幀圖像的差異值推算得到后一幀圖像,這樣就實現了數據量的壓縮。時間域編碼依賴於連續圖像幀間的相似性,盡可能利用已接收處理的圖像信息來“預測”生成當前圖像。

MPEG標准用於運動圖像(即視頻),會使用空間域編碼和時間域編碼,因此是幀內編碼和幀間編碼結合使用。

2.4 運動矢量

一組連續圖像記錄了目標的運動。運動矢量用於衡量兩幀圖像間目標的運動程度,運動矢量由水平位移量和垂直位移量二者構成。

2.5 運動補償

目標的運動降低了圖像間的相似性,增加了差異數據量。而運動補償則通過運行矢量來降低圖像間的差異數據量。

下圖為運動補償的示意圖。當某一目標運動時,其位置會變化但形狀顏色等基本不變。編碼器則可利用運動矢量減低圖像差值,解碼器根據圖像差值中的運動適量移動目標到合適的位置即可。假設圖中是理想情況,目標除移動位置外其他任何屬性無任何變化,則兩幅圖像間的差值僅包含運動矢量這一數據量。顯然運動補償可以顯著減少圖像差值數據量。
圖1 運動補償

2.6 雙向預測

先看示意圖:
圖2 雙向預測

連續的三幅圖像中,目標塊有垂直位置上的移動,背景塊無位置移動。我們考慮如何取得當前幀圖像(畫面N):
畫面N中,目標向上移動后,露出背景塊。
畫面N-1中,因為背景塊被目標塊遮擋住了,因此沒有背景塊相關信息。
畫面N+1中,完整包含背景塊的數據,因此畫面N可以從畫面N-1中取得背景塊。
如何可以得到畫面N呢?解碼器可以先解碼得到畫面N-1和畫面N+1,通過畫面N-1中的目標塊數據結合運動矢量即可得到畫面N中的目標塊數據,通過畫面N+1中的背景塊數據則可得到畫面N中的背景塊數據。三幅畫面的解碼順序為:N-1, N+1, N。三幅畫面的顯示順序為:N-1, N, N+1。畫面N通過其前一幅畫面N-1和后一幅畫面N+1推算(預測,predicted)得到,因此這種方式稱為雙向預測(或前面預測、雙向參考)。

2.7 I幀/IDR幀/P幀/B幀

I幀:I幀(Intra-coded picture, 幀內編碼幀,常稱為關鍵幀)包含一幅完整的圖像信息,屬於幀內編碼圖像,不含運動矢量,在解碼時不需要參考其他幀圖像。因此在I幀圖像處可以切換頻道,而不會導致圖像丟失或無法解碼。I幀圖像用於阻止誤差的累積和擴散。在閉合式GOP中,每個GOP的第一個幀一定是I幀,且當前GOP的數據不會參考前后GOP的數據。

IDR幀:IDR幀(Instantaneous Decoding Refresh picture, 即時解碼刷新幀)是一種特殊的I幀。當解碼器解碼到IDR幀時,會將DPB(Decoded Picture Buffer,指前后向參考幀列表)清空,將已解碼的數據全部輸出或拋棄,然后開始一次全新的解碼序列。IDR幀之后的圖像不會參考IDR幀之前的圖像。

P幀:P幀(Predictive-coded picture, 預測編碼圖像幀)是幀間編碼幀,利用之前的I幀或P幀進行預測編碼。

B幀:B幀(Bi-directionally predicted picture, 雙向預測編碼圖像幀)是幀間編碼幀,利用之前和(或)之后的I幀或P幀進行雙向預測編碼。B幀不可以作為參考幀。

2.8 GOP

GOP(Group Of Pictures, 圖像組)是一組連續的圖像,由一個I幀和多個B/P幀組成,是編解碼器存取的基本單位。GOP結構常用的兩個參數M和N,M指定GOP中首個P幀和I幀之間的距離,N指定一個GOP的大小。例如M=1,N=15,GOP結構為:IPBBPBBPBBPBBPBGOP有兩種:閉合式GOP和開放式GOP:
閉合式GOP:閉合式GOP只需要參考本GOP內的圖像即可,不需參考前后GOP的數據。這種模式決定了,閉合式GOP的顯示順序總是以I幀開始以P幀結束
開放式GOP :開放式GOP中的B幀解碼時可能要用到其前一個GOP或后一個GOP的某些幀。碼流里面包含B幀的時候才會出現開放式GOP。
開放式GOP和閉合式GOP中I幀、P幀、B幀的依賴關系如下圖所示:
圖3 GOP模式

2.9 DTS和PTS

DTS(Decoding Time Stamp, 解碼時間戳),表示packet的解碼時間。
PTS(Presentation Time Stamp, 顯示時間戳),表示packet解碼后數據的顯示時間。
音頻中DTS和PTS是相同的。視頻中由於B幀需要雙向預測,B幀依賴於其前和其后的幀,因此含B幀的視頻解碼順序與顯示順序不同,即DTS與PTS不同。當然,不含B幀的視頻,其DTS和PTS是相同的。下圖以一個開放式GOP示意圖為例,說明視頻流的解碼順序和顯示順序
圖4 解碼和顯示順序
采集順序指圖像傳感器采集原始信號得到圖像幀的順序。
編碼順序指編碼器編碼后圖像幀的順序。存儲到磁盤的本地視頻文件中圖像幀的順序與編碼順序相同。
傳輸順序指編碼后的流在網絡中傳輸過程中圖像幀的順序。
解碼順序指解碼器解碼圖像幀的順序。
顯示順序指圖像幀在顯示器上顯示的順序。
采集順序與顯示順序相同。編碼順序、傳輸順序和解碼順序相同。
圖中“B[1]”幀依賴於“I[0]”幀和“P[3]”幀,因此“P[3]”幀必須比“B[1]”幀先解碼。這就導致了解碼順序和顯示順序的不一致,后顯示的幀需要先解碼。

3. 參考資料

[1] 泰克Tektronic, MPEG基礎和協議分析指南
[2] 視頻直播的理論知識https://www.jianshu.com/p/04b5b1e4ff27
[3] open GOP & close GOP, https://www.jianshu.com/p/d30c051b4106
[4] I幀/B幀/P幀/GOP, https://blog.csdn.net/abcsunl/article/details/68190136
[5] FFmpeg音視頻同步原理與實現, https://www.jianshu.com/p/3578e794f6b5
[6] FFmpeg音視頻同步, https://www.jianshu.com/p/27279255f67e

4. 修改記錄

2018-12-08 V1.0 初稿


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM