1. 程式人生 > >YUV視訊碼流介紹

YUV視訊碼流介紹

視訊顏色編碼編碼常用的有RGB,YUV等,RGB也就是我們常說的三原色,一個畫素會採集三個向量,佔用更大的頻寬,常用於圖形的渲染。而YUV編碼,有更小的頻寬,常用於網路視訊的傳輸

YUV介紹

YUV採用亮度/色度等來描述一個畫素。其中Y代表亮度,UV表示色度和濃度
Y’UV,YUV,YCbCr,YPbPr等都是YUV格式。區別在於, Y’UV,YUV,是以前使用時電視,用來描述模擬訊號的,而YCbCr,YPbPr等是現在描述網路傳輸的數字訊號的。

YUV與RGB轉換

YUV的 U越大,顏色越藍,V越大,顏色越紅,RGB的轉換有很多,列一個簡單的轉換。
Y = 0.299 R + 0.587 G + 0.114 B
U = - 0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128
反過來,RGB 也可以直接從YUV (256級別) 計算:
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)

YUV取樣方式

那麼在儲存時候,會將所以畫素的YUV儲存下來嗎?YUV相比RGB格式節約頻寬就是因為它採取一種抽樣的方式,相鄰畫素只採集Y,而畫素的UV在幾個周圍畫素點中是公用的。
所以,在YUV取樣時候,那些畫素UV公用等,具體怎麼取樣。就出現了幾種方式,主流的取樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0。取樣方式用來描述一個巨集畫素,一個巨集畫素由4個畫素組成
YUV4:4:4代表1個巨集畫素,Y採集4次,U採集4次,V採集4次。
YUV4:4:2代表1個巨集畫素,Y採集4次,U採集4次,V採集2次。
YUV4:4:0代表1個巨集畫素,Y採集4次,U採集4次,V採集0次。
其中v為0次不代表就不會採集V,而是和U相互援引,下次就變為YUV4:0:4再下次又變成YUV4:4:0
RGB採集時每個分量採用8bit儲存,所以一個畫素需要8*3=24bit


而如果採用YUV4:1:1格式,一個畫素需要8bit+8/4+8/4=12bit,影象就壓縮了一半。

YUV分類方式

YUV格式分為兩大類:planar(平面格式)和packed(打包格式)
  對於planar的YUV格式,先連續儲存所有畫素點的Y,然後儲存所有畫素點的U,隨後是所有畫素點的V。如IF09,YVU9等格式。
  比如採用YUV4:4:4採集的平面格式,Y1Y2Y3Y4Y5…U1U2U3U4U5…V1V2V3V4V5
  對於packed的YUV格式,先存一個畫素點的YUV再存下一個畫素點的YUV。
YUV分類格式的不同,採集的格式也不同,在儲存時候也會有所不同。如YUV2,Y211等
比如採用YUV4:4:4採集的打包格式,Y1U1V1Y2U2V2Y3U3V3…

YUV的儲存方式

採用不同的分類格式和不同採集格式就有不同的儲存方式

YUV4:4:4的打包格式

   //一個巨集畫素,兩行兩列四個畫素
   [Y0U0V0] [Y1U1V1]
   [Y2U2V2] [Y3U3V3]
   //儲存的碼流
   Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3 

YUV4:2:2的打包格式

   //一個巨集畫素,兩行兩列四個畫素
   [Y0U0V0] [Y1U1V1]
   [Y2U2V2] [Y3U3V3]
   //儲存的碼流
   //U和V橫向兩個畫素共用,所以橫向一個畫素採集U一個畫素採集V
   Y0 U0 Y1 V1 Y2 U2 Y3 V3
   //還原時候的畫素
   [Y0U0V1] [Y1U0V1]
   [Y2U2V3] [Y3U2V3]

YUV4:1:1的打包格式

   //一個巨集畫素,兩行兩列四個畫素
   [Y0U0V0] [Y1U1V1]
   [Y2U2V2] [Y3U3V3]
   //儲存的碼流
   //U和V橫列向四個畫素共用,唯一的U由0來採集,唯一的V由2採集(列採集)
   Y0 U0 Y1 Y2 V2 Y3 
   //還原時候的畫素
   [Y0U0V2] [Y1U0V2]
   [Y2U0V2] [Y3U0V2]

YUV4:2:0的打包格式

   //一個巨集畫素,兩行兩列四個畫素
   [Y0U0V0] [Y1U1V1]  [Y4U4V4] [Y5U5V5]
   [Y2U2V2] [Y3U3V3]  [Y6U6V6] [Y7U7V7]
   //儲存的碼流
   //不表示V不採集而是代表Y與UV的比例為2:1。第一個巨集畫素採集U下一個就採集V
   //所以一個畫素佔8+4=12bit
   Y0 U0 Y1 Y2 U2 Y3   Y4 V4 Y5 Y6 V6 Y7
   //還原時候的畫素
   [Y0U0V4] [Y1U0V4]   [Y4U0V4] [Y5U0V4]
   [Y2U2V6] [Y3U2V6]   [Y6U2V6] [Y7U2V6]

在這裡插入圖片描述