YUV帧结构(紧缩格式packed打包格式和平面格式planar)(A:B:C表示法)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YUV帧结构(紧缩格式packed打包格式和平面格式planar)(A:B:C表示法)相关的知识,希望对你有一定的参考价值。

https://blog.piasy.com/2018/04/27/YUV/index.html

后面再看

参考文章1:YUV详解数据和格式

Video Rendering with 8-Bit YUV Formats

文章目录

一、YUV简介

YUV,是一种颜色编码方法。常使用在各个影像处理元件中。 YUV在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。

YUV视频、图片、相机等应用中使用的一类图像格式,实际上是所有“YUV”像素格式共有的颜色空间的名称。 与RGB格式(红 - 绿 - 蓝)不同,YUV是用一个称为Y(相当于灰度)的“亮度”分量和两个“色度”分量表示,分别称为U(蓝色投影)和V(红色投影),由此得名。

YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。

“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma),Y′UV, YUV, YCbCr, YPbPr所指涉的范围,常有混淆或重叠的情况。

Y表示亮度分量:如果只显示Y的话,图像看起来会是一张黑白照。
U(Cb)表示色度分量:是照片蓝色部分去掉亮度(Y)。
V(Cr)表示色度分量:是照片红色部分去掉亮度(Y)。

从历史的演变来说,其中YUV和Y’UV通常用来编码电视的模拟信号,而YCbCr则是用来描述数位的影像信号,适合影片与图片压缩以及传输,例如MPEG、JPEG。 但在现今,YUV通常已经在电脑系统上广泛使用。

Y’代表明亮度(luma; brightness)而U与V储存色度(色讯; chrominance; color)部分; 亮度(luminance)记作Y,而Y’的prime符号记作伽玛校正。

YUV Formats分成两个格式:

  • 紧缩格式(打包格式)(packed formats):将Y、U、V值储存成Macro Pixels阵列,和RGB的存放方式类似。
  • 平面格式(planar formats):将Y、U、V的三个分量分别存放在不同的矩阵中。

YUV 格式通常有两大类:打包(packed)格式(紧缩格式)平面(planar)格式。前者将 YUV 分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放 YUV 三个分量,就像是一个三维平面一样。
参考文章:关于yuv 的pack(紧缩格式)和planner(平面格式)格式

紧缩格式(packed format)中的YUV是混合在一起的,对于YUV4:4:4格式而言,用紧缩格式很合适的,因此就有了UYVY、YUYV等。

平面格式(planar formats)是指每Y分量,U分量和V分量都是以独立的平面组织的,也就是说所有的U分量必须在Y分量后面,而V分量在所有的U分量后面,此一格式适用于采样(subsample)。平面格式(planar format)有I420(4:2:0)、YV12、IYUV等。

示例:YUV422 Planar

这里,Y\\U\\V数据是分开存放的,每两个水平Y采样点,有一个Cb和一个Cr采样点,如下图:

示例:YUV420 Planar

这个格式跟YUV422 Planar 类似,但对于Cb和Cr的采样在水平和垂直方向都减少为2:1,如下图:

示例:YUV422sp(Semi-Planar Semi)半平面模式

这个格式的数据量跟YUV422 Planar的一样,但是U、V是交叉存放的,如下图。

ffmpeg 中 未找到定义

android OMX 中 OMX_COLOR_FormatYUV422SemiPlanar YUV422SemiPlanar : Two arrays, one is all Y, the other is U and V

示例:YUV420sp(Semi-Planar)(这个是我们hikflow_demo里用到的格式,NV21)★

参考文章:关于yuv 的pack(紧缩格式)和planner(平面格式)格式

这个格式的数据量跟YUV420 Planar的一样,但是U、V是交叉存放的,如下图。

ffmpeg 中定义

PIX_FMT_NV12,
///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the
UV components, which are interleaved (first byte U and the following
byte V)

平面 YUV 4:2:0, 12bpp, 1 个平面用于 Y,1 个平面用于
交错的 UV 分量(第一个字节 U 和以下
字节 V)

android
OMX 中定义 OMX_COLOR_FormatYUV420SemiPlanar //YUV420SemiPlanar
: Two arrays, one is all Y, the other is U and V //两个数组,一个全是Y,一个是U和V

示例:YUV422 Interleaved Interleaved – 交错

这个格式的数据量跟YUV422 Planar的一样,但是Y、U、V是交叉存放的,如下图。 这个是打包(packed)模式的


ffmpeg 中 PIX_FMT_UYVY422 ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1

android OMX 中 OMX_COLOR_FormatCbYCrY //CbYCrY : Organized as 16bit UYVY (i.e. CbYCrY)

YUV的采样格式 与 YUV的存储格式

  • YUV的采样格式:即我们在采集图片、视频帧时,是如何获取每个像素的Y、U、V三个分量的。
  • YUV的存储格式:即Y、U、V三个分量的值,是以什么方式存储在内存或者文件中的。

YUV采样表示方法:如 YUV420sp 4:2:0 的表示法称为A:B:C表示法

YUV 4:2:0 补充说明(还是对结构不太清晰明了,特别是NV12和NV21)

YUV4:2:2的采样方式表示:水平和垂直方向上Y分量和UV分量对的采样比都是2:1。

目前YUV4:2:0有两种变体,一种用于MPEG-1标准如下图:

另一个常用语MPEG-2标准,我们经常见到的4:2:0通常都是这种。如下图:


其他:略,太多太杂了,用到再看

RGB图像采集、转换YUV、x264编码、传输、解码、转换回RGB

一般来说,直接采集到的视频数据是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。

YUV420数据的存储方式

YV12,YU12格式(属于YUV420)

NV12、NV21(属于YUV420)


NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y’00、Y’01、Y’10、Y’11共用Cr00、Cb00

I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP

YUV视频查看工具:https://blog.csdn.net/m0_37622302/article/details/116606852

以上是关于YUV帧结构(紧缩格式packed打包格式和平面格式planar)(A:B:C表示法)的主要内容,如果未能解决你的问题,请参考以下文章

几种常见的YUV格式--yuv422:yuv420

初识YUV,实战NV21格式数据转换为Bitmap

初识YUV,实战NV21格式数据转换为Bitmap

图像处理YUV的详解

从相机获取 yuv 平面格式图像 - iOS

在java中将yuv帧编码为视频文件