像素
观察上面的图片,屏幕上显示小方格的东西就是像素,一张图片有许多个像素点组成,一个视频又有多个图片组成,为了传输更小的空间而被压缩。图片替换的速度特别快,当一个视频超过15帧,人眼会认为连贯不卡顿。
放大观察屏幕显示器,你会发现每个像素是由RGB三个发光管组成。图像是数据,屏幕是显示设备,图像数据经过驱动程序让屏幕显示图像。
屏幕上的每一个像素点是由红绿蓝三个液晶单元组成,通过红、绿和蓝不同的亮度可以组成任何一种颜色。
像素在在传输的过程,怎么表示?
在不同的 BPP 格式中,每个像素的位深是不同的, 用不同的位来分别表示 R、 G、 B,有RGB888,RGB565,RGB555,RBGA32。
有些图像格式不是RGB,是BGR格式,导致色彩不同。需要对对图片进行格式转换,不然显示器显示图像是异常的。
BMP的图象是BGR格式,在读取数据时,把BGR数据顺序转换成RBG,再给到驱动程序。
屏幕指标:
PPI(一寸长内放的像素的数量)
PPI>300时,属于视网膜级别。人眼睛无法看到像素点,是一个清晰的画面。
有几个关键视频信息要注意,分辨率,帧率以及码流?
分辨率很好理解,视频的长宽的像素个数,例如640x360(360P),1280x720(720P),1920x1080(1080P、1K),2560x1440(1440P、2K),3840x2160(4K)。这里可以看到一个规律,前面说的分辨率的比例都是16:9,现在大部分的显示屏的比例基本是这个比例,还有部分显示器是4:3,以前老式电视机就是这个比例。
- 帧率:一秒中连续播放或采集图像的数量。常见的帧率:15、30、60。
- 码流:视频文件中在单位时间使用的数据流量,例如一个多媒体文件的分辨率是1280x720,帧率是15,传输是RGB数据。
未编码视频的RGB码流计算:12807201538b/s ,3代表三原色,因为是bit单位,所以还要乘以8.
为了减少视频数据占用空间,出现一种新的数据格式YUV数据,可以减小视频数据占用空间大小,同时也兼容黑白显示器。但是RBG是给到屏幕展示最后给到显示器还是RGB数据。
YUV数据
YUV数据,YUV数据一样可以表示像素颜色,但是不同的是,YUV数据不是用红蓝绿表示。Y表示亮度,U和V分别表示色调和饱和度。如果是黑白显示器,只要Y分量的数据就可以显示图像,完全兼容以前的黑白显示器。如果是彩色显示器,要用到UV分量的数据。YUV用于采集与编码。
YUV的常见采样格式有YUV420P,YUV422和YUV444。所有的播放都支持YUV420格式。YUV后面数字代表什么?看到后面会有答案。
看下面YUV图像:
分别取出YUV三个分量出来:
Y分量的数据,只有亮度信息,也可以看出人物的样子,只有黑白颜色。缺少了彩色。
这里可以看出单独YUV分量都只有黑白两种颜色,并没有彩色?既然说U和V是色调和饱和度,按理说U和V分量是有一点颜色出来,不至于只有黑白。
后面查看YUV转RGB公式,根据公式计算,要看出U和V分量的差别,需要加入Y分量才能看出来,当只有YU分量时,有蓝色轮廓,当只有YV分量时,呈现有红色轮廓。YUV也有另外一种叫法YCbCr。
YUV转RGB公式?
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
RGB转YUV公式?
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
YUV格式(YCbCr)
可以想象每一个像素是由YUV数据组成。UV等同于CbCr
YUV4:4:4 每一行的每一个像素都有YUV分量。
YUV4:2:2 每一个像素都有Y分量,每间隔一个像素才有UV分量。
YUV4:2:0 并不意味只有Y和Cb分量,而没有Cr分量。它实际指的是对每一行扫描线来说,只有一种色度分量,他以2:1抽样率存储。
为什么是减少UV分量,Y分量为什么不减少?
人眼的视觉特点是对亮度更敏感,对位置、色彩相对来说不敏感,减少UV分量,人眼基本察觉不出来。
相比RGB数量,YUV420P数据量的计算:
YUV = Y1.5
YUV = RGB/2
相比RGB数量,YUV422数据量的计算:
YUV = Y2
YUV = Y/1.5
相比RGB数量,YUV444数据量的计算:
YUV = Y*3
YUV = RGB
YUV存储格式
YUV420存储,先存储Y分量,在存储U分量和V分量。
planar 平面,平面比较平整,对应到存储方式上就是把YUV三种分量依次存储:
I420:YYYYYYYY UU VV =>YUV520P
YV12:YYYYYYYY VV UU=>YUV420P
packed 打包,打包就不一定是平整的了,对应到存储方式上就是把YUV三种分量交叉存储:
YUYV422:YUYV YUYVV YUYV YUYV
NV12:YYYYYYYY UVUV=>YUV420SP
NV21:YYYYYYYY VUVU=>YUV420SP