1. 程式人生 > >FFmpeg In Android - Yuv格式

FFmpeg In Android - Yuv格式

YUV(也稱YCrCb)也是一種顏色編碼方法,主要用於電視系統以及模擬視訊領域,它將亮度資訊(Y)與色彩資訊(UV)分離,沒有UV資訊一樣 可以顯示完整的影象,只不過是黑白的,這樣的設計很好地解決了彩色電視機與黑白電視的相容問題。並且,YUV不像RGB那樣要求三個獨立的視訊訊號同時傳 輸,所以用YUV方式傳送佔用極少的頻寬。
“Y”代表亮度(Luma channel), 也就是灰階值;“U”和“V”表示的則是色度(Chroma),作用是描述影像色彩及飽和度,用於指定畫素的顏色.
業界採用A:B:C的方式來表示U,V相對於Y取樣值,例如 YUV 4:4:4 ,YUV 4:2:2, YUV 4:2:0

(下面圖片中,交叉X代表一個Y取樣, 圓圈O代表一個UV取樣)

YUV 4:4:4
YUV三個通道的抽樣率相同,因此在生成的影象裡,每個象素的三個分量Y,U,V資訊完整(每個分量通常8位元),經過8位元量化之後,未經壓縮的每個畫素佔用3個位元組。

假設圖片寬高為w * h, 每個畫素點3個位元組,則圖片大小size = w * h * 3 ,

YUV 4:2:2
每個色差通道的抽樣率是亮度通道的一半,即每2個Y,對應一個U,一個V,則未經壓縮2個畫素佔用Y*2+U+V=4個位元組

假設圖片寬高為w * h, 則圖片大小size = w * h / 2 * 4 = w * h * 2,

YUV4:2:0
4:2:0並不意味著只有Y,Cb而沒有Cr分量。它指得是對每行掃描線來說,只有一種色度分量以2:1的抽樣率儲存。進行隔行掃描,相鄰的掃描行儲存不同的色度分量,也就是說,如果一行是4:2:0的話,下一行就是4:0:2,再下一行是4:2:0…以此類推。即每4個Y,對應一個U,一個V,則未經壓縮4個畫素佔用Y*4+U+V=6個位元組

假設圖片寬高為w * h, 則圖片大小size = w * h / 4 * 6 = w * h * 3 / 2 = w * h * 1.5

上面只是邏輯佈局,但作為碼農更想知道他們的物理佈局(儲存方式),因為要讀取資料。這要先了解兩個概念:packed(打包模式)和planar(平行模式). 對於packed打包模式,Y,U,V都儲存在一個單獨陣列,其佈局取決於格式。對於planar平行模式,Y, U, V分開儲存.

FFmpeg YUV420中,AVFrame->data[0]專門存Y,data[1]專門存U,data[2]專門存V。而packed則是打包,所有資料都存在data[0]中,而data[1]和data[2]都為NULL。
具體哪個格式是planar,哪個格式是packed,可以檢視pixfmt.h檔案。注:有些格式名稱後面是LE或BE,分別對應little-endian或big-endian。另外名字後面有P的是planar格式。

在前面的例子(連結)中,執行avpicture_fill後,data[0]將指向buff的開始位置,即data[0]等於buff。data[1]指向buff陣列的某一個位置(該位置為U分量的開始處),data[2]也指向buff陣列某一個位置(該位置為V分量的開始處)。
有些網友說到,對於planar模式,需要分開讀取和寫的。其實,無論是planar還是packed模式,在用acpicture_fill函式處理後,都可以用下面的方法把一張影象的資料讀取到AVFrame中,而不需要分別讀data[0]、data[1]、data[2]。因為對於影象檔案來說,如果是plannar模式的影象格式,其儲存必然是先存完一張影象所有的所有Y、緊接著再存一張影象的所有U、緊接著存一張影象的所有V。這剛好和data陣列的三個指標的對應的。
fread(frame->data[0], 1, bytes_num, fin);
同樣對於寫影象也是如此。無需分data[0]、data[1]、data[2]。

這裡主要說明linesize這個成員的含義。
YUV格式中有一個很重要的等量關係,那就是有多少個畫素就有多少個y。
linesize正如其名,一條線(即一行)的大小。對於yuv420p。data[0]存放的是y,對應地linesize[0]就
指明一行有多少個y。對於352*288的影象,一行有352個畫素。根據剛才的等量關係。那麼linesize[0]就
應該為352.即一行有352個y。對於linesize[1],因為data[1]存放的是u。而一行352個畫素在yuv420p格式中,
其只需352/2,即176個。所以linesize[1]的大小為176。同理linesize[2]也為176。

轉:RGB、YUV和HSV顏色空間模型
轉:YUV(一)-資料格式分析
轉:Video Rendering with 8-Bit YUV Formats
轉:FFMPEG 實現 YUV,RGB各種影象原始資料之間的轉換(swscale
轉:YUV格式詳細解釋與FFMPEG的關係
轉:影象視訊編碼和FFmpeg(2)-----YUV格式介紹和應用