音視頻開發學習筆記(二)----視頻基礎概念

文章目錄
1.圖像的表示方式--RGB
2.視頻的表示方式--YUV
3.視頻編碼
3.1 壓縮方式
3.2 編碼標準
3.2.1 MPEG
3.2.2 H.264
3.3 編碼概念
3.3.1 IPB幀
3.3.2 PTS與DTS
3.3.2 GOP的概念
1.圖像的表示方式–RGB
   咱們都知道視頻都是由圖片組成的,任何一個圖像均可以由RGB組成,凡是渲染到屏幕上的東西,都要轉換爲RGB的表示形式。當屏幕要顯示某篇文字或者某幅圖像時,就會把這幅圖像的每個像素點的RGB通道分別對應的屏幕位置上的子像素點繪製到屏幕上,從而顯示整個圖像,而每一個像素點都由三個子像素點組成。那麼像素裏的子像素又改如何表示呢?主要有如下兩種:算法

浮點表示:
   取值範圍爲0.0~1.0,好比,在OpenGL ES中對每個子像素點的表示使用的就是這種表達方式。
整數表示:
   取值範圍爲0~255或者00~FF,8個比特表示一個子像素,32個比特表示一個像素,這就是相似於某些平臺上表示圖像格式的RGBA_8888數據格式。好比,Android平臺上RGB_565的表示方法爲16比特模式表示一個像素,R用5個比特來表示,G用6個比特來表示,B用5個比特來表示。
   對於一幅圖像,通常使用整數表示方法來進行描述。網絡

   每一張圖像的裸數據(bitmap 位圖)都是很大的。對於圖像的裸數據來說,直接在網絡上進行傳輸也是不太可能的,因此就有了圖像的壓縮格式,好比JPEG壓縮:JPEG是靜態圖像壓縮標準,由ISO制定。JPEG圖像壓縮算法在提供良好的壓縮性能的同時,具備較好的重建質量。這種算法被普遍應用於圖像處理領域,固然其也是一種有損壓縮。可是,這種壓縮不能直接應用於視頻壓縮,由於對於視頻來說,還有一個時域上的因素須要考慮,也就是說,不只僅要考慮幀內編碼,還要考慮幀間編碼。視頻採用的是更成熟的算法。性能

2.視頻的表示方式–YUV
   對於視頻幀的裸數據表示,其實更多的是YUV數據格式的表示,YUV主要應用於優化彩色視頻信號的傳輸,使其向後兼容老式黑白電視。與RGB視頻信號傳輸相比,它最大的優勢在於只須要佔用極少的頻寬(RGB要求三個獨立的視頻信號同時傳輸)。其中 「Y」表示明亮度(Luminance或Luma),也稱灰階值;而 「U」和「V」表示的則是色度(Chrominance或Chroma),它們的做用是描述影像的色彩及飽和度,用於指定像素的顏色。「亮度」是透過RGB輸入信號來創建的,方法是將RGB信號的特定部分疊加到一塊兒。「色度」則定義了顏色的兩個方面——色調與飽和度,分別用Cr和Cb來表示。其中,Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差別,而Cb反映的則是RGB輸入信號藍色部分與RGB信號亮度值之間的差別。優化

   之因此採用YUV色彩空間,是由於它的亮度信號Y和色度信號U、V是分離的。若是隻有Y信號份量而沒有U、V份量,那麼這樣表示的圖像就是黑白灰度圖像。彩色電視採用YUV空間正是爲了用亮度信號Y解決彩色電視機與黑白電視機的兼容問題,使黑白電視機也能接收彩色電視信號,最經常使用的表示形式是Y、U、V都使用8個字節來表示,因此取值範圍就是0~255。,在傳輸過程當中,爲了防止信號變更形成過載,Y的取值範圍一般都是16~235,UV的取值範圍都是16~240。編碼

   YUV最經常使用的採樣格式是4:2:0,4:2:0並不意味着只有Y、Cb而沒有Cr份量。它指的是對每行掃描線來講,只有一種色度份量是以2:1的抽樣率來存儲的。相鄰的掃描行存儲着不一樣的色度份量,也就是說,若是某一行是4:2:0,那麼其下一行就是4:0:2,再下一行是4:2:0,以此類推。對於每一個色度份量來講,水平方向和豎直方向的抽樣率都是2:1,因此能夠說色度的抽樣率是4:1。.net

3.視頻編碼
   視頻壓縮也是經過去除冗餘信息來進行壓縮的。相較於音頻數據,視頻數據有極強的相關性,也就是說有大量的冗餘信息,包括空間上(空域)的冗餘信息和時間上(時域)的冗餘信息。壓縮技術就是將數據中的冗餘信息去掉(去除數據之間的相關性),壓縮技術包含幀內圖像數據壓縮技術、幀間圖像數據壓縮技術和熵編碼壓縮技術。設計

3.1 壓縮方式
去時域:視頻

使用幀間編碼技術能夠去除時間上的冗餘信息,具體包括如下幾個部分:blog

運動補償:
   運動補償是經過先前的局部圖像來預測、補償當前的局部圖像,它是減小幀序列冗餘信息的有效方法。圖片

運動表示:
   不一樣區域的圖像須要使用不一樣的運動矢量來描述運動信息。運動矢量經過熵編碼進行壓縮。

運動估計:
   運動估計是從視頻序列中抽取運動信息的一整套技術。

   使用幀內編碼技術能夠去除空間上的冗餘信息。

去空域:

主要使用幀內編碼技術和熵編碼技術:

變換編碼
幀內圖像和預測差分信號都有很高的空域冗餘信息。變換編碼將空域信號變換到另外一正交矢量空間,使其相關性降低,數據冗餘度減少。

量化編碼
通過變換編碼後,產生一批變換系數,對這些係數進行量化,使編碼器的輸出達到必定的位率。這一過程致使精度的下降。

熵編碼
熵編碼是無損編碼。它對變換、量化後獲得的係數和運動信息,進行進一步的壓縮。

3.2 編碼標準
3.2.1 MPEG
   MPEG(Motion JPEG)編碼是由ISO也制定的視頻編碼標準。MPEG算法是適用於動態視頻的壓縮算法,它除了對單幅圖像進行編碼外,還利用圖像序列中的相關原則去除冗餘,這樣能夠大大提升視頻的壓縮比。截至目前,MPEG的版本一直在不斷更新中,主要包括這樣幾個版本:Mpeg1(用於VCD)、Mpeg2(用於DVD)、Mpeg4 AVC(如今流媒體使用最多的就是它了)。

3.2.2 H.264
   相比較於ISO制定的MPEG視頻壓縮標準,ITU-T制定的H.26一、H.26二、H.26三、H.264一系列視頻編碼標準是一套單獨的體系。其中,H.264集中了以往標準的全部優勢,並吸收了以往標準的經驗,採用的是簡潔設計,這使得它比Mpeg4更容易推廣。如今使用最多的就是H.264標準,H.264創造了多參考幀、多塊類型、整數變換、幀內預測等新的壓縮技術,使用了更精細的分像素運動矢量(1/四、1/8)和新一代的環路濾波器,這使得壓縮性能獲得大大提升,系統也變得更加完善。

3.3 編碼概念
3.3.1 IPB幀
視頻壓縮中,每幀都表明着一幅靜止的圖像。而在進行實際壓縮時,會採起各類算法以減小數據的容量,其中IPB幀就是最多見的一種。

I幀:
幀內編碼幀(intra picture),I幀一般是每一個GOP(MPEG所使用的一種視頻壓縮技術)的第一個幀,通過適度地壓縮,做爲隨機訪問的參考點,能夠當成靜態圖像。I幀能夠看做一個圖像通過壓縮後的產物,I幀壓縮能夠獲得6:1的壓縮比而不會產生任何可覺察的模糊現象。I幀壓縮可去掉視頻的空間冗餘信息,P幀和B幀是爲了去掉時間冗餘信息。

P幀:
前向預測編碼幀(predictive-frame),經過將圖像序列中前面已編碼幀的時間冗餘信息充分去除來壓縮傳輸數據量的編碼圖像,也稱爲預測幀。

B幀:
雙向預測內插編碼幀(bi-directional interpolated prediction frame),既考慮源圖像序列前面的已編碼幀,又顧及源圖像序列後面的已編碼幀之間的時間冗餘信息,來壓縮傳輸數據量的編碼圖像,也稱爲雙向預測幀。

基於上面的定義,咱們能夠從解碼的角度來理解IPB幀。

I幀自身能夠經過視頻解壓算法解壓成一張單獨的完整視頻畫面,因此I幀去掉的是視頻幀在空間維度上的冗餘信息。
P幀須要參考其前面的一個I幀或者P幀來解碼成一張完整的視頻畫面。
B幀則須要參考其前一個I幀或者P幀及其後面的一個P幀來生成一張完整的視頻畫面,因此P幀與B幀去掉的是視頻幀在時間維度上的冗餘信息。
IDR幀與I幀 區別

   在H264的概念中有一個幀稱爲IDR幀,那麼IDR幀與I幀的區別是什麼呢?由於H264採用了多幀預測,因此I幀以後的P幀有可能會參考I幀以前的幀,這就使得在隨機訪問的時候不能以找到I幀做爲參考條件,由於即便找到I幀,I幀以後的幀仍是有可能解析不出來,而IDR幀就是一種特殊的I幀,即這一幀以後的全部參考幀只會參考到這個IDR幀,而不會再參考前面的幀。在解碼器中,一旦收到一個IDR幀,就會當即清理參考幀緩衝區,並將IDR幀做爲被參考的幀。

3.3.2 PTS與DTS
    DTS主要用於視頻的解碼,PTS主要用於在解碼階段進行視頻的同步和輸出。在沒有B幀的狀況下,DTS和PTS的輸出順序是同樣的。由於B幀打亂了解碼和顯示的順序,因此一旦存在B幀,PTS與DTS勢必就會不一樣。這裏先簡單介紹一下FFmpeg中使用的PTS和DTS的概念,FFmpeg中使AVPacket結構體來描述解碼前或編碼後的壓縮數據,用AVFrame結構體來描述解碼後或編碼前的原始數據。對於視頻來講,AVFrame就是視頻的一幀圖像,這幀圖像何時顯示給用戶,取決於它的PTS。DTS是AVPacket裏的一個成員,表示該壓縮包應該在何時被解碼,若是視頻裏各幀的編碼是按輸入順序(顯示順序)依次進行的,那麼解碼和顯示時間應該是一致的,可是事實上,在大多數編解碼標準(如H.264或HEVC)中,編碼順序和輸入順序並不一致,因而纔會須要PTS和DTS這兩種不一樣的時間戳。

3.3.2 GOP的概念
   兩個I幀之間造成的一組圖片,就是GOP(Group Of Picture)的概念。一般在爲編碼器設置參數的時候,必需要設置gop_size的值,其表明的是兩個I幀之間的幀數目。前面已經講解過,一個GOP中容量最大的幀就是I幀,因此相對來說,gop_size設置得越大,整個畫面的質量就會越好,可是在解碼端必須從接收到的第一個I幀開始才能夠正確解碼出原始圖像,不然會沒法正確解碼(這也是前面提到的I幀能夠做爲隨機訪問的幀)。在提升視頻質量的技巧中,還有個技巧是多使用B幀,通常來講,I的壓縮率是7(與JPG差很少),P是20,B能夠達到50,可見使用B幀能節省大量空間,節省出來的空間能夠用來更多地保存I幀,這樣就能在相同的碼率下提供更好的畫質。因此咱們要根據不一樣的業務場景,適當地設置gop_size的大小,以獲得更高質量的視頻。

能夠結合IPB幀和下圖,更好地理解PTS與DTS的概念。

相關文章
相關標籤/搜索