视频存储格式YUV420 NV12 NV21 i420 YV12
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相关推荐
- 视频存储格式YUV420 NV12 NV21 i420 YV12详解
1.YUV简介 YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式 ...
- android nv21 nv12,視頻存儲格式YUV420 NV12 NV21 i420 YV12
1)YUV簡介 YUV格式有兩大類:planar和packed. 對於planar的YUV格式,先連續存儲所有像素點的Y,緊接着存儲所有像素點的U,隨后是所有像素點的V. 對於packed的YUV格式 ...
- yuv420格式nv12,nv21,I420,YV12互转
YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式,每个像素点的Y ...
- 音视频数据处理入门:原始视频格式YUV,NV12,NV21,YV12,YU12(I420)
我们知道,在Camera中设置Preview的回调函数onPreviewFrame时谷歌推荐我们使用NV21,YV12两种格式,因为这两种格式几乎在所有的设备里都通用.然而,视频的格式远远不止这俩种, ...
- YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)
YUV格式有两大类:planar和packed. 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V. 对于packed的YUV格式,每个像素点的Y ...
- YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)
如果你认为本系列文章对你有所帮助,请大家有钱的捧个钱场,点击此处赞助,赞助额1元起步,多少随意 锋影 email:174176320@qq.com YUV图解 (YUV444, YUV422, YUV ...
- 笔记:YUV444、YUV422、YUV420、YU12、YV12、NV12、NV21的区别
介绍 YUV444:指在采样时,Y.U.V采样的比例相同,每个像素占用的分量相同 YUV422:指在采样时,Y 和 UV 分量按照 2: 1 的比例采样,每两个 Y 分量公用一组 UV 分量. YUV ...
- YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)-- 转
YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)
- 常用视频格式转换nv12,i420,i444,p010
文章目录 视频存储格式 NV12转I420 NV12转I444 P010转I420 视频存储格式 P010格式与NV12格式一样,区别就是两个字节存一个像素值. Y Y Y Y Y Y Y Y Y Y ...
最新文章
- 熬夜都要看完的 Python 干货!
- 三年级下册期中计算机知识点,部编三年级语文下册期中知识点复习
- oracle数据库存大文本,Oracle大文本在ASP中存取问题的解决
- Java关键字finally
- Elasticsearch使用备忘
- 代码加载 Prefabs
- Mac IDA debug android exec program
- .Net程序猿玩转Android开发---(8)表格布局TableLayout
- .NET 常用ORM之SubSonic
- 测试人员必知的软件测试文档有哪些
- RTE 2020第二批嘉宾公布 教育+社交+IoT行业大咖参会
- npm 安装ionic
- java applet介绍,Java中的Applet介绍
- CM108AH和DP108/DP108T的区别
- 基于STM32的ch438串口扩展芯片使用
- TensorFlow2.0 Guide官方教程 学习笔记17 -‘Using the SavedModel format‘
- python爬取pubmed的文献_利用selenium爬取pubmed,获得搜索的关键字最近五年发表文章数量...
- 微信支付 body不是UTF编码格式
- 在 TortoiseGit 中使用 stash 操作---暂存操作、部分提交
- 数据中心云工作流任务的能效调度算法研究(1)
热门文章
- npm、nrm两种方式查看源和切换镜像
- Servlet简单分页
- Web版Skype现面向全球开测,支持中文
- 计算机机房用英语怎么读,网络机房,network computer room,音标,读音,翻译,英文例句,英语词典...
- vivo联合Shopee独家发布T系列智能手机,掀起东南亚移动游戏热潮
- 基于SpringBoot的在线心理咨询管理系统
- 从键盘输入一个大写字母,转换成小写字母
- 利用计算机软件模拟光栅衍射实验,光栅衍射实验的MATLAB仿真学案.doc
- upupw网站平台绿色搭建Edusoho
- 【python】查看图像位深度,以及改变图像位深度的简单小结