详解YUV420数据格式.docx
- 文档编号:12307703
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:21
- 大小:129.57KB
详解YUV420数据格式.docx
《详解YUV420数据格式.docx》由会员分享,可在线阅读,更多相关《详解YUV420数据格式.docx(21页珍藏版)》请在冰豆网上搜索。
详解YUV420数据格式
图文详解YUV420数据格式
⏹YUV格式有两大类:
planar和packed。
Ø对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
Ø对于packed的YUV格式,每个像素点的Y,U,V是连续交替存储的。
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。
并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:
4:
4,YUV4:
2:
2,YUV4:
2:
0,关于其详细原理,可以通过网上其它文章了解,这里我想强调的是如何根据其采样格式来从码流中还原每个像素点的YUV值,因为只有正确地还原了每个像素点的YUV值,才能通过YUV与RGB的转换公式提取出每个像素点的RGB值,然后显示出来。
用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。
先记住下面这段话,以后提取每个像素的YUV分量会用到。
YUV 4:
4:
4采样,每一个Y对应一组UV分量。
YUV 4:
2:
2采样,每两个Y共用一组UV分量。
YUV 4:
2:
0采样,每四个Y共用一组UV分量。
⏹存储方式
下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。
(1)YUVY格式(属于YUV422)
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01而言,其Cb、Cr的值均为Cb00、Cr00,其他的像素点的YUV取值依次类推。
(2)UYVY格式(属于YUV422)
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。
(3)YUV422P(属于YUV422)
YUV422P也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。
其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。
比如,对于像素点Y'00、Y'01而言,其Cb、Cr的值均为Cb00、Cr00。
(4)YV12,YU12格式(属于YUV420)
YU12和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。
其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。
注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。
(5)NV12、NV21(属于YUV420)
NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。
其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00。
YUV420planar数据,以720×480大小图象YUV420planar为例,其存储格式是:
大小为(720×480×3>>1)字节,分为三个部分:
Y,U和V:
Y分量:
(720×480)个字节;
U(Cb)分量:
(720×480>>2)个字节;
V(Cr)分量:
(720×480>>2)个字节。
三个部分内部均是行优先存储,三个部分之间是Y,U,V顺序存储。
即:
YUV数据的0----720×480字节是Y分量值,
720×480----720×480×5/4字节是U分量
720×480×5/4----720×480×3/2字节是V分量。
Ø4:
2:
2和4:
2:
0转换:
最简单的方式:
YUV4:
2:
2--->YUV4:
2:
0 Y不变,将U和V信号值在行(垂直方向)在进行一次隔行抽样。
YUV4:
2:
0--->YUV4:
2:
2 Y不变,将U和V信号值的每一行分别拷贝一份形成连续两行数据。
在YUV420中,一个像素点对应一个Y,一个4X4的小方块对应一个U和V。
对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像。
YUV420sp与YUV420p的数据格式它们的UV排列在原理上是完全不同的。
420p它是先把U存放完后,再存放V,也就是说UV它们是连续的。
而420sp它是UV、UV这样交替存放的。
(见下图)有了上面的理论,我就可以准确的计算出一个YUV420在内存中存放的大小。
width*hight=Y(总和)U=Y/4 V=Y/4
所以YUV420数据在内存中的长度是width*hight*3/2,
假设一个分辨率为8X4的YUV图像,它们的格式如下图:
ØYUV420sp格式如下图
ØYUV420p数据格式如下图
旋转90度的算法:
publicstaticvoidrotateYUV240SP(byte[]src,byte[]des,intwidth,intheight)
{
intwh=width*height;
//旋转Y
intk=0;
for(inti=0;i for(intj=0;j { des[k]=src[width*j+i]; k++; } } for(inti=0;i for(intj=0;j { des[k]=src[wh+width*j+i]; des[k+1]=src[wh+width*j+i+1]; k+=2; } } } YV12和I420的区别: 一般来说,直接采集到的视频数据是RGB24的格式,RGB24一帧的大小size=width×heigth×3byte,RGB32的size=width×heigth×4,如果是I420(即YUV标准格式4: 2: 0)的数据量是size=width×heigth×1.5byte。 在采集到RGB24数据后,需要对这个格式的数据进行第一次压缩。 即将图像的颜色空间由RGB2YUV。 因为,X264在进行编码的时候需要标准的YUV(4: 2: 0)。 但是这里需要注意的是,虽然YV12也是(4: 2: 0),但是YV12和I420的却是不同的,在存储空间上面有些区别。 如下: YV12: 亮度(行×列)+U(行×列/4)+V(行×列/4) I420: 亮度(行×列)+V(行×列/4)+U(行×列/4) 可以看出,YV12和I420基本上是一样的,就是UV的顺序不同。 继续我们的话题,经过第一次数据压缩后RGB24->YUV(I420)。 这样,数据量将减少一半,为什么呢? 呵呵,这个就太基础了,我就不多写了。 同样,如果是RGB24->YUV(YV12),也是减少一半。 但是,虽然都是一半,如果是YV12的话效果就有很大损失。 然后,经过X264编码后,数据量将大大减少。 将编码后的数据打包,通过RTP实时传送。 到达目的地后,将数据取出,进行解码。 完成解码后,数据仍然是YUV格式的,所以,还需要一次转换,这样windows的驱动才可以处理,就是YUV2RGB24。 YUY2 是4: 2: 2 [Y0U0Y1V0] yuv420p和YUV420的区别在存储格式上有区别 1.yuv420p: yyyyyyyyuuuuuuuuvvvvv 2.yuv420: yuvyuvyuv YUV420P,Y,U,V三个分量都是平面格式,分为I420和YV12。 I420格式和YV12格式的不同处在U平面和V平面的位置不同。 在I420格式中,U平面紧跟在Y平面之后,然后才是V平面(即: YUV);但YV12则是相反(即: YVU)。 YUV420SP,Y分量平面格式,UV打包格式,即NV12。 NV12与NV21类似,U和V交错排列,不同在于UV顺序。 I420: YYYYYYYYUUVV =>YUV420P YV12: YYYYYYYYVVUU =>YUV420P NV12: YYYYYYYYUVUV =>YUV420SP NV21: YYYYYYYYVUVU =>YUV420SP YUV是指亮度参量和色度参量分开表示的像素格式,而这样分开的好处就是不但可以避免相互干扰,还可以降低色度的采样率而不会对图像质量影响太大。 YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式。 转载一篇对yuv格式解释的比较清楚地文章,也可以直接参考微软的那篇文章。 对于YUV格式,比较原始的讲解是MPEG-2VIDEO部分的解释,当然后来微软有一个比较经典的解释,中文的大多是翻译这篇文章的。 文章来源: 这里转载有人已经翻译过的,个人认为已经翻译的很不错了,遂放弃翻译。 YUV格式解析1(播放器——project2) 根据板卡api设计实现yuv420格式的视频播放器 打开*.mp4;*.264类型的文件,实现其播放。 使用的视频格式是YUV420格式 YUV格式通常有两大类: 打包(packed)格式和平面(planar)格式。 前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。 表2.3中的YUY2到Y211都是打包格式,而IF09到YVU9都是平面格式。 (注意: 在介绍各种具体格式时,YUV各分量都会带有下标,如Y0、U0、V0表示第一个像素的YUV分量,Y1、U1、V1表示第二个像素的YUV分量,以此类推。 ) MEDIASUBTYPE_YUY2YUY2格式,以4: 2: 2方式打包 MEDIASUBTYPE_YUYVYUYV格式(实际格式与YUY2相同) MEDIASUBTYPE_YVYUYVYU格式,以4: 2: 2方式打包 MEDIASUBTYPE_UYVYUYVY格式,以4: 2: 2方式打包 MEDIASUBTYPE_AYUV带Alpha通道的4: 4: 4YUV格式 MEDIASUBTYPE_Y41PY41P格式,以4: 1: 1方式打包 MEDIASUBTYPE_Y411Y411格式(实际格式与Y41P相同) MEDIASUBTYPE_Y211Y211格式 MEDIASUBTYPE_IF09IF09格式 MEDIASUBTYPE_IYUVIYUV格式 MEDIASUBTYPE_YV12YV12格式 MEDIASUBTYPE_YVU9YVU9格式 表2.3 YUV采样 YUV的优点之一是,色度频道的采样率可比Y频道低,同时不会明显降低视觉质量。 有一种表示法可用来描述U和V与Y的采样频率比例,这个表示法称为A: B: C表示法: • 4: 4: 4表示色度频道没有下采样。 • 4: 2: 2表示2: 1的水平下采样,没有垂直下采样。 对于每两个U样例或V样例,每个扫描行都包含四个Y样例。 • 4: 2: 0表示2: 1的水平下采样,2: 1的垂直下采样。 • 4: 1: 1表示4: 1的水平下采样,没有垂直下采样。 对于每个U样例或V样例,每个扫描行都包含四个Y样例。 与其他格式相比,4: 1: 1采样不太常用,本文不对其进行详细讨论。 图1显示了4: 4: 4图片中使用的采样网格。 灯光样例用叉来表示,色度样例则用圈表示。 图1.YUV4: 4: 4样例位置 4: 2: 2采样的这种主要形式在ITU-RRecommendationBT.601中进行了定义。 图2显示了此标准定义的采样网格。 图2.YUV4: 2: 2样例位置 4: 2: 0采样有两种常见的变化形式。 其中一种形式用于MPEG-2视频,另一种形式用于MPEG-1以及ITU-TrecommendationsH.261和H.263。 图3显示了MPEG-1方案中使用的采样网格,图4显示了MPEG-2方案中使用的采样网格。 图3.YUV4: 2: 0样例位置(MPEG-1方案) 图4.YUV4: 2: 0样例位置(MPEG-2方案) 与MPEG-1方案相比,在MPEG-2方案与为4: 2: 2和4: 4: 4格式定义的采样网格之间进行转换更简单一些。 因此,在Windows中首选MPEG-2方案,应该考虑将其作为4: 2: 0格式的默认转换方案。 表面定义 本节讲述推荐用于视频呈现的8位YUV格式。 这些格式可以分为几个类别: • 4: 4: 4格式,每像素32位 • 4: 2: 2格式,每像素16位 • 4: 2: 0格式,每像素16位 • 4: 2: 0格式,每像素12位 首先,您应该理解下列概念,这样才能理解接下来的内容: • 表面原点。 对于本文讲述的YUV格式,原点(0,0)总是位于表面的左上角。 • 跨距。 表面的跨距,有时也称为间距,指的是表面的宽度,以字节数表示。 对于一个表面原点位于左上角的表面来说,跨距总是正数。 • 对齐。 表面的对齐是根据图形显示驱动程序的不同而定的。 表面始终应该DWORD对齐,就是说,表面中的各个行肯定都是从32位(DWORD)边界开始的。 对齐可以大于32位,但具体取决于硬件的需求。 • 打包格式与平面格式。 YUV格式可以分为打包格式和平面格式。 在打包格式中,Y、U和V组件存储在一个数组中。 像素被组织到了一些巨像素组中,巨像素组的布局取决于格式。 在平面格式中,Y、U和V组件作为三个单独的平面进行存储。 4: 4: 4格式,每像素32位 推荐一个4: 4: 4格式,FOURCC码为AYUV。 这是一个打包格式,其中每个像素都被编码为四个连续字节,其组织顺序如下所示。 图5.AYUV内存布局 标记了A的字节包含alpha的值。 4: 2: 2格式,每像素16位 支持两个4: 2: 2格式,FOURCC码如下: • YUY2 • UYVY 两个都是打包格式,其中每个巨像素都是编码为四个连续字节的两个像素。 这样会使得色度水平下采样乘以系数2。 YUY2 在YUY2格式中,数据可被视为一个不带正负号的char值组成的数组,其中第一个字节包含第一个Y样例,第二个字节包含第一个U(Cb)样例,第三个字节包含第二个Y样例,第四个字节包含第一个V(Cr)样例,如图6所示。 图6.YUY2内存布局 如果该图像被看作由两个little-endianWORD值组成的数组,则第一个WORD在最低有效位(LSB)中包含Y0,在最高有效位(MSB)中包含U。 第二个WORD在LSB中包含Y1,在MSB中包含V。 YUY2是用于MicrosoftDirectX®VideoAcceleration(DirectXVA)的首选4: 2: 2像素格式。 预期它会成为支持4: 2: 2视频的DirectXVA加速器的中期要求。 UYVY 此格式与YUY2相同,只是字节顺序是与之相反的—就是说,色度字节和灯光字节是翻转的(图7)。 如果该图像被看作由两个little-endianWORD值组成的数组,则第一个WORD在LSB中包含U,在MSB中包含Y0,第二个WORD在LSB中包含V,在MSB中包含Y1。 图7.UYVY内存布局 4: 2: 0格式,每像素16位 推荐两个4: 2: 0每像素16位格式,FOURCC码如下: • IMC1 • IMC3 两个FOURCC码都是平面格式。 色度频道在水平方向和垂直方向上都要以系数2来进行再次采样。 IMC1 所有Y样例都会作为不带正负号的char值组成的数组首先显示在内存中。 后面跟着所有V(Cr)样例,然后是所有U(Cb)样例。 V和U平面与Y平面具有相同的跨距,从而生成如图8所示的内存的未使用区域。 图8.IMC1内存布局 IMC3 此格式与IMC1相同,只是U和V平面进行了交换: 图9.IMC3内存布局 4: 2: 0格式,每像素12位 推荐四个4: 2: 0每像素12位格式,FOURCC码如下: • IMC2 • IMC4 • YV12 • NV12 在所有这些格式中,色度频道在水平方向和垂直方向上都要以系数2来进行再次采样。 IMC2 此格式与IMC1相同,只是V(Cr)和U(Cb)行在半跨距边界处进行了交错。 换句话说,就是色度区域中的每个完整跨距行都以一行V样例开始,然后是一行在下一个半跨距边界处开始的U样例(图10)。 此布局与IMC1相比,能够更加高效地利用地址空间。 它的色度地址空间缩小了一半,因此整体地址空间缩小了25%。 在各个4: 2: 0格式中,IMC2是第二首选格式,排在NV12之后。 图10.IMC2内存布局 IMC4 此格式与IMC2相同,只是U(Cb)和V(Cr)行进行了交换: 图11.IMC4内存布局 YV12 所有Y样例都会作为不带正负号的char值组成的数组首先显示在内存中。 此数组后面紧接着所有V(Cr)样例。 V平面的跨距为Y平面跨距的一半,V平面包含的行为Y平面包含行的一半。 V平面后面紧接着所有U(Cb)样例,它的跨距和行数与V平面相同(图12)。 图12.YV12内存布局 NV12 所有Y样例都会作为由不带正负号的char值组成的数组首先显示在内存中,并且行数为偶数。 Y平面后面紧接着一个由不带正负号的char值组成的数组,其中包含了打包的U(Cb)和V(Cr)样例,如图13所示。 当组合的U-V数组被视为一个由little-endianWORD值组成的数组时,LSB包含U值,MSB包含V值。 NV12是用于DirectXVA的首选4: 2: 0像素格式。 预期它会成为支持4: 2: 0视频的DirectXVA加速器的中期要求。 YUV格式解析2 又确认了一下H264的视频格式——H264支持4: 2: 0的连续或隔行视频的编码和解码 YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL)。 YUV主要用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。 与RGB视频信号传输相比,它最大的优点在于只需占用极少的带宽(RGB要求三个独立的视频信号同时传输)。 其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。 “亮度”是通过RGB输入信号来创建的,方法是将RGB信号的特定部分叠加到一起。 “色度”则定义了颜色的两个方面—色调与饱和度,分别用Cr和CB来表示。 其中,Cr反映了GB输入信号红色部分与RGB信号亮度值之间的差异。 而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。 补充一下场的概念—— 场的概念不是从DV才开始有的,电视系统已经有了(当然,DV和电视的关系大家都知道)归根结底还是扫描的问题,具体到PAL制式是: 每秒25帧,每帧两场,扫描线(包括电视机的电子束)自上而下先扫描一场,然后再自上而下扫描第二场 之所以引入场的概念,我的理解是主要为了在有限的带宽和成本内使画面运动更加平滑和消除闪烁感。 这两个场的扫描线是一条一条互相间隔开的,比如说对于一个帧来讲,最上面一条线编号为0,紧挨着的是1,再下来是2,3,4,5,6。 。 。 。 那么第一场也许是0,2,4,6;也许是1,3,5,7——这就是隔行扫描 在逐行扫描模式下,就是扫描线按照0,1,2,3,4,5的顺序依次扫描,很明显,这时候就不存在场的概念了。 下面区分一下YUV和YCbCr YUV色彩模型来源于RGB模型, 该模型的特点是将亮度和色度分离开,从而适合于图像处理领域。 应用: 模拟领域 Y'=0.299*R'+0.587*G'+0.114*B' U'=-0.147*R'-0.289*G'+0.436*B'=0.492*(B'-Y') V'=0.615*R'-0.515*G'-0.100*B'=0.877*(R'-Y') R'=Y'+1.140*V' G'=Y'-0.394*U'-0.581*V' B'=Y'+2.032*U' YCbCr模型来源于YUV模型。 YCbCr是YUV颜色空间的偏移版本. 应用: 数字视频,ITU-RBT.601建议 Y’=0.257*R'+0.504*G'+0.098*B'+16 Cb'=-0.14
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 详解 YUV420 数据格式