YUV数据格式

概要:

与RGB编码方法类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它是指将亮度参量(Y:Luminance或Luma)和色度参量(UV:Chrominance或Chroma)分开进行表示的像素编码格式。而这样分开的好处就是不但可以避免相互干扰--没有UV信息一样可以显示完整的图像,因而解决了彩色电视与黑白电视的兼容问题;还可以降低色度的采样率而不会对图像质量影响太大,降低了视屏信号传输时对频宽(带宽)的要求。YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式

YUV格式类别:

  • 打包(packed)格式:将每个像素点的Y,U,V分量交叉排列并以像素点为单元连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素(macro-pixel)
  • 平面(planar)格式:使用三个数组分开连续的存放Y,U,V三个分量,即Y,U,V分别存放在各自的数组中。

YUV采样表示法:

YUV采用A:B:C表示法来描述Y,U,V采样频率比例,下图中黑点表示采样像素点Y分量, 空心圆表示采样像素点的UV分量。

  • 4:4:4 表示色度频道没有下采样,即一个Y分量对应着一个U分量和一个V分量。
  • 4:2:2 表示 2:1 的水平下采样,没有垂直下采样,即每两个Y分量共用一个U分量和一个V分量。
  • 4:2:0 表示 2:1 的水平下采样,2:1 的垂直下采样,即每四个Y分量共用一个U分量和一个V分量。
  • 4:1:1 表示 4:1 的水平下采样,没有垂直下采样。即每四个Y分量共用一个U分量或一个V分量,与其他格式相比,4:1:1 采样不太常用。

YUV数据存储:

下面以每个分量数据存储在一个char(或byte)中为例描述YUV的数据存储方式, 图中每个方格表示一个chat。

(1). 4:4:4格式,每像素32位

推荐一个 4:4:4 格式,FOURCC 码为 AYUV。这是一个打包格式,其中每个像素都被编码为四个连续字节,其组织顺序如下所示,其中A标示了alpha通道。

(2). 4:2:2格式,每像素16位

支持两个 4:2:2 格式,FOURCC 码如为 YUY2 和 UYVY。两个都是打包格式,其中每个巨像素都是编码为四个连续字节的两个像素。这样会使得色度水平下采样乘以系数 2。

  • YUY2

在 YUY2 格式中,数据可被视为一个不带正负号的 char 值组成的数组,其中第一个字节存储第一个 Y 样例,第二个字节存储第一个 U (Cb) 样例,第三个字节存储第二个 Y 样例,第四个字节存储第一个 V (Cr) 样例,如下图。

如果该图像被看作由两个 little-endian WORD 值组成的数组,则第一个 WORD 在最低有效位(LSB) 中包含 Y0,在最高有效位 (MSB) 中包含 U0。第二个 WORD 在 LSB 中包含 Y1,在 MSB 中包含 V0。

  • UYVY

此格式与 YUY2 相同,只是字节顺序是与之相反的。

如果该图像被看作由两个 little-endian WORD 值组成的数组,则第一个 WORD 在 LSB 中包含 U0,在 MSB 中包含 Y0,第二个 WORD 在 LSB 中包含 V0,在 MSB 中包含 Y1。

(3). 4:2:0格式,每像素16位

推荐两个 4:2:0 每像素 16 位格式,FOURCC 码: IMC1 和 IMC3。两个 FOURCC 码都是平面格式。色度频道在水平方向和垂直方向上都要以系数 2 来进行再次采样。

  • IMC1

所有 Y 样例都会作为不带正负号的 char 值组成的数组首先存储在内存中。后面跟着存储所有 V (Cr) 样例,然后是所有 U (Cb) 样例。V 和 U 平面与 Y 平面具有相同的跨距(即存储数组的宽度),从而遗留了如下图所示的未使用的内存区域。

  • IMC3

此格式与 IMC1 相同,只是 U 和 V 平面进行了交换。

(4). 4:2:0格式,每像素12位

推荐四个 4:2:0 每像素 12 位格式,FOURCC 码:IMC2, IMC4, YV12, NV12。在所有这些格式中,色度频道在水平方向和垂直方向上都要以系数 2 来进行再次采样。

  • IMC2

此格式与 IMC1 相同,只是 V (Cr) 和 U (Cb) 行在半跨距边界处进行了交错。换句话说,就是色度区域中的每个完整跨距行都以一行 V 样例开始,然后是一行在下一个半跨距边界处开始的 U 样例。

此布局与 IMC1 相比,IMC2能够更加高效地利用存储空间。它的色度存储空间缩小了一半,因此整体存储空间缩小了 25%。在各个 4:2:0 格式中,IMC2 是第二首选格式,排在 NV12 之后。

  • IMC4

此格式与 IMC2 相同,只是 U (Cb) 和 V (Cr) 行进行了交换。

  • YV12 (YU12格式和YV12存储格式基本相同,只是UV存储位置互换)

所有 Y 样例都会作为不带正负号的 char 值组成的数组首先存储在内存中。此数组后面紧接着存储所有 V (Cr) 样例。V 平面的跨距为 Y 平面跨距的一半,V 平面包含的行为 Y 平面包含行的一半。V 平面后面紧接着存储所有 U (Cb) 样例,它的跨距和行数与 V 平面相同。

  • NV12(NV21格式和NV12存储格式基本相同,只是UV存储位置互换)

所有 Y 样例都会作为由不带正负号的 char 值组成的数组首先存储在内存中,并且行数为偶数。Y 平面后面紧接着一个由不带正负号的 char 值组成的数组,其中包含了打包的 U (Cb) 和 V (Cr) 样例。

当组合的 U-V 数组被视为一个由 little-endian WORD 值组成的数组时,LSB 包含 U 值,MSB包含 V 值。NV12 是用于 DirectX VA 的首选 4:2:0 像素格式。

YUV数据转换:

(1). 4:2:2 -> 4:2:0的有损压缩转换

  Y存储数据不变,对U和V分量在行垂直下采样进行隔行抽样。

(2). 4:2:0 -> 4:2:2的补足转换

  Y存储数据不变,对U和V分量在行垂直下采样进行隔行拷贝补足下一行色度数据。

在YUV中,一个像素点对应一个Y分量,同一图像无论是4:4:4, 4:2:2, 4:2:0, 4:1:1的格式,其中Y分量数据都是完全相同的。YUV420sp和YUV420p的数据存储格式区别在于UV分量排列的顺序不同,YUV420p是先存储完U分量后再存储V分量,也就是说UV分量各自都是连续的,而YUV420sp则交叉存储UV分量,因此一个YUV420图片的存储空间为:

  Y分量 = width * hight

  U分量 = Y / 4

  V分量 = Y / 4

  YUV420图像存储空间 = width * hight * 3 / 2

例如一张分辨率为8X4的YUV420图像,数据存储格式如下图:

YUV420sp格式

YUV420p格式

YUV图像旋转算法:

下面以YUV420sp格式图像为例给出旋转90的算法。

public void rotateYUV420sp(byte[] src, byte[] des, int width, int height) {
    int length = width * height;
    int k = 0;
    for(int i = 0; i < width; i++) {
        for(int j = 0; j < height; j++) {
            des[k] = src[width * j + i];
            k++;
        }
    }

    for(int i = 0; i < width; i + =2) {
        for(int j = 0; j < height / 2; j++) {
            des[k]     = src[length + width * j + i];
            des[k + 1] = src[length + width * j + i + 1];
            k += 2;
        }
    }
}


参考原文链接:

http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

http://www.xuebuyuan.com/1541892.html

时间: 2024-11-08 18:59:03

YUV数据格式的相关文章

YUV图像合成原理&lt;转&gt;

YUV图像合成原理 引言:在视频监控中最常用的就是图像拼接和字符叠加,25FPS的视频流,如果每隔40MS就从各个通道中取一幅图像来合成,则可以看到一个实时的合成视频.合成的过程也就是原始图像的拼接.缩放的过程,本文主要阐述UV分开存储的YUV420图像拼接的过程,实现下图的效果. 一.原图图像格式 1.图像常用的格式有两种RGB和YUV (1)YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间.在现代彩色电视系统中,通常采用三管彩色

iOS开发-YUV视频

百度百科上面的介绍 YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视.与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输). 其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值:而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色. “亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起. “色度”则定义了颜色的两个方面─色调与饱

3D视频上下转化左右交织格式YUV

3D视频中,有的是上下格式的,但是无论是裸眼3D还是3D眼镜都需要左右格式的,下面就是转换的算法,利用ffmpeg解码,进行YUV切割,实现左右视频交织,可以在裸眼3D手机或者pad上观看3D效果.必须要先熟悉YUV数据格式. FILE *yuvFile = fopen("yuv_file_width.yuv","ab"); if(!yuvFile) return 0; av_register_all(); AVFormatContext *pFormat = NU

YUV数据的几种采样格式以及保存方式

1.YUV数据的几种采样格式 4:4:4 这个不用解释了,这是每个像素占三个字节的内存. 4:2:2  Y0U0V0  Y1U1V1  Y2U2V2  Y3U3V3对于这四个像素,采样之后存放的码流为:Y0U0 Y1V1 Y2U2 Y3V3,占用的内存大小为4+4/2 +4/2=8 4:2:0并不意味着只有Y和U而没有V,他指的是对于每行扫描线来说,只有一种色度分量以2:1的抽样率存储,相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2, 对于[Y0 U0

最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复

最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复 最新实战教程,Android自动化刷量.作弊与防作弊,案例:刷友盟统计.批量注册苹果帐号 这个系列的文章将会研究最纯粹的Android直播的实现,而且不是用现在的集成SDK来达到直播的技术实现,而是从一个比较底层的直播实现来探讨这个技术,这样子对于直播技术的实现,现成的一些直播框架等都有一个比较好的理解. 上一篇文章把Camera的处理以及推流给实现了,但还留下了几个bug,这一篇文章就把一些bug处理一下,主要处理两个bug 直播画

最纯粹的直播技术实战02-Camera的处理以及推流

最纯粹的直播技术实战02-Camera的处理以及推流 最新实战教程,Android自动化刷量.作弊与防作弊,案例:刷友盟统计.批量注册苹果帐号 这个系列的文章将会研究最纯粹的Android直播的实现,而且不是用现在的集成SDK来达到直播的技术实现,而是从一个比较底层的直播实现来探讨这个技术,这样子对于直播技术的实现,现成的一些直播框架等都有一个比较好的理解. 上一篇文章里面,我们完成了FFmpeg的编译,然后也把编译出来的库运行在了Android上,那接下来就要处理Android的Camera以

安卓下多线程OpenGL共享Context (四)

之前的方案假定Java层更新纹理时使用的是RGB或RBGA格式的数据,但是在播放视频这种应用场景下,解码器解码出来的数据如果是YUV格式,渲染起来就比较麻烦了.一种方式是使用CPU进行YUV转RGB,然后再进行渲染,但是这种方式性能极差:另一种方式是使用GPU进行转换,利用GPU的并行计算能力加速转换.我们需要编写Shader来实现.如前文所述,Unity只需要Java层的纹理ID,当使用Shader进行YUV转RGB时,怎么实现更新该纹理的数据呢?答案是Render to Texture (参

画中画 视频合成

原文说转 没有具体的转链接 我转备用. 具体验证还未完成. 转: https://blog.csdn.net/zwz1984/article/details/50403150 YUV图像合成原理 引言:在视频监控中最常用的就是图像拼接和字符叠加,25FPS的视频流,如果每隔40MS就从各个通道中取一幅图像来合成,则可以看到一个实时的合成视频.合成的过程也就是原始图像的拼接.缩放的过程,本文主要阐述UV分开存储的YUV420图像拼接的过程,实现下图的效果. 一.原图图像格式 1.图像常用的格式有两

编程必备基础-音视频小白系统入门课

本章主要介绍为何要带大家学习一个音视频初级入门课程,本课程中不仅系统的讲解了音视频到底是如何工作的,还会将音视频原理与实战相结合,讲解学习阶梯和实现思路,之后会为大家介绍本课程内容具体安排,最后给出如何学好这门课程的一些学习建议.希望大家都能通过这门课程,学有所成,学有所归.... 1-1 课前必读(不看会错过一个亿) 1-2 课程介绍及学习指导试看 第2章 音视频环境基础 本章会讲解学习音视频课程之前必要的基础知识,如Linux常见命令以及环境变量的设置等.在之前的课程中,有很多同学提出的问题