前言
YUV與RGB是兩種不同的顏色空間,視頻一般都用YUV來進(jìn)行存儲(chǔ)啃擦,因?yàn)橄嗤直媛实囊曨lRGB占用空間為YUV420的1.5倍
YUV的采樣方式
YUV根據(jù)采樣方式的不同格带,其占用大小也不一樣撤缴,主流有如下三種
- YUV444
每一個(gè)Y對應(yīng)一組UV分量,即:一個(gè)YUV占8+8+8 = 24bits,3個(gè)字節(jié)叽唱。 - YUV422
每兩個(gè)Y共用一組UV分量屈呕,即:一個(gè)YUV占8+4+4 = 16bits 2個(gè)字節(jié)。 - YUV420
每四個(gè)Y共用一組UV分量尔觉,即:一個(gè)YUV占8+2+2 = 12bits 1.5個(gè)字節(jié)凉袱。
YUV420的分類
因?yàn)閅UV420占用空間最小,所以目前主流都是使用的YUV420方式侦铜,它根據(jù)存儲(chǔ)方式的不同又分為YUV420P和YUV420SP兩種
1专甩、YUV420P
稱為planer平面模式,Y 钉稍,U涤躲,V分別位于三個(gè)不同平面。一般在內(nèi)存中按照如下方式存儲(chǔ):YYYY.....U......V.......或者YYYY.....V......U.......贡未;
- I420:又叫YU12种樱,是按照YUV順序存儲(chǔ)的蒙袍,安卓攝像頭視頻錄制的視頻就支持這種存儲(chǔ)方式
存儲(chǔ)方式為:亮度(行×列) + U(行×列/4) + V(行×列/4) - YV12:是按照YVU的順序存儲(chǔ)的
存儲(chǔ)方式為:亮度(行×列) + V(行×列/4) + U(行×列/4)
planner格式的YUV420拿到每一個(gè)YUV像素的偽代碼為(C語言):
2、YUV420SP
稱為雙-planner平面模式嫩挤,用兩個(gè)平面存儲(chǔ)YUV害幅,其中Y存儲(chǔ)于一個(gè)平面,UV存儲(chǔ)于另一個(gè)平面岂昭。一般在內(nèi)存中按照如下方式存儲(chǔ):YYYY........U......V.......或者YYYY........UVUV.......
- NV12:存儲(chǔ)順序是先存Y以现,再UV交替存儲(chǔ)。YYYYUVUVUV约啊;iOS系統(tǒng)采用此種方式
存儲(chǔ)方式為:亮度(行×列) + UV(行×列/2) - NV21:存儲(chǔ)順序是先存Y邑遏,再存U,再VU交替存儲(chǔ)恰矩。YYYYVUVUVU;按照系統(tǒng)采用此種方式
存儲(chǔ)方式為:亮度(行×列) + VU(行×列/2)
雙-planner平面模式分離出YUV的偽代碼為(C語言,以NV12為例):
// 這里代表 y和uv的數(shù)據(jù)內(nèi)存塊
uint_8 *ybuf,uvbuf;
// 代表視頻的寬高
int width,height;
for(int y = 0; y < height; y++) {
uint8_t *yBufferLine = ybuf+y * width;
// y/2能保證每四個(gè)YYYY對應(yīng)一組uv
uint8_t *cbCrBufferLine = uvbuf + (y >> 1) * width;
for(int x = 0; x < width; x++) {
uint_8 y = yBufferLine[x];
uint_8 cb = cbCrBufferLine[x & ~1] ;
uint_8 cr = cbCrBufferLine[x | 1];
}
}