资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
图文详解 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 分量会用到。1. YUV 4:4:4 采样,每一个 Y 对应一组 UV 分量。2. YUV 4:2:2 采样,每两个 Y 共用一组 UV 分量。 3. YUV 4:2:0 采样,每四个 Y 共用一组 UV 分量。 2. 存储方式 下面我用图的形式给出常见的 YUV 码流的存储方式,并在存储方式后面附有取样每个像素点的 YUV 数据的方法,其中,Cb、Cr 的含义等同于 U、V。(1) YUVY 格式 (属于 YUV422)YUYV 为 YUV422 采样的存储格式中的一种,相邻的两个 Y 共用其相邻的两个 Cb、Cr,分析,对于像素点 Y00、Y01 而言,其 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。比如,对于像素点 Y00、Y01 而言,其 Cb、Cr 的值均为 Cb00、 Cr00。(4)YV12,YU12 格式(属于 YUV420)YU12 和 YV12 属于 YUV420 格式,也是一种 Plane 模式,将 Y、U 、V 分量分别打包,依次存储。其每一个像素点的 YUV 数据提取遵循 YUV420 格式的提取方式,即 4 个 Y 分量共用一组 UV。注意,上图中,Y00 、Y01 、Y10、Y11 共用 Cr00、Cb00,其他依次类推。(5)NV12、NV21 (属于 YUV420)NV12 和 NV21 属于 YUV420 格式,是一种 two-plane 模式,即 Y 和 UV 分为两个 Plane,但是 UV(CbCr )为交错存储,而不是分为三个 plane。其提取方式与上一种类似,即 Y00、Y01、Y10、Y11 共用 Cr00、Cb00YUV420 planar 数据, 以 720488 大小图象 YUV420 planar 为例,其存储格式是: 共大小为(72048031)字节,分为三个部分:Y,U 和 V Y 分量: (720480)个字节 U(Cb)分量:(7204802)个字节V(Cr)分量:(7204802) 个字节 三个部分内部均是行优先存储,三个部分之间是 Y,U,V 顺序存储。即 YUV 数据的 0720480 字节是 Y 分量值, 7204807204805/4 字节是 U 分量 7204805/4 7204803/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 度的算法:public static void rotateYUV240SP(byte src,byte des,int width,int height)int wh = width * height;/旋转 Yint k = 0;for(int i=0;iYUV (I420)。这样,数据量将减少一半,为什么呢?呵呵,这个就太基础了,我就不多写了。同样,如果是 RGB24YUV (YV12),也是减少一半。但是,虽然都是一半,如果是 YV12 的话效果就有很大损失。然后,经过 X264 编码后,数据量将大大减少。将编码后的数据打包,通过 RTP 实时传送。到达目的地后,将数据取出,进行解码。完成解码后,数据仍然是 YUV 格式的,所以,还需要一次转换,这样 windows 的驱动才可以处理,就是 YUV2RGB24。 YUY2 是 4:2:2 Y0 U0 Y1 V0 yuv420p 和 YUV420 的区别 在存储格式上有区别yuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuvYUV420P,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: YYYYYYYY UU VV =YUV420PYV12: YYYYYYYY VV UU =YUV420PNV12: YYYYYYYY UVUV =YUV420SPNV21: YYYYYYYY VUVU =YUV420SP
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号