目录
[1 .图像(image)](#1 .图像(image))
[1.1 像素(Pixel)](#1.1 像素(Pixel))
[1.2 颜色深度(Color Depth)](#1.2 颜色深度(Color Depth))
[1.3 分辨率(Resolution)](#1.3 分辨率(Resolution))
[1.4 像素宽高比(Pixel Aspect Ratio)](#1.4 像素宽高比(Pixel Aspect Ratio))
[1.5 帧率(FPS)](#1.5 帧率(FPS))
[1.6 码率(BR)](#1.6 码率(BR))
[1. 恒定码率(CBR)](#1. 恒定码率(CBR))
[2. 可变码率(VBR)](#2. 可变码率(VBR))
[1.7 扫描](#1.7 扫描)
[2. 颜色空间](#2. 颜色空间)
[2.1 采样方式](#2.1 采样方式)
[2.2. YUV422采样的储存格式](#2.2. YUV422采样的储存格式)
[1. YUYV格式](#1. YUYV格式)
[2. UYVY格式](#2. UYVY格式)
[3. YUV422P格式](#3. YUV422P格式)
[2.3 YUV420采样的储存格式](#2.3 YUV420采样的储存格式)
[1. YV12,YU12格式](#1. YV12,YU12格式)
[2. NV12,NV21格式](#2. NV12,NV21格式)
[2.4 总结](#2.4 总结)
基本术语
1 .图像(image)
可以将图像视为一个三维矩阵,分别为红色平面,绿色平面,和蓝色平面。我们把这个矩阵里的每一个点称为像素。像素的色彩由三原色的强度表示,例如一个红色像素是由强度为0的绿色,强度为0的蓝色和强度最大的红色组成。
1.1 像素(Pixel)
像素是图像中的物理点,他是屏幕上表示图片的最小可控元素。例如上述中的各个分量表示的强度点,即为一个像素值。
1.2 颜色深度(Color Depth)
存储颜色的强度,需要占用一定大小的数据空间,这个大小被称为颜色深度,用于指示单个像素颜色的位数。假如每个颜色平面的强度占用8bit(0-255),那么颜色深度就是24bit,这样可以显示2的24次方种不同的颜色。
1.3 分辨率(Resolution)
一张图片的像素的数量。通常表示为:widthxheight;
1.4 像素宽高比(Pixel Aspect Ratio)
像素宽高比,也叫PAR,是一个数学比率,用于描述图像中像素的宽度和高度的比值。
1.5 帧率(FPS)
将单位时间内连续切换n个视频画面,叫做帧率,其中n即为帧率。
1.6 码率(BR)
播放一段视频每秒所需的是数据量叫做比特率,即码率(BitRate)
其计算公式为:Bitrate=width x height * bits_per_pixel *fps;
例如,一段视频每秒30帧,每个像素24bit,分辨率为480x240。如果我们不做压缩,他将需要82.944Mbps的带宽。
1. 恒定码率(CBR)
当比特率几乎恒定时称为恒定比特率(constant bitrate即 CBR)。
以恒定的1.2Mbps码率播放如下内容:
2. 可变码率(VBR)
当比特率可变时,称为可变比特率(Variable Bitrate即VBR),比如可变码率播放如下内容:
前面连续黑帧率的时候,较低码率为200Kbps,后面实际的信息量的内容,以较高的码率2.4Mbps呈现,这样可以有效的优化带宽,并能够较好的呈现有价值的信息。
1.7 扫描
在传送图像的时候,将每一帧图像分解为像素,之后一个一个像素,一行一行顺序传送的方式就叫做扫描。
1.隔行扫描(Interlaced)
在早期,工程师们想出了一项技术能将视频的感官帧率加倍而没有消耗额外带宽。这项技术被称为隔行扫描,总体来说,他在一个时间点发送一个画面用于填充屏幕的一半,而下一个时间点发送画面用于填充屏幕的另一半。
原理就是将一帧的这一幅画面分为两个场来扫描。先扫描奇数行得到第一场,然后扫描偶数行得到第二场。两个场加起来组成完整的画面。快速播放的时候由于视觉暂留效应,人眼不会注意到两场只有一半的扫描行,而会看到完整的一帧。
2.逐行扫描
在带宽充裕的今天,基本上都使用了逐行,按照每行来一次绘制。
2. 颜色空间
一般来说,我们最熟悉的颜色空间是由RGB三基色组成的颜色空间,还有一种模型是将亮度,颜色分离开的,他被称为YCbCr,这种颜色模型使用Y来表示亮度,还有两个颜色通道:Cb(蓝色色度)和Cr(红色色度)。YCbCr可以由RGB转换得来,也可以转换回RGB。通过公式可以相互转换。
RGB ->YUV:
Y=0.299R+0.587G+0.114B
Cb=0.564(B-Y)
Cr=0.713(R-Y)
YUV->RGB:
R=Y + 1.402Cr
G=Y-0.344Cb -- 0.714Cr
B=Y + 1.772Cb
2.1 采样方式
主流的采样方式由三种,
YUV4:4:4 每一个Y对应一组UV分量
YUV4:2:2 每两个Y共用一组UV分量
YUV4:2:0, 每四个Y共用一组UV分量
2.2. YUV422采样的储存格式
1. YUYV格式
从内存分布图可以看出,相邻的两个Y共用相邻的两个UV,比如坐标(0,0),与坐标(0,1)其中的像素点为Y0U0V0,Y1U0V0,其中他们UV分量是同一个值。那么相对于RGB88,存储数据量少多少呢?
RGB888 size = 10*5(R) + 10*5(G) + 10*5(B) = 150byte
YUYV size = 10*5(Y) + 10/2*5(U) + 10/2*5(V) =100byte
也就是说YUYV的储存数据量是RGB888的数据量的2/3。但是显示效果几乎是一样的。
2. UYVY格式
与YUYV不同的是UV分量的排列顺序不同而已。
3. YUV422P格式
YUV422P是一种平面模式,也就是说他们的YUV数据存储不是交错存储,而是先存储所有的Y分量,然后储存所有的U(Cb)分量,最后储存所有的V(Cr)分量.
每个分量的起始地址计算:
Y分量的地址:也就是内存的基地址
U分量的地址: base + 10x5(Y size)
V 分量的地址: base + 10x 5(y size) + 10x5/2(U size)
2.3 YUV420采样的储存格式
1. YV12,YU12格式
与YUV422P的储存格式类似,将Y,U,V分量分别打包,依次存储。
从内存分布图可以看出,相邻的四个Y共用相邻的两个UV,比如坐标(0,0),与坐标(0,1),坐标(0,2),坐标(0,3)其中的像素点为Y0U0V0,Y1U0V0,Y2U0V0,Y2U0V0,可以看出他们UV分量是同一个值。那么相对于RGB88,存储数据量少多少呢?
RGB888 size = 12*5(R) + 12*5(G) + 12*5(B) = 180byte
YUYV size = 12*5(Y) + 12/4*5(U) + 12/4*5(V) =90byte
也就是说YUYV的储存数据量是RGB888的数据量的1/2。以损失极小的失真换来一倍的带宽,这是非常划算的。
每个分量的起始地址计算:
Y分量的地址:也就是内存的基地址
U分量的地址: base + 12x5(Y size)
V 分量的地址: base + 12x 5(y size) + 10x5/4(U size)
2. NV12,NV21格式
是一种two-plane模式,即Y和UV分为两个平面。与yuv420p不同的是,UV(CbCr)是交错存储,而不是分为三个平面。
2.4 总结
YUYV:是4:2:2[Y0 U0 Y1 V0]
YUV420:y0u0v0 y1u0v0 y2u0v0 y3u0v0
YUV420P:Y ,U ,V三个分量都是平面格式,也就是说三个分量的内存是连续的。
YUV420SP,Y分量是平面格式,UV是交错存储的。
3.消除冗余
冗余信息是指一帧或者多帧之间的多余信息,比如,一帧图片内的信息,很多都是蓝色,那么是否可以考虑用一个蓝色来编码其他相同颜色的内容呢?比如:一路码流,有连续N帧的内容都是禁止或者变化不大的,那这之间的每帧信息都有大量的重复冗余信息。如果不消除冗余数据,那么数据传输和存储上来说数据量太大了,基本上目前是无法接接受的。所以呢,我们需要对视频进行压缩,进行冗余消除。
3.1怎么消除冗余
前面说了,可以通过压缩视频连续帧数据的方式来减小带宽和储存压力,那么具体是如何有效的压缩的呢?