系統化學習 H264視頻編碼(02) I幀 P幀 B幀 引入及相關概念解讀

說明:我們參考黃金圈學習法(什么是黃金圈法則?->模型 黃金圈法則,本文使用:why-what)來學習音H264視頻編碼。本系列文章側重于理解視頻編碼的知識體系和實踐方法,理論方面會更多地講清楚 音視頻中概念的起源以及各個概念的聯系。知其然,知其所以然。同時更強調知識系統的建立。

針對本文,我們主要講清楚 I幀、P幀、B幀的概念及引入原因,基于I幀、P幀、B幀 展開的其他概念解讀,比如GOP概念,就是基于?I幀、P幀、B幀的理解基礎上,搞了一個以I幀為分割點的序列。而后面提到的運動補償和運動矢量是P幀和B幀的關鍵技術,用于提高視頻編碼的壓縮效率。

1??I幀、P幀、B幀概念解讀

1.1 I幀、P幀、B幀是什么?(what)

視頻經過壓縮后 的圖像幀 分別有?I幀、P幀、B幀,他們的概念解讀分別如下:

I幀(Intra-coded Frame,內部編碼幀):

  • I幀是一種關鍵幀,完全獨立于其他幀進行編碼。
  • 它使用幀內預測,即僅依賴于該幀本身的像素信息,類似于靜態圖片的編碼方式。
  • I幀不包含時間上的預測或運動補償,因此可以作為視頻解碼的起點。
  • 由于不依賴其他幀,I幀通常比其他類型的幀更大,需要更多的數據來存儲。

P幀(Predictive-coded Frame,預測編碼幀)

  • P幀是一種前向預測幀,它依賴于前面的I幀或P幀來進行時間上的預測。
  • 它使用幀間預測,通過比較當前幀與參考幀之間的差異(運動補償)來減少數據量。
  • P幀不向未來幀提供信息,解碼時僅需要前一個已解碼的I幀或P幀作為參考。

B幀(Bi-directional predictive-coded Frame,雙向預測編碼幀)

  • B幀是一種雙向預測幀,它同時參考前后的I幀或P幀來進行編碼。
  • 與P幀相比,B幀可以利用更多的上下文信息來減少數據量,因此通常具有更高的壓縮效率。
  • B幀解碼時需要前后兩個參考幀,這使得B幀的解碼順序與顯示順序不同。

總結下:I幀是關鍵幀。P幀基于I幀差異來進一步壓縮,減少存儲量。而B幀再基于I幀和P幀的差異,進一步減少存儲量。這里思考一個問題,關于 I幀、P幀、B幀的引入,為什么只有這3類?而不是4類或者5類更多?先思考5分鐘,再繼續看效果更佳👇

============================================

1.2?關于 I幀、P幀、B幀的引入,為什么只有這3類,而不是更多?

幀、P幀、B幀的引入是視頻編碼標準中為了平衡壓縮效率、解碼復雜性和隨機訪問能力的結果。這三類幀類型提供了一種有效的折衷方案,其原因包括:

  • ??壓縮效率:I幀、P幀、B幀的組合提供了良好的壓縮效率。I幀作為基準幀,P幀通過前向預測減少冗余,B幀通過雙向預測進一步提高壓縮效率。增加更多類型的幀可能會增加編碼和解碼的復雜性,而不一定能顯著提高壓縮效率。
  • 解碼復雜性:每增加一種幀類型,就會增加解碼的復雜性和計算量。I、P、B幀的模型已經相對復雜,因為B幀的解碼依賴于前后幀。如果引入更多類型的幀,將使得解碼過程更加復雜,可能導致硬件實現上的困難。
  • 隨機訪問和錯誤恢復:I幀提供了隨機訪問點,P幀和B幀可以快速從I幀恢復,這種結構有助于快速定位和錯誤恢復。如果幀類型過多,可能會影響這些功能的效率。
  • 編碼效率:在大多數視頻內容中,這三類幀已經能夠很好地適應不同的場景和運動。增加更多類型的幀可能會帶來邊際效益的遞減。
  • 標準化和兼容性:視頻編碼標準需要全球范圍內的兼容性和廣泛接受。I、P、B幀的模型已經被廣泛采用并在多種設備和平臺上實現。增加更多類型的幀可能會影響標準的普及和兼容性。
  • 實際需求:視頻編碼的主要目標是在保持可接受的視頻質量的同時減少數據量。在大多數應用場景中,I、P、B幀已經能夠滿足這些需求,而不需要更多類型的幀。
  • 技術實現和成本:增加更多類型的幀會增加編碼器和解碼器的設計和實現難度,可能導致更高的開發和生產成本。

總之,I幀、P幀、B幀的引入是為了在壓縮效率、解碼復雜性和實際應用需求之間找到一個合適的平衡點。這三類幀類型已經能夠滿足大多數視頻編碼的需求,而引入更多類型的幀可能會帶來不必要的復雜性和成本,而沒有相應的效率提升。

基于對前面了解,我們繼續探索。那么為什么要引入這幾個概念呢?我們繼續看👇

1.3?為什么要引入I幀、P幀、B幀?(why)

定義I幀、P幀、B幀主要是為了解決視頻壓縮和傳輸中的效率和質量平衡問題。這些不同類型的幀各自解決了以下關鍵問題:

  • 壓縮效率:I幀作為關鍵幀,提供了一種無需參考其他幀即可獨立解碼的能力,但它們通常較大,因為不包含時間預測信息。P幀和B幀通過幀間預測減少了重復信息的存儲,利用視頻序列中時間上的冗余來提高壓縮效率,其中B幀通過雙向預測進一步提高了這一效率。

  • 解碼的隨機訪問性:I幀使得視頻流可以在任意點開始解碼,這對于視頻服務器和播放器來說是必要的,它們需要能夠快速定位到視頻流的特定位置并開始播放。

  • 錯誤傳播控制:當視頻流中出現錯誤時,由于P幀和B幀依賴于之前的幀,錯誤可能會傳播到后續幀。I幀作為獨立幀,可以限制錯誤傳播的范圍,從而提高視頻播放的魯棒性。

  • 編碼復雜度與解碼性能的平衡:B幀雖然可以提供更高的壓縮效率,但它們的編碼和解碼過程更為復雜,因為需要處理雙向預測。通過合理地在I幀和P幀之間分布B幀,可以在編碼復雜度和解碼性能之間取得平衡。

  • 視頻質量與傳輸帶寬的優化:在有限的帶寬下,通過使用P幀和B幀減少需要傳輸的數據量,可以在保持視頻質量的同時減少對帶寬的需求。

  • 適應不同的網絡條件:在網絡狀況良好時,可以增加B幀的使用來提高壓縮率;在網絡狀況較差時,可以減少B幀的使用,以降低解碼延遲和錯誤率。

  • 視頻內容的動態特性適應:不同的視頻內容具有不同的動態特性。例如,快速運動的場景可能需要更多的I幀來減少預測錯誤,而靜止或慢速運動的場景則可以更多地使用P幀和B幀。

通過定義I幀、P幀、B幀,并在視頻編碼過程中靈活使用它們,可以有效地解決視頻壓縮、傳輸和解碼中的多種問題,實現高效、可靠且高質量的視頻播放。

基于I幀、P幀、B幀 展開的其他概念解讀,比如GOP概念,就是基于?I幀、P幀、B幀的理解基礎上,搞了一個以I幀為分割點的序列。而后面提到的運動補償和運動矢量是P幀和B幀的關鍵技術,用于提高視頻編碼的壓縮效率。

2.?GOP概念解讀

2.1 什么是GOP序列(what)

GOP概念:兩個I幀之間是一個圖像序列,在一個圖像序列中只有一個I幀。如下圖所示:

其主要特點和作用包括但不限于:

  • 獨立解碼單元:在傳統的視頻編碼標準中,每個GOP可以作為一個獨立的單元進行解碼,即解碼器可以從GOP中的任何一幀開始解碼,而不需要之前GOP的數據。
  • 包含I幀:每個GOP通常以一個I幀開始,這個I幀稱為關鍵幀或IDR幀(Instantaneous Decoding Refresh),它是一個完全自包含的幀,不依賴于其他幀的信息。
  • 幀間預測:GOP中的P幀和B幀利用幀間預測技術,通過參考其他幀(可以是前面的或后面的幀)來減少數據量。P幀通常只參考前面的幀,而B幀可以同時參考前后的幀。
  • 提高壓縮效率:通過在GOP中使用I幀、P幀和B幀的組合,可以有效地利用視頻內容的時間冗余,從而提高壓縮效率。
  • 控制解碼延遲:GOP的大小直接影響解碼延遲。較小的GOP可以減少延遲,但可能會降低壓縮效率;較大的GOP可以提高壓縮效率,但會增加延遲。
  • 適應不同的編碼策略:不同的編碼場景和需求可能需要不同的GOP結構和大小。例如,實時通信可能需要較小的GOP以減少延遲,而視頻存儲和傳輸可能更注重壓縮效率。

GOP的概念在視頻編碼標準如H.264和H.265中都有應用,它們通過合理組織幀的編碼和預測關系,優化了視頻的存儲和傳輸效率。

2.2 為什么引入GOP序列?(why)

引入GOP(Group of Pictures)概念主要是為了解決視頻編碼和傳輸中的以下問題:

  • 提高壓縮效率:通過在GOP中使用I幀、P幀和B幀的組合,可以更有效地利用視頻內容的時間冗余,從而提高壓縮效率。
  • 實現隨機訪問:GOP結構允許視頻流在任意點進行隨機訪問和解碼,因為每個GOP都可以作為一個獨立的解碼單元。
  • 控制解碼延遲:通過調整GOP的大小,可以在壓縮效率和解碼延遲之間進行權衡。較小的GOP可以減少延遲,適用于實時視頻通信;較大的GOP可以提高壓縮效率,適用于視頻存儲和傳輸。
  • 優化編碼和解碼過程:GOP結構使得編碼器可以更加靈活地組織幀的編碼順序,同時解碼器可以按照GOP的順序進行解碼,簡化了編碼和解碼的流程。
  • 增強錯誤恢復能力:在GOP結構中,由于P幀和B幀僅依賴于前面的幀,一旦出現數據錯誤,錯誤的影響可以被限制在當前GOP內,減少了錯誤傳播。
  • 適應不同的編碼策略:GOP允許編碼器根據視頻內容的特性和編碼需求,靈活地選擇I幀、P幀和B幀的比例,實現最優的編碼策略。
  • 提高視頻播放的流暢性:GOP結構使得播放器可以在不重新加載整個視頻的情況下,快速跳轉到視頻的任意位置,提高了播放的流暢性和用戶體驗。
  • 降低存儲和傳輸成本:通過提高壓縮效率,GOP有助于減少視頻存儲所需的空間和傳輸所需的帶寬,降低了視頻分發的成本。

總的來說,GOP概念的引入是為了在保證視頻質量的同時,提高視頻編碼的效率和靈活性,優化存儲和傳輸過程,并改善視頻播放的性能。

3?運動補償和運動矢量的概念

3.1 運動補償和運動矢量是什么?(what)

運動補償和運動矢量是視頻編碼中的關鍵技術,用于提高壓縮效率,具體概念如下:

運動矢量(Motion Vector):運動矢量是一種描述視頻序列中物體運動的參數,它定義了從一幀到另一幀中特定區域(如宏塊或編碼單元)的運動方向和距離。主要用于幀間預測。在幀間預測中,運動矢量用于找到當前幀中某個區域與參考幀中相應區域之間的對應關系。運動矢量通常包含兩個分量:水平分量和垂直分量,分別表示水平和垂直方向上的運動。

運動補償(Motion Compensation):運動補償是一種利用運動矢量信息來預測和補償視頻幀之間變化的技術。通過運動補償,編碼器可以預測當前幀中每個區域在參考幀中的對應位置,然后計算出實際像素與預測像素之間的差異(殘差)。由于殘差通常包含的信息量遠小于原始像素,因此只對這些殘差進行編碼可以顯著減少所需的數據量。

3.2 為什么引入運動補償和運動矢量?(why)

引入運動補償和運動矢量是為了解決視頻編碼中的以下幾個關鍵問題:

  1. 減少時間冗余:視頻序列中連續幀之間的內容具有高度相關性,運動補償通過預測和補償物體運動,有效減少這種時間上的冗余。

  2. 提高壓縮效率:通過僅對幀間變化(殘差)進行編碼,而不是對每一幀的全部像素編碼,運動補償顯著降低了編碼后的數據量。

  3. 保持視頻質量:準確的運動補償有助于減少壓縮過程中引入的偽影,從而在減小文件大小的同時保持視頻的視覺質量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42318.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python類實例的json

web開發中有這么一個場景,我們從數據庫中查詢某一數據的時候,往往需要對數據進行一些轉化之后才能傳給前端。 當然我們可以根據查詢出來的實例對象,構建一個dict返回,這樣會導致我們的代碼非常的臃腫。但是這也確實是一種最直接的…

網絡空間測繪是什么?

網絡空間測繪是一種技術過程,用于探測、分析和可視化互聯網及其他網絡環境中的各種資源和連接。這個概念在2016年開始廣泛使用,它涉及到收集有關網絡節點(如服務器、路由器、個人電腦和其他設備)的信息,并建立這些節點…

C++ STL 多線程庫用法介紹

目錄 一:Atomic: 二:Thread 1. 創建線程 2. 小心移動(std::move)線程 3. 如何創建帶參數的線程 4. 線程參數是引用類型時,要小心謹慎。 5. 獲取線程ID 6. jthread 7. 如何在線程中使用中斷 stop_token 三:如何解決數據競爭 1.有問題的代碼 2.使用互斥 3.預防…

Vue3+.NET6前后端分離式管理后臺實戰(二十八)

1,Vue3.NET6前后端分離式管理后臺實戰(二十八)

【Linux進階】文件系統6——理解文件操作

目錄 1.文件的讀取 1.1.目錄 1.2.文件 1.3.目錄樹讀取 1.4.文件系統大小與磁盤讀取性能 2.增添文件 2.1.數據的不一致(Inconsistent)狀態 2.2.日志式文件系統(Journaling filesystem) 3.Linux文件系統的運行 4、文件的刪…

動態規劃算法-以中學排班管理系統為例

1.動態規劃算法介紹 1.算法思路 動態規劃算法通常用于求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應于一個值,我們希望找到具有最優值的解。動態規劃算法與分治法類似,其基本思想也是將待求解問題分解成若…

干貨 | 2024大模型場景下智算平臺的設計與優化實踐(免費下載)

誠摯邀請您微信掃描以下二維碼加入方案驛站知識星球,獲取上萬份PPT/WORD解決方案!!!感謝支持!!!

android pdf框架-11,查看圖片

前10篇文章,9章關于pdf的,pdf解析后,里面也是有各種圖片,于是利用pdf的view來展示圖片,似乎也是個不錯的想法. android手機中的圖片查看功能,有的可以展示,有的不能.比如華為,榮耀對大體積的png是可以顯示的,小米是不顯示,只有縮略圖. 一張png50m大,比如清明上河圖,原圖是tif…

【C++】string的底層原理及實現

文章目錄 string類的存儲結構默認成員函數構造函數析構函數拷貝構造函數賦值重載 容量操作size()capacity()reserve()resize()clear() 遍歷與訪問operator[ ]迭代器范圍與for 增刪查改push_back()pop_back()append()operatorinsert()erase()c_str()find()substr() 非成員函數op…

c#的List<T>的SelectMany 和Select

在C#中&#xff0c;List<T>&#xff08;以及任何實現了IEnumerable<T>的集合&#xff09;的Select和SelectMany擴展方法都是LINQ&#xff08;Language Integrated Query&#xff09;的一部分&#xff0c;用于對集合中的元素進行查詢和轉換。 盡管它們的作用有些相…

Virtualbox和ubuntu之間的關系

1、什么是ubuntu Ubuntu 是一個類似于 Windows 的操作系統&#xff0c;但它是基于 Linux 內核開發的開源操作系統 2、什么是Virtualbox VirtualBox 是一款虛擬機軟件&#xff0c;使我們可以物理機上創建和運行虛擬機 也就是說,VirtualBox 提供了一個可以安裝和運行其他操作系…

力扣考研經典題 反轉鏈表

核心思想 頭插法&#xff1a; 不斷的將cur指針所指向的節點放到頭節點之前&#xff0c;然后頭節點指向cur節點&#xff0c;因為最后返回的是head.next 。 解題思路 1.如果頭節點是空的&#xff0c;或者是只有一個節點&#xff0c;只需要返回head節點即可。 if (head null …

算法訓練營day70

題目1&#xff1a;108. 冗余連接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…

Echarts中的熱力圖和漏斗圖(在Vue中使用熱力圖和漏斗圖)

熱力圖 (Heatmap) Echarts的熱力圖用于展示兩個維度數據矩陣中的值分布情況。它通過在平面上劃分成多個矩形區域&#xff0c;并用不同的顏色填充這些區域來表示數據的大小或強度。顏色漸變從淺到深通常映射著數值從小到大&#xff0c;從而直觀展示數據的集中程度和分布模式。熱…

Mojolicious測試驅動開發:單元與集成測試的藝術

標題&#xff1a;Mojolicious測試驅動開發&#xff1a;單元與集成測試的藝術 Mojolicious是一個現代化的Perl Web開發框架&#xff0c;它不僅提供了強大的Web應用開發能力&#xff0c;還內置了豐富的測試工具來支持單元測試和集成測試。本文將深入探討如何在Mojolicious中進行…

人工智能期末復習簡答題

簡答: 子句集的化簡(1).消去連接詞”—>”和”<—>” (2)減少否定符號的轄域 (3)對變元標準化 (4)化為前束范式 (5)消去存在量詞 (6)化為Skolem標準形 (7)消去全稱量詞 (8)消去合取詞 (9)更換變元名稱 2.在狀態空間搜索中,Open表與Close…

半同步主從復制

半同步主從復制的概念 半同步主從復制&#xff08;Semisynchronous Replication, SBR&#xff09;是MySQL數據庫中的一種數據復制方式&#xff0c;它在異步復制的基礎上增加了一定程度的同步性&#xff0c;旨在提高數據安全性&#xff0c;減少數據丟失的風險。 半同步主從復制…

LeetCode 3101.交替子數組計數:等差數列求和(較詳題解)

【LetMeFly】3101.交替子數組計數&#xff1a;等差數列求和&#xff08;較詳題解&#xff09; 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-alternating-subarrays/ 給你一個二進制數組 nums 。 如果一個子數組中 不存在 兩個 相鄰 元素的值 相同 的情況&a…

階段三:項目開發---大數據開發運行環境搭建:任務8:安裝配置Redis

任務描述 知識點&#xff1a;安裝配置Redis 重 點&#xff1a; 安裝配置Redis 難 點&#xff1a;無 內 容&#xff1a; Redis&#xff08;Remote Dictionary Server )&#xff0c;即遠程字典服務&#xff0c;是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可…

【C++:運算符重載】

運算符重載 特點&#xff1a; 函數名由operator運算符組成 注&#xff1a; 不能通過其他符號創建新的操作符&#xff0c;只能使用C/C語法存在的操作符重載操作符必須有一個類類型參數&#xff0c;原因&#xff1a;不能重載操作符改變內置類型的行為當類成員操作符重載時&#…