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
YUV数据格式的更多相关文章
- 详解YUV数据格式
我们在讲 FFmpeg 系列的时候,有提到 YUV 的.其中包括YUV播放器.简单的YUV格式介绍. 一.YUV简介 YUV,是一种颜色编码方法.常使用在各个影像处理元件中. YUV在对照片或影片编码 ...
- Android开启相机预览获取Yuv视频流数据
自定义SurfaceView 主要步骤: 实现SurfaceHolder.Callback接口,创建SurfaceView的生命周期 实现Camera.PreviewCallback接口,创建预览回调 ...
- 音视频编解码: YUV存储格式中的YUV420P,YUV420SP,NV12, NV21理解(转)
概述 之前介绍了YUV码流的采样格式,下面分析下YUV码流的存储格式,YUV码流的存储格式与采样格式息息相关.总的来讲,YUV存储格式主要分为两种: planar 平面格式 指先连续存储所有像素点的 ...
- YUV图像合成原理<转>
YUV图像合成原理 引言:在视频监控中最常用的就是图像拼接和字符叠加,25FPS的视频流,如果每隔40MS就从各个通道中取一幅图像来合成,则可以看到一个实时的合成视频.合成的过程也就是原始图像的拼接. ...
- Android中直播视频技术探究之---采集摄像头Camera视频源数据进行推流(采用金山云SDK)
一.前言 在之前已经详细介绍了Android中的一种视频数据源:Camera,不了解的同学可以点击进入:Android中Camera使用详解 ,在这篇文章中我们介绍了如何采集摄像头的每一帧数据,然后进 ...
- 最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复
最纯粹的直播技术实战03-通过filter进行旋转及卡顿修复 最新实战教程,Android自己主动化刷量.作弊与防作弊,案例:刷友盟统计.批量注冊苹果帐号 这个系列的文章将会研究最纯粹的Android ...
- ffmpeg命令汇总
1. 查看ffmpeg信息: ldd `which ffmpeg` ffmpeg -filters ffmpeg -h filter=drawtext man ffmpeg ffmpeg --help ...
- 最纯粹的直播技术实战02-Camera的处理以及推流
最纯粹的直播技术实战02-Camera的处理以及推流 最新实战教程.Android自己主动化刷量.作弊与防作弊.案例:刷友盟统计.批量注冊苹果帐号 这个系列的文章将会研究最纯粹的Android直播的实 ...
- webrtc (6) 在Webrtc中集成VideoToolbox
来源:http://blog.csdn.net/wangruihit/article/details/46550853 VideoToolbox是iOS平台在iOS8之后开放的一个Framework, ...
随机推荐
- locale 详解
locale 是国际化与本土化过程中的一个非常重要的概念,个人认为,对于中文用户来说,通常会涉及到的国际化或者本土化,大致包含三个方面: 看中文,写中文,与 window中文系统的兼容和通信.从实际经 ...
- Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例
1. 自定义类模拟LineNumberReader的获取行号功能案例 2. 代码实现: (1)MyBufferedReader.java: package cn.itcast_08; import j ...
- mysqlbinlog 用法
操作命令: show binlog events in 'binlog.000016' limit 10; reset master 删除所有的二进制日志 flush logs 产生一个新的binl ...
- mysql 中间件 分析
360的Atlas 1.读写分离 2.从库负载均衡 3.IP过滤 4.自动分表 5.DBA可平滑上下线DB 6.自动摘除宕机的DB altas 在10000/s的请求量级应该是毫无问题的 https: ...
- Java json设置时间格式,Jackson设置时间格式,json设置单引号
Java json设置时间格式,Jackson设置时间格式,json设置单引号 >>>>>>>>>>>>>>> ...
- 程序员带你学习安卓开发系列-Android文件存储
这是程序员带你学习安卓开发系列教程.本文章致力于面向对象程序员可以快速学习开发安卓技术. 上篇文章:.Net程序员快速学习安卓开发-布局和点击事件的写法 主要讲解了布局和点击事件的写法. 上篇文章补充 ...
- 一步一步学NUnit
转载:http://tech.sina.com.cn/s/2009-07-17/1129988785.shtml 单元测试基础知识 单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明 ...
- WebView支持特效,页面内跳转(转载!)
webView = (WebView) findViewById(R.id.lottery_webview); webView.getSettings().setJavaScriptEnabled(t ...
- 转载---SQL Server XML基础学习<2>之--FOR XML AUTO/RAW
本文主要介绍FOR XML 的 AUTO 模式和 RAW 模式 --AUTO 模式将查询结果以嵌套 XML 元素的方式返回.这不能较好地控制从查询结果生成的 XML 的形式. --如果要生成简单的层次 ...
- cordova 创建ios项目
cordova create fmscmsios1023 com.weilian.fmscms fmscms cd fmscms cd fmscmsios1023/ cordova platforms ...