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

article/2025/9/29 7:19:41

转载自:划水型派大星

YUVY'CbCr)是一种像素格式,常见于视频编码与静态图像。与 RGB 格式(红-绿-蓝)相反,YUV 分别由一个称为 Y(相当于灰度)的“亮度”分量(Luminance or Luma)和两个称为 U(蓝色投影 Cb)和 V(红色投影 Cr)的“色度”分量(Chrominance or Chroma)表示,由此得名。

仅有 Y 分量而没有 UV 分量信息,一样可以显示完整的黑白(灰度)图像,解决了模拟信号电视黑白与彩色的兼容问题。

采样

色度通道(UV)的采样率可以低于亮度通道(Y),而不会显着降低感知质量。一种称为 “A:B:C” 的表示法用于描述相对于 Y 采样, U 和 V 的频率:

  • 4:4:4 表示不降低色度(UV)通道的采样率。每个 Y 分量对应一组 UV 分量。
  • 4:2:2 表示 2:1 水平下采样,没有垂直下采样。每两个 Y 分量共享一组 UV 分量。
  • 4:2:0 表示 2:1 水平下采样,同时 2:1 垂直下采样。每四个 Y 分量共享一组 UV 分量。
  • 4:1:1 表示 4:1 水平下采样,没有垂直下采样。每四个 Y 分量共享一组 UV 分量。4:1:1 采样比其他格式少见,本文不再详细讨论。

下图显示了如何针对每个下采样率采样色度。亮度样本用十字表示,色度样本用圆圈表示。

 

YUV Sampling

存储格式

YUV 在存储上通常分为平面格式(Planar),半平面格式(Semi-Planar)以及打包格式(Packed)。

Planar 平面格式

平面格式有时也称为三面格式(Triplanar),即 Y, U, V 三个分量各自使用单独的数组保存,这种三平面分离的格式比较方便视频编码。

YU12 (I420)

  • 4:2:0 Formats, 12 Bits per Pixel, 3 Planars

FOURCC I420

YU12I420,也叫 IYUV,属于 YUV420P 格式。三个平面,分别存储 Y U V 分量。每四个 Y 分量共享一组 UV 分量。U、V 平面的 strides, width 和 height 都是 Y 平面的一半,因此一个像素 12 bits,内存排列如下图所示:

YU12 Format

从图中可看出,U、V 平面的每行字节数(strides)、高(height)都是 Y 平面的一半。

I420 是音视频开发中常用的一种格式。

YV12

  • 4:2:0 Formats, 12 Bits per Pixel, 3 Planars

FOURCC YV12

YV12I420 几乎一样,仅改变了 U, V 平面的顺序。内存排列如下图所示:

Y12 Format

J420

  • 4:2:0 Formats, 12 Bits per Pixel, 3 Planars

J420I420 完全相同,但具有完整范围(0-255,full range)的亮度(Y)分量,而不是有限范围(16-240,limited range,在 iOS 上也叫做 video range)。色度(UV)分量与 I420 中的完全相同。

IMC1

  • 4:2:0 Formats, 16 Bits per Pixel, 3 Planars

FOURCC IMC1

IMC1I420 类似,U, V 平面的宽(width)、高(height)是 Y 平面的一半,但是每行字节数(strides)与 Y 平面一致,因此 U, V 平面在内存上会有留空(padding),因此一个像素 16 bits,如图所示:

IMC1 Format

IMC3

  • 4:2:0 Formats, 16 Bits per Pixel, 3 Planars

IMC3IMC1 几乎一样,仅改变了 U, V 平面的顺序。内存排列如下图所示:

IMC3 Format

I422

  • 4:2:2 Formats, 16 Bits per Pixel, 3 Planars

I422 属于 YUV422P 格式。三个平面,分别存储 Y U V 分量。每两个 Y 分量共享一组 UV 分量。U、V 平面的 strides, width 是 Y 平面的一半,但 height 与 Y 平面一致,因此一个像素 16 bits,内存排列如下图所示:

YUV422P

从图中可看出,U、V 平面的每行字节数(strides)是 Y 平面的一半,高(height)与 Y 平面一致。

J422

  • 4:2:2 Formats, 16 Bits per Pixel, 3 Planars

J422I422 完全相同,但具有完整范围(0-255,full range)的亮度(Y)分量,而不是有限范围(16-240,limited range,在 iOS 上也叫做 video range)。色度(UV)分量与 I420 中的完全相同。

Semi-Planar 半平面格式

半平面格式具有两个平面而不是三个平面,一个平面存储亮度(Y)分量,另一个平面存储两个色度(UV)分量。有时也将它们称为双平面格式(BiPlanar)。

NV12

  • 4:2:0 Formats, 12 Bits per Pixel, 2 Planars

FOURCC NV12

NV12 属于 YUV420SP 格式。两个平面,分别存储 Y 分量 和 UV 分量。其中 UV 分量共用一个平面并且以 U, V, U, V 的顺序交错排列。每四个 Y 分量共享一组 UV 分量。

UV 平面的 strides, width 与 Y 平面一样长,但 height 仅为 Y 平面的一半。因此一个像素 12 bits,内存排列如下图所示:

NV12 Format

从图中可看出,UV 平面的每行字节数(strides)与 Y 平面一致,高(height)是 Y 平面的一半。

NV12 是 iOS 相机(AVCaptureOutput)可直接输出的两种视频帧格式之一,另外一种是 BGRA32(kCVPixelFormatType_32BGRA)。

在 iOS 上,NV12 还分为 Full Range (0-255, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) 和 Video Range (16-240, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange),区别仅为亮度(Y)分量的取值范围,一般而言,Full Range 适用于静态图像(拍照),Video Range 适用于视频采集(摄像)。

NV21

  • 4:2:0 Formats, 12 Bits per Pixel, 2 Planars

FOURCC NV21

NV21 属于 YUV420SP,与 NV12 几乎一致,区别是 UV 平面中 U 与 V 的排列顺序颠倒,以 V, U, V, U 的顺序交错排列,内存排列如图所示:

NV21 Format

NV21 是 Android 相机(Camera)默认的输出格式。

Packed 打包格式

打包格式通常只有一个平面,所有亮度(Y)和色度(UV)数据都交织在一起。有点类似于 RGB 格式,只是使用了不同的色彩空间。

打包格式在网络摄像头中较为常见。硬件设备使用多平面格式效率较低,因为每个像素需要多次内存访问。而打包格式由于仅一个平面,访问内存的开销较小。

AYUV

  • 4:4:4 Formats, 32 Bits per Pixel

FOURCC AYUV

AYUV 是 Packed 打包格式,其中每个像素编码为四个连续字节,每个像素在内存中按照 V, U, Y, A 的顺序排列(A 指 alpha 通道),如下图所示:

AYUV Format

YUYV (V422 / YUY2 / YUNV)

  • 4:2:2 Formats, 16 Bits per Pixel

FOURCC YUY2

YUYV 通常也称作 V422YUY2YUNV

YUY2 是 Packed 打包格式,其中两个像素共用一组 UV 分量,内存中按照 Y U Y V 的顺序排列,如下图所示:

YUYV Format

UYVY (Y422 / UYNV)

  • 4:2:2 Formats, 16 Bits per Pixel

FOURCC UYVY

UYVY 通常也称作 Y422UYNV

UYVYYUYV 类似,只是亮度(Y)分量与色度(UV)分量排列顺序颠倒,如下图所示:

UYVY Format

参考资料

  1. Microsoft: Recommended 8-Bit YUV Formats for Video Rendering

  2. VideoLAN's Wiki: YUV

  3. FOURCC: YUV pixel formats

  4. WWDC2011: Capturing from the Camera using AV Foundation on iOS 5



作者:划水型派大星
链接:https://www.jianshu.com/p/358bf8b7eacc
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 


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

相关文章

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.解耦(去依赖),如果是消费者直接调用生产者,那如果生产者的代码变动了,消费…

生产者消费者模式浅析

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

java实现生产者消费者模式

一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费…

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

前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来…