YUV444,YUV420P,YUV420SP,YUV422P,YUV422SP,NV12,NV21,NV16,NV61等格式区分与存储简介

article/2025/9/29 7:22:54

一、基础知识:
概述
YUV是顏色編碼方式,常用於視頻及圖像處理中。

其中的YUV是三個分量。“Y”表示明亮度(Luminance或Luma),也就是灰度值。“U”和“V” 表示的是彩色信息,分別爲色度和濃度(Chrominance和Chroma)。

由於相鄰的兩個像素,數據差異不大,所以,丟棄相鄰像素的部分數據對於整體影響不大。同時,丟棄數據,還節省了空間便於存儲。人對亮度比較敏感,而對色彩不怎麼敏感。所以,每個像素的亮度Y數據是絕對不動的,而色差數據UV可以進行丟棄。沒有UV信息,一樣可以顯示完整的圖像,只不過是黑白的。因此在數據的存儲上,根據數據丟棄方式(採樣方式)的不同,YUV又出現了不同的格式。

採樣方式
採樣是將4個像素作爲一組進行的。原因在於:圖像每行所佔字節數必須是4的倍數,才能保證無誤的轉換。

YUV主流的採樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0。而Android中常用的YUV420格式,即指YUV4:2:0。

YUV的分量數據各佔用8位(各佔1字節),在不丟失數據的情況下,4個像素(12字節)的數據依次爲,

Y0U0V0    Y1U1V1    Y2U2V2   Y3U3V3

(1)YUV444
存儲時,數據爲Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3。

即YUV444,4個像素裏的數據有4個Y,4個U, 4個V,未丟棄任何數據。

(2)YUV422
存儲時,數據爲Y0U0 Y1U1 Y2V2 Y3V3,即YUV422,4個像素裏的數據有4個Y,2個U, 2個V。

YUV422的採樣方式爲:奇數像素丟棄V,偶數像素丟棄U。

YUV422爲橫向丟棄數據的採樣方式。由於鄰近像素的相似性不僅侷限於橫向,數據還可以進一步縱向丟棄,以減少存儲空間。因此,YUV420便出現了。

(3)YUV420
YUV420爲橫向縱向同時丟棄數據的採樣方式。以一個YUV444格式的4x4數據爲例

Y00U00V00    Y01U01V01    Y02U02V02   Y03U03V03

Y10U10V10    Y11U11V11    Y12U12V12   Y13U13V13

Y20U20V20    Y21U21V21    Y22U22V22   Y23U23V23

Y30U30V30    Y31U31V31    Y32U32V32   Y33U33V33

以YUV420格式丟棄數據後,將變爲

Y00U00    Y01    Y02U02   Y03

Y10V10    Y11    Y12V12   Y13

Y20U20    Y21    Y22U22   Y23

Y30V30    Y31   Y32V32   Y33

YUV420的採樣方式爲:

(i)偶數像素丟棄UV。

(ii)在(i)的基礎上,奇數行進一步丟棄V,偶數行進一步丟棄U。

存儲格式
YUV有兩種存儲格式。

(1)緊縮格式(packed formats):將Y、U、V值存儲成Macro Pixels數組。

(2)平面格式(planar formats):將Y、U、V的三個分量分別存放在不同的矩陣中。

需要說明的是,Android NDK使用平面格式存儲YUV數據,可以調用AImage_getPlaneData分別獲取Y、U、V的數據。其planeIdx分別爲0,1,2。

media_status_t AImage_getPlaneData(
        const AImage* image, int planeIdx,
        /*out*/uint8_t** data, /*out*/int* dataLength);
二、YUV444,YUV422,YUV420区别:
 

1. YUV444,即YUV 4:4:4采样,每一个Y对应一组UV分量8+8+8 = 24bits,3个字节。

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

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

对应如下图:

 

三、YUV420,YUV420P和YUV420SP
YUV420有打包格式(Packed),即YUV是按像素点存储的,即YUYVYUYVYUYV这样顺序存储。

同时,还有平面格式(Planar),即Y、U、V是分开存储的,每个分量占一块地方,即YYYYYYY.......UUUU....VVVV...,根据U、V的顺序,又有2种,U前V后即YUV420P,也叫I420,又叫YU12。V前U后,叫YV12(YV表示Y后面跟着V,12表示12bit)

还有半平面格式(Semi-planar),即Y单独占一块地方,但其后U、V又紧挨着排在一起,即YYYYYYY.......UVUVUVUV......     根据U、V的顺序,又有2种,U前V后叫NV12,在国内好像很多人叫它为YUV420SP格式;V前U后叫NV21。

1. YUV420P(Packed),又叫YUYV420,即YUV 4:2:0采样,每四个Y共用一组UV分量一个YUV占8+2+2 = 12bits  1.5个字节。

    存储:YUV交错存储,按像素点存储。如YUVYUVYUVYUV

2. YUV420P(planar),   根据U、V的顺序,又有2种,U前V后即YUV420P又叫I420或YU12,V前U后,叫YV12(YV表示Y后面跟      着V,12表示12bit)

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

    存储:YUV分开存储,如YYYYYYYYYYY......UUUUU...VVVVV...,如下图:

              对于V前U后,则:YYYYYYYYYYY......VVVVV...UUUUU...

    

 

3. YUV420SP(planar)根据U、V的顺序,又有2种,U前V后叫NV12,在国内好像很多人叫它为YUV420SP格式;V前U后            叫NV21。

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

    存储:YUV分开存储,如YYYYYYYYYYY......UVUVUVUVUV.....,如下图:

              对于V前U后,则:YYYYYYYYYYY......VUVUVUVUVU...

     

 

四、YUV422,YUV422P和YUV422SP
同理YUV422的,也类似于YUV420,简介如下:

YUV422有打包格式(Packed),即YUV是按像素点存储的,即YUYVYUYVYUYV这样顺序存储。

同时,还有平面格式(Planar),即Y、U、V是分开存储的,每个分量占一块地方,即YYYYYYY.......UUUU....VVVV...,根据U、V的顺序,又有2种,U前V后即YUV422P,也叫I422,又叫YU16。V前U后,叫YV16(YV表示Y后面跟着V,16表示16bit)

还有半平面格式(Semi-planar),即Y单独占一块地方,但其后U、V又紧挨着排在一起,即YYYYYYY.......UVUVUVUV......     根据U、V的顺序,又有2种,U前V后叫NV16,在国内好像很多人叫它为YUV422SP格式;V前U后叫NV61。不过这种格式似乎不太受VLC欢迎(具体可去看看VLC的wiki)。

1. YUV422P(Packed),又叫YUYV422,即YUV 4:2:2采样,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。

    存储:YUV交错存储,按像素点存储。如YUVYUVYUVYUV

2. YUV422P(planar),   根据U、V的顺序,又有2种,U前V后即YUV422P又叫I422或YU16,V前U后,叫YV16(YV表示Y后面跟      着V,16表示16bit)

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

    存储:YUV分开存储,如YYYYYYYYYYY......UUUUU...VVVVV...

              对于V前U后,则:YYYYYYYYYYY......VVVVV...UUUUU...

3. YUV422SP(planar)根据U、V的顺序,又有2种,U前V后叫NV16,在国内好像很多人叫它为YUV422SP格式;V前U后            叫NV61。

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

    存储:YUV分开存储,如YYYYYYYYYYY......UVUVUVUVUV.....,如下图:

              对于V前U后,则:YYYYYYYYYYY......VUVUVUVUVU...

五、一些常用格式介绍:
1、YUV444

(1)YUV444p:YYYYYYYYY VVVVVVVVV UUUUUUUU

2、YUV422

(1)YUV422p:

         YV16:                              YYYYYYYY VVVV UUUU       (V前U后)

        YUV422p或I422或YU16: YYYYYYYY UUUU VVVV       (U前V后)

(2)YUV422sp:

          NV61:YYYYYYYY VUVUVUVU      (V前U后)

          NV16:YYYYYYYY UVUVUVUV      (U前V后)

(2)YUVY:YUYV YUYV YUYV YUYV

(3)UYVY:UYVY UYVY UYVY UYVY

3、YUV420

(1)YUV420p:

YV12:YYYYYYYY VV UU

I420:YYYYYYYY UU VV

(2)YUV420sp:

NV12:YYYYYYYY UVUV

NV21:YYYYYYYY VUVU

reference:https://www.jianshu.com/p/e67f79f10c65

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

                   https://www.twblogs.net/a/5d535c8dbd9eee541c317976
————————————————
原文链接:https://blog.csdn.net/sinat_29891353/article/details/100975238


http://chatgpt.dhexx.cn/article/VsSbL7Ke.shtml

相关文章

OpenGL渲染YUV420P

一 、YUV420P数据格式二 、GLFW渲染YUV420P2.1 定义顶点数据2.2 创建YUV三张纹理2.3上行YUV420数据2.4 渲染纹理2.5 着色器 三、代码地址以及存在的问题四 、解决存在的问题 一 、YUV420P数据格式 图片来源于谷歌 结合上图可以看出YUV420P的特点如下: ①无论在横向还…

详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)

转载自:划水型派大星 YUV (YCbCr)是一种像素格式,常见于视频编码与静态图像。与 RGB 格式(红-绿-蓝)相反,YUV 分别由一个称为 Y(相当于灰度)的“亮度”分量(…

ffmpeg学习笔记(2)-YUV420算法原理

ffmpeg学习笔记(2)——YUV420算法原理 一、YUV像素格式 YUV的组成格式如下图所示 Y:明亮度,即灰度值 U、V:颜色 YUV格式将亮度信息和色彩信息分离,没有色彩信息依然能够显示图像(没有色彩信息),很好的解…

音视频编解码: YUV存储格式中的YUV420P,YUV420SP,NV12, NV21理解(转)

概述 之前介绍了YUV码流的采样格式,下面分析下YUV码流的存储格式,YUV码流的存储格式与采样格式息息相关。总的来讲,YUV存储格式主要分为两种: planar 平面格式 指先连续存储所有像素点的 Y 分量,然后存储 U 分量&…

图像编码YUV420格式

目录 一、YUV简介 二、RGB 到 YUV 的转换 三、YUV采样 YUV 4:4:4 YUV 4:2:2 YUV 4:2:0 四、YUV 存储格式 基于 YUV 4:2:2 采样的格式 YUYV 格式 UYVY 格式 YUV 422P 格式 基于 YUV 4:2:0 采样的格式 YU12 和 YV12 格式 NV12 和 NV21 格式 一、YUV简介 YUV&#x…

YUV420数据格式详解

YUV简介 YUV格式有两大类:planar和packed。 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。 对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。 YUV分为三个分…

python 生产者消费者模式

生产者消费者模式概述 在并发编程中使用生产者和消费者模式能够解决大不多的并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么使用生产者消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是…

生产者-消费者模式

概述 生产者-消费者模式在系统交互方面,有几个特点: 1、系统解耦 2、解决并发问题 3、不需要关心对方系统何时处理数据,处理结果如何 下面用几个简单例子逐步说明。 简单例子 假设有两个系统,A系统和B系统,B系统需要依赖A系统产生的数据,也就是说,A系统产生数据后,必须把数…

生产者消费者模式及简单的运用场景

先考虑一个问题:服务端接受多个客户端提交的视频文件进行转码的操作,应该怎么设计? 由于转码比较花费时间,所以我们排除同步的想法。而转码需要用到的外部软件(exe文件),不能同时被多个线程用到…

Java多线程系列—生产者消费者模式的多种实现(04)

生产者消费者模式 我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦、消息队列等场景。 在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时生产者的生产速度特别快,但消费者的消…

生产者消费者模式的Java实现

一.概述 1. 什么是“生产者消费者模式”? 生产线程负责生产,消费线程负责消费 生产线程和消费线程要达到均衡。 生产满了就不能继续生产了,必须让消费线程进行消费 消费完了就不能再消费了,必须让生产线程进行生产 这是一种特殊的…

实现生产者消费者模式的三种方式

什么是生产者消费者模式 简单来说,生产者消费者模式就是缓冲区。 那么这么做有两个好处,一个是解耦,第二个是平衡生产能力和消费能力的差,因为生产者和消费者的速度是不一样的,有了这个缓冲区就可以平衡这样一个落差&…

生产者消费者模式最佳实践

测试环境:ubuntu18.04opencv4.2Qt 一个生产者-消费者模式下的视频处理框架。基础结构:视频读取类线程不断读取视频帧,处理类线程对图像进行处理,之后通过信号与槽机制在主线程中显示。特点:视频读取、处理为独立线程&a…

生产者、消费者模式

架构设计:生产者/消费者模式[0]:概述 今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场。由于该模式很重要,打算分几个帖子来介绍。今天这个帖子先来扫盲一 把。如果你对这个模式已经比较…

生产者和消费者模式详解

★简介 生产者消费者模式并不是GOF提出的23种设计模式之一,23种设计模式都是建立在面向对象的基础之上的,但其实面向过程的编程中也有很多高效的编程模式,生产者消费者模式便是其中之一,它是我们编程过程中最常用的一种设计模式。…

生产者消费者模式+代码实现

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在…

生产者消费者模式详解(转载)

★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生…

多线程之生产者消费者模式

文章目录 基本组成阻塞队列有界队列与无界队列ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue 流量控制与信号量(Semaphore)双缓冲与Exchanger 基本组成 生产者:生产者的任务是生产产品,产品可以是数据,也可以是任务。(将产品存入传…

java 生产者消费者模式

java的生产者消费者模式,有三个部分组成,一个是生产者,一个是消费者,一个是缓存。 这么做有什么好处呢? 1.解耦(去依赖),如果是消费者直接调用生产者,那如果生产者的代码变动了,消费…

生产者消费者模式浅析

由于最近工作中,涉及到生产者消费者设计模式,对此有一些体会,所以总结一下,与大家分享。 什么是生产者消费者模式 在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个…