在好比作移動客戶端開發中(iOS,安卓),咱們在直播中要將本地視頻推流到服務器,如何將本地相機採集的數據表示出來,或者好比咱們要對採集到視頻作旋轉,裁剪,美顏等操做,如何能高效的完成以上動做,咱們都不得很差好了解清楚圖像的結構,以致於咱們能用代碼的形式將它表示出來。html
YUV是一種顏色編碼方式,主要用於電視系統以及模擬視頻領域,它將亮度信息(Y)與色彩信息(UV)分離,沒有UV信息同樣能夠顯示完整的圖像,只不過是黑白的,這樣的設計很好地解決了彩色電視機與黑白電視兼容的問題。linux
YUV不像傳統RGB那樣要求三個獨立的視頻信號同時傳輸,所以YUV方式傳輸視頻佔用較少帶寬。數組
Y'UV, YUV, YCbCr, YPbPr, etc.bash
這幾個詞乍一看十分類似.服務器
在過去,YUV 和 Y'UV被用做電視系統中顏色信息的特定模擬信息編碼。而YCbCr被用做顏色信息的數字編碼,一般適用於視頻和靜態圖像的壓縮和傳輸(MPEG, JPEG)。編碼
今天,YUV一般用被用在計算機行業描述使用YCbCr編碼的文件格式。spa
Y:表示明亮度(Luminance,Luma),也就是灰度值設計
U和V:色度(Chrominance,Chroma),描述影像色彩及飽和度。code
瞭解了以上三幅圖的YUV採集方式後,咱們來重點說一下YUV的數據是如何存儲的。cdn
在以上三張圖中,實心圓圈表明一個Y份量,空心圓圈表明一個UV份量,而由於又分三種不一樣的採集方式,即1個Y對應一組UV份量,2個Y共用一組UV份量,4個Y共用一組UV份量,
以YUV4:2:0爲例,它又被分爲YUV420P與YUV420SP,它們都是YUV420格式。
根據以上兩幅圖,咱們以分辨率爲640*480的圖片爲例,則它的大小爲 Y : width(640) * height(480) 可認爲每一個Y即爲每一個像素點,又由於每4個Y共用一組UV,因此,U和V的大小都爲: width(640) * height(480) * (1 / 4 ). 因此圖片真正的大小爲 Y+U+V = 3 / 2 * (width(640) * height(480)).
知道了YUV像素的排列方式以及如何求圖像真正大小後咱們即可以開始咱們真正的工做。
在程序中,好比一張圖片的分辨率爲640*480,若是該圖片的格式爲YUV420P,則咱們能夠很輕鬆的算出這張圖片的Y,U,V三個份量。 咱們用數組來存儲該圖像的大小byte[] src 則(I420)
Y = src[width * height];
U = Y + scr[1/4 * width * height];
V = U + scr[1/4 * width * height];
複製代碼
注意,計算的結果是經過不一樣格式來求的,因此再也不一一介紹。
YUV格式可分爲兩大類:打包(packed) , 平面(planar)
在之後的開發中,假如咱們要對視頻流中的圖片作一些特殊處理,好比Crop, Rotate, Scale, 美顏等等,若是想高效實現咱們必須瞭解YUV的格式這樣咱們才能作出正確處理。
本文爲YUV的基礎知識,幫助初學者或在工做中接觸音視頻開發後因概念難以理解形成困惑沒法繼續開發的開發人員,只有咱們瞭解了YUV的組成才能在代碼中進行靈活應用,包括使用例如libyuv等優秀的第三方庫。