說明:我們參考黃金圈學習法(什么是黃金圈法則?->模型 黃金圈法則,本文使用: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)
引入運動補償和運動矢量是為了解決視頻編碼中的以下幾個關鍵問題:
-
減少時間冗余:視頻序列中連續幀之間的內容具有高度相關性,運動補償通過預測和補償物體運動,有效減少這種時間上的冗余。
-
提高壓縮效率:通過僅對幀間變化(殘差)進行編碼,而不是對每一幀的全部像素編碼,運動補償顯著降低了編碼后的數據量。
-
保持視頻質量:準確的運動補償有助于減少壓縮過程中引入的偽影,從而在減小文件大小的同時保持視頻的視覺質量。