【音視頻基礎】(十五): I420、YV12、NV12、NV21等常見的YUV420存儲格式

原文鏈接:https://mp.weixin.qq.com/s/LPpY3YSfpZW5cM4DezedTg

較早的時候,我們在【圖像子採樣】中,曾詳細介紹過YUV的YUV444、YUV440、YUV422、YUV411、YUV420等子採樣格式。然而在實際的開發、應用中,我們僅僅知道採樣格式是不夠的,我們還需要知道採樣格式下的存儲格式。比如今天要講的,主流的採樣格式YUV420,它的存儲格式通常就有四種:I420、YV12、NV12、NV21。

1、爲什麼會有存儲格式?

存儲格式是個非常容易理解的事情,我們已經知道YUV420採樣格式,每採樣8個Y分量,就有2個U分量和2個V分量。那麼當把這8、2、2的採樣數據存放到YUV文件時,如何存放呢?要知道,YUV數據存放到YUV文件裏,可不像h264文件還有NALU進行包裝,YUV文件存放的是採樣的原數據,是直接把這8、2、2的採樣數據存到文件裏。

因此如果沒有幾個固定的存儲格式,大家很容易會各存各的,這樣即使我們知道他使用的是YUV420採樣格式,我們也不能正確的打開並播放它。

就像本人目前在Mac上使用的一款付費YUV播放軟件(vooya)一樣(windows有免費版,有時間再介紹),如果要打開一個YUV文件,必須指定視頻的寬高、YUV採樣格式、存儲格式,這三者YUV文件裏都沒有做標記,因此需要我們額外提供。主流做法是以視頻寬高對文件進行命名,比如xxx1920x1080.yuv,而YUV採樣格式和存儲格式進入軟件後再選擇。

比如vooya:
在這裏插入圖片描述

2、YUV420的存儲格式

在開發中,我們使用最多的,就是YUV420採樣格式,這也是安卓和iOS除RGB外默認支持的採樣格式。因此我們本篇主要討論YUV420下,主要的這幾種存儲格式。

2.1 平面和交錯

Y、U、V三個分量在存儲的時候,通常以它們形成的平面(plane)來區分。比如對於一幀圖像,先把所有的Y分量按序存儲,接着是所有的U,最後是所有的V,也即YYYYYYYYUUVV,這就順序形成三個平面。我們通常稱這種能形成三個平面的存儲格式爲YUV420P,其實一般也就兩種:YYYYYYYYUUVV和YYYYYYYYVVUU。

另一種就是交錯存儲的,在採樣格式爲YUV420時,通常只會U和V交錯,也即存儲格式爲YYYYYYYYUVUV或YYYYYYYYVUVU。先把所有的Y分量按序存儲,然後UV交錯。這樣Y分量形成一個平面,UV形成一個平面,總共兩個平面,通常稱爲YUV420SP,這也是在安卓和iOS上使用的YUV存儲格式。

2.2 I420、YV12、NV12、NV21的存儲格式

簡單來講,它們的存儲格式分別爲:
I420: YYYYYYYYUUVV
YV12:YYYYYYYYVVUU
NV12:YYYYYYYYUVUV
NV21:YYYYYYYYVUVU

可以看出,I420和YV12有三個平面,屬於YUV420P的,而NV12和NV21有兩個平面,屬於YUV420SP。

通常我們在YUV資源網站上,下載得到的YUV文件一般是I420的,也即先存Y、後存U、最後V。在上面展示的vooya軟件中,Planar 4:2:0就是I420。

而NV12和NV21則較多應用在安卓和iOS上,比如在iOS攝像機採集的時候,只支持NV12和RGB,這一點我們接下來會出iOS端採集的文章,馬上就會涉及到。

2.3 I420存儲示例

我們也不畫圖了,在維基百科上,有更直觀的I420存儲格式的示例:

在這裏插入圖片描述
I420存儲格式示例

圖中從上倒下爲Y、U、V的存儲順序,箭頭顏色表示了Y、U、V的共用關係。

至於其他採樣格式下的存儲格式,一般情況下我們也用不到,待用到的時候略帶一下即可,它們存儲的思路都是一致的。並且作爲顏色空間,YUV與RGB之間是可以互換的,這個我們在之前的YUV顏色空間系列文章中也介紹過,如【YUV顏色空間—-YUV和YCbCr】中就有SDTV ITU-R BT.601中定義的YCbCr與RGB的轉換,同樣HDTV的ITU-R BT.709下也有對應的轉換公式,也不難搜到。

不過作爲程序員,我們接下來會在代碼中看到,如何從攝像頭採集YUV視頻存到本地,如何使用CPU或GPU進行顏色空間的轉換、以及編碼等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章