天天看點

視訊編解碼基礎概念

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

本文為作者原創,轉載請注明出處: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 運動補償

目标的運動降低了圖像間的相似性,增加了差異資料量。而運動補償則通過運作矢量來降低圖像間的差異資料量。

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

視訊編解碼基礎概念

2.6 雙向預測

先看示意圖:

視訊編解碼基礎概念

連續的三幅圖像中,目标塊有垂直位置上的移動,背景塊無位置移動。我們考慮如何取得目前幀圖像(畫面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幀之前的圖像,是以IDR幀可以阻止視訊流中的錯誤傳播,同時IDR幀也是解碼器、播放器的一個安全通路點。

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

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

B幀具有更高的壓縮率,但需要更多的緩沖時間以及更高的CPU占用率,是以B幀适合本地存儲以及視訊點播,而不适用對實時性要求較高的直播系統。

2.8 GOP

GOP(Group Of Pictures, 圖像組)是一組連續的圖像,由一個I幀和多個B/P幀組成,是編解碼器存取的基本機關。GOP結構常用的兩個參數M和N,M指定GOP中兩個anchor frame(anchor frame指可被其他幀參考的幀,即I幀或P幀)之間的距離,N指定一個GOP的大小。例如M=3,N=15,GOP結構為:IBBPBBPBBPBBPBB

TODO: GOP中是否每兩個anchor frame的間隔是相同的?推測:未必相同。實際上分析不少視訊檔案,規律并不一緻。此處沒有徹底弄清楚,待進一步積累素材、分析與确認。

GOP有兩種:閉合式GOP和開放式GOP:

閉合式GOP:閉合式GOP隻需要參考本GOP内的圖像即可,不需參考前後GOP的資料。這種模式決定了,閉合式GOP的顯示順序總是以I幀開始以P幀結束

TODO: 閉合式GOP是否一定是以P幀結束?推測:可能未必有此定義。有看到某些視訊檔案GOP以B幀結束。

開放式GOP:開放式GOP中的B幀解碼時可能要用到其前一個GOP或後一個GOP的某些幀。碼流裡面包含B幀的時候才會出現開放式GOP。

TODO: 開放式GOP是否規定是以B幀開始,P幀結束?推測:可能未必有此定義。是否以B幀開始?網上資料說法不一。是否以P幀結束?有看到某些視訊檔案GOP以B幀結束。

在開放式GOP中,普通I幀和IDR幀功能是有差别的,需要明确區分兩種幀類型。在閉合式GOP中,普通I幀和IDR幀功能沒有差别,可以不作區分。

開放式GOP和閉合式GOP中I幀、P幀、B幀的依賴關系如下圖所示:

視訊編解碼基礎概念

2.9 DTS和PTS

DTS(Decoding Time Stamp, 解碼時間戳),表示壓縮幀的解碼時間。

PTS(Presentation Time Stamp, 顯示時間戳),表示将壓縮幀解碼後得到的原始幀的顯示時間。

音頻中DTS和PTS是相同的。視訊中由于B幀需要雙向預測,B幀依賴于其前和其後的幀,是以含B幀的視訊解碼順序與顯示順序不同,即DTS與PTS不同。當然,不含B幀的視訊,其DTS和PTS是相同的。下圖以一個開放式GOP示意圖為例,說明視訊流的解碼順序和顯示順序

視訊編解碼基礎概念

采集順序指圖像傳感器采集原始信号得到圖像幀的順序。

編碼順序指編碼器編碼後圖像幀的順序。存儲到磁盤的本地視訊檔案中圖像幀的順序與編碼順序相同。

傳輸順序指編碼後的流在網絡中傳輸過程中圖像幀的順序。

解碼順序指解碼器解碼圖像幀的順序。

顯示順序指圖像幀在顯示器上顯示的順序。

采集順序與顯示順序相同。編碼順序、傳輸順序和解碼順序相同。

以圖中“B[1]”幀為例進行說明,“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

[7] The GOP Inter Prediction of H.264 AVC, https://www.sciencedirect.com/science/article/pii/S1319157819301867

[8] WiKi Group of pictures, https://en.wikipedia.org/wiki/Group_of_pictures

[9] Open and Closed GOPs – All You Need to Know, https://streaminglearningcenter.com/articles/open-and-closed-gops-all-you-need-to-know.html

4. 修改記錄

2018-12-08 V1.0 初稿

2020-11-24 V1.0 修正GOP中M參數描述錯誤。修改文字筆誤。

繼續閱讀