1、YUV简介

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方式传送占用极少的频宽。

2、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分量8+8+8 = 24bits,3个字节。

2. YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。

3. YUV 4:2:0采样,每四个Y共用一组UV分量一个YUV占8+2+2 = 12bits  1.5个字节。

3、YUV420类型

3.1) YUV420p和YUV420sp区别

因为YUV420比较常用, 在这里就重点介绍YUV420。YUV420分为两种:YUV420p和YUV420sp。

YUV420sp格式如下图:

YUV420p数据格式如下图:

3.2) YUV420p和YUV420sp具体分类和详情

YUV420p:又叫planer平面模式,Y ,U,V分别再不同平面,也就是有三个平面。

YUV420p又分为:他们的区别只是存储UV的顺序不一样而已。

I420:又叫YU12,安卓的模式。存储顺序是先存Y,再存U,最后存V。YYYYUUUVVV

YV12:存储顺序是先存Y,再存V,最后存U。YYYVVVUUU

YUV420sp:又叫bi-planer或two-planer双平面,Y一个平面,UV在同一个平面交叉存储。

YUV420sp又分为:他们的区别只是存储UV的顺序不一样而已。

NV12:IOS只有这一种模式。存储顺序是先存Y,再UV交替存储。YYYYUVUVUV

NV21:安卓的模式。存储顺序是先存Y,再存U,再VU交替存储。YYYYVUVUVU

官方文档如下:

YV12

All of the Y samples appear first in memory as an array of unsigned char values. This array is followed immediately by all of the V (Cr) samples. The stride of the V plane is half the stride of the Y plane, and the V plane contains half as many lines as the Y plane. The V plane is followed immediately by all of the U (Cb) samples, with the same stride and number of lines as the V plane (Figure 12).

大致意思是:先存储完所有的Y,后面紧跟着存V,V的步长(也就是宽)是Y的步长的一半,V的行高是Y的一半。V存储完后面紧跟着存U,所有的U,步长河行高和V相同,也就是都是Y的一半。

Figure 12:

NV12

All of the Y samples are found first in memory as an array of unsigned char values with an even number of lines. The Y plane is followed immediately by an array of unsigned char values that contains packed U (Cb) and V (Cr) samples, as shown in Figure 13. When the combined U-V array is addressed as an array of little-endian WORD values, the LSBs contain the U values, and the MSBs contain the V values. NV12 is the preferred 4:2:0 pixel format for DirectX VA. It is expected to be an intermediate-term requirement for DirectX VA accelerators supporting 4:2:0 video.

Figure 13:

3.3)YUV420的内存计算

width * hight =Y(总和)

U = Y / 4   V = Y / 4

所以YUV420 数据在内存中的长度是 width * hight * 3 / 2(即一个YUV是1.5个字节),所以计算采集的数据大小:width * hight * 1.5*frame*time

以720×488大小图象YUV420 planar为例,

其存储格式是: 共大小为720×480×3 × 1.5字节,

分为三个部分:Y,U和V

Y分量:    (720×480)个字节

U(Cb)分量:(720×480 × 1/4)个字节

V(Cr)分量:(720×480 × 1/4)个字节

三个部分内部均是行优先存储,三个部分之间是Y,U,V 顺序存储。

即YUV数据的0--720×480字节是Y分量值,

720×480--720×480×5/4字节是U分量

720×480×5/4 --720×480×3/2字节是V分量。

一般来说,直接采集到的视频数据是RGB24的格式,RGB24一帧的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,YUV标准格式4:2:0 的数据量是 size=width×heigth×1.5 Bit。

在采集到RGB24数据后,需要对这个格式的数据进行第一次压缩。即将图像的颜色空间由RGB2YUV。因为,X264在进行编码的时候需要标准的YUV(4:2:0)。

经过第一次数据压缩后RGB24->YUV(I420)。这样,数据量将减少一半,经过X264编码后,数据量将大大减少。将编码后的数据打包,通过RTP实时传送。到达目的地后,将数据取出,进行解码。完成解码后,数据仍然是YUV格式的,所以,还需要一次转换,就是YUV2RGB24。

3.4)关于IOS

做过iOS硬解码的都知道,创建解码器时,需要指定PixelFormatType。IOS只支持NV12也就是YUV420中的一种,你搜索420,发现有四个,分别如下:

kCVPixelFormatType_420YpCbCr8Planar

kCVPixelFormatType_420YpCbCr8PlanarFullRange

kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange

kCVPixelFormatType_420YpCbCr8BiPlanarFullRange

根据表面意思,可以看出,可以分为两类:planar(平面420p)和 BiPlanar(双平面)。

还有一个办法区分,CVPixelBufferGetPlaneCount(pixel)获取平面数量,发现kCVPixelFormatType_420YpCbCr8Planar和kCVPixelFormatType_420YpCbCr8PlanarFullRange是三个两面,属于420p,iOS不支持。而kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange和kCVPixelFormatType_420YpCbCr8BiPlanarFullRange是两个平面。这就纠结了,到底用哪一个呢?

我查了官网资料,解释如下:

kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange = '420v', /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, video-range (luma=[16,235] chroma=[16,240]).  baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct */

kCVPixelFormatType_420YpCbCr8BiPlanarFullRange  = '420f', /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, full-range (luma=[0,255] chroma=[1,255]).  baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct */

感觉除了亮度和颜色的范围不一样,没发现其它不一样的。还是纠结,后来查了神网,有人说WWDC视频有,网址:https://developer.apple.com/videos/play/wwdc2011/419/?time=1527(大概在25:30‘)

解释如下:

但是我我还是不清楚,清楚的人请告知我一下。

然后我创建的时候分辨使用了kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange和kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,视频播放出来没发现什么不一样,唯一不一样是计算的步长不一样。

比如:480*640

如果是:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange

Y和UV的步长是512(采用了64字节对齐 非对齐的补0) Y的行宽是640,UV行宽是320

如果是:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange

Y和UV的步长是480(实际长度,未补齐) Y的行宽是640,UV行宽是320

我采集的时候setPreset了,所以按照上面提示(但是我还是不是很理解),最后我项目里面还是选择了kCVPixelFormatType_420YpCbCr8BiPlanarFullRange。

视频存储格式YUV420 NV12 NV21 i420 YV12详解相关推荐

  1. 视频存储格式YUV420 NV12 NV21 i420 YV12

    1)YUV简介 YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式 ...

  2. android nv21 nv12,視頻存儲格式YUV420 NV12 NV21 i420 YV12

    1)YUV簡介 YUV格式有兩大類:planar和packed. 對於planar的YUV格式,先連續存儲所有像素點的Y,緊接着存儲所有像素點的U,隨后是所有像素點的V. 對於packed的YUV格式 ...

  3. yuv420格式nv12,nv21,I420,YV12互转

    YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式,每个像素点的Y ...

  4. python使用视频_Python中操作各种多媒体,视频、音频到图片的代码详解

    我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...

  5. 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型

    1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性, ...

  6. Python视频剪辑基础教程:MoviePy VideoClip详解

    Python视频剪辑基础教程:MoviePy VideoClip详解 随着数字化媒体的快速发展,视频成为了现代社会最为流行的媒介之一.在如此多样化的数字化媒体中,视频编辑技术被誉为其中最为关键的技能之 ...

  7. python播放视频代码_Python中操作各种多媒体,视频、音频到图片的代码详解

    我们经常会遇到一些对于多媒体文件修改的操作,像是对视频文件的操作:视频剪辑.字幕编辑.分离音频.视频音频混流等.又比如对音频文件的操作:音频剪辑,音频格式转换.再比如我们最常用的图片文件,格式转换.各 ...

  8. 视频+白皮书 | Kyligence 与 Kylin 功能差异详解

    上周,Kyligence 企业级大数据分析平台研发负责人张逸凡,为大家带来了<Kyligence 与 Kylin 功能差异详解>线上分享,点击这里查看视频和下载对比白皮书. 以下是实录 Q ...

  9. 2016计算机考研大纲视频,2016年考研专业课计算机大纲详解:操作系统

    一. 操作系统考查目标 今天我们来解析一下计算统考大纲操作系统部分的知识点.操作系统的研发能力很能够体现计算机软件发展的水平,因此操作系统是计算机课程体系里很重要的一门专业核心基础原理课程.在考研大纲 ...

最新文章

  1. JavaWeb(五)之JSTL标签库
  2. Windows窗体编程(二)
  3. python输入输出简单例子_Python 文件和流的简单示例
  4. tensorflow object detection API训练公开数据集Oxford-IIIT Pets Dataset
  5. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170402
  6. 如果没有就插入,如果有就更新
  7. EbN0、SNR、0.1nmOSNR的区别与联系
  8. 6_python基础—循环
  9. 怎么把ppt弄成链接的形式_视频引流的方法,教你怎么用视频引流日引500
  10. Django 视图层
  11. Windows 部署服务(WDS)基础配置指南 (2008 or 2008R2 Only)
  12. rpm 安装 mysql5.6.28_Linux(Ubuntu)下Mysql5.6.28安装配置方法图文教程
  13. ESRI ArcGIS 9.0系列软件报价
  14. 电影票APP原型设计分享– Movie Booking
  15. stata陈强:计量经济学及stata应用_陈强 第四章 一元线性回归
  16. python表示倍数_python输出倍数
  17. python代码画樱花-如何用Python代码实现樱花树效果
  18. 合金电阻参数选型资料
  19. 全国青少年软件编程等级考试Python一级专题练习
  20. 【解决】subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 127

热门文章

  1. Mysql军规(编写规范)
  2. 在x86_64平台上编译龙芯pmon
  3. 消防报警名词解释--转自消防星
  4. 工业常用的几款温湿度传感器应用分析
  5. Springboot 参数校验@Valid @Validated(最新最全)
  6. 利用PowerDesigner反向生成DB设计文档
  7. 初识salesforce
  8. 商业模式画布的九大模块
  9. QT解决中文编译不通过问题
  10. 常用 Shell 命令