音视频学习笔记-YUV数据

YUV数据类型

  • h264编码中,我们使用YUV数据类型进行传输,从采集端采集的RGB转YUV,通过网络传输到接收端,YUV再转成RGB进行显示。
  • 期间涉及数据的压缩,RGB->YUV数据,数据大小比率为2:1,即RGB占用的数据大小为(Width * Height)*3,因为一个像素点需要红黄蓝三种数据表示,而YUV数据则只需要 (Width * Height)*3/2,因为YUV每一个像素点有一个Y(亮度)数据,且一般采用4:2:0的比例,即4个Y共用1个U和1个V.相比原始4:4:4(1个Y用1个U,1个V),则为一半的存储量。
  • 对于YUV数据,YUV的分布原本是4:4:4,但人眼对于亮度(Y)的改变更灵敏,对于色度(UV也称作CrCb)不敏感,所以存储时,丢弃了部分的色度的数据,达到压缩的目的。
    在这里插入图片描述
    这里是Y0Y1Y6Y7共用U0V0,为什么不是Y0Y1Y2Y3共用U0V0呢,这与H264压缩技术有关,一个宏块内,临近的字块当然色度值相差最小,我是这样认为的。
    H264基本原理 https://www.jianshu.com/p/97b4dc8c7f00
    这篇文字写的很好

I420 与 YV12

两者都属于planar的数据形式,关于planar和packet,这里阐述下:
planar模式示例: Y0Y1…Yn U0U1…Um V0V1…Vm,YUV三个通道分别连续存储;
packet模式举例: Y0U0V0 + Y1U1V1 + … + YnUnVn,YUV三个通道混合存储。
我们收到的i420数据是3通道,尤其是在代码中,我们会逐一获取单个平面的数据。

i420的数据排列

i420的数据排列为 Y0Y1…Yn + U0U1…Un + V0V1…Vn
即获取到char *data的类型数据,数据顺序依次是Y,再紧接U和V.
由于Y的数据大小,可以根据4:2:0获取,其长度为 w i d t h h e i g h t width *height ,因为总长度为 w i d t h h e i g h t 3 / 2 width *height*3/2 .这在上面已经说明。
U和V的大小则是Y长度的1/4,则可以根据地址和长度取出。

YV12的数据排列

跟i420不一样的是,U和V的顺序相反。
YV12的数据排列为 Y0Y1…Yn + V0V1…Vn + U0U1…Un

NV12 和 NV21

NV12的数据排列为 Y0Y1…Yn + U0V0U1V1…UnVn
NV21的数据排列为 Y0Y1…Yn + V0U0V1U1…VnUn
两者的区别在于UV的顺序不同,与i420不同,UV是一起连着存储的。

其他的yuv数据类型原理一样

猜你喜欢

转载自blog.csdn.net/shengpeng3344/article/details/91978644