YUV格式有两大类:planar和packed。
对于planar的YUV格式,Y,U,V都是连续存放的,比如 YYYYUUUUVVVV
对于packed的YUV格式,每个像素点的Y,U,V是连续交替存储的。
RGB24,BGR24等等都是packed方式存储的
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0
画了个图解,加深一下理解
enum AVPixelFormat {
AV_PIX_FMT_NONE = -1,
AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...
AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...
AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
…
AV_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)
AV_PIX_FMT_NV21, ///< as above, but U and V bytes are swapped
AV_PIX_FMT_ARGB, ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...
AV_PIX_FMT_RGBA, ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
AV_PIX_FMT_ABGR, ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
AV_PIX_FMT_BGRA, ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
…
};
RGB交替排列,RGBRGBRGB
占用空间Width*Height*3
YU12(I420)
每4个Y分量,共一个UV分量
Y是连续的,U也是连续的,V也是连续的
占用空间 Width*Height + Width*Height/4 + Width*Height/4
YV12
每4个Y分量,共一个UV分量
Y是连续的,U也是连续的,V也是连续的,只是V在U前面
占用空间 Width*Height + Width*Height/4 + Width*Height/4
NV12
每4个Y分量,共一个UV分量
Y是连续的,UV是交替存放的,先U后V
占用空间 Width*Height + Width*Height/4 + Width*Height/4
NV21
每4个Y分量,共一个UV分量
Y是连续的,UV是交替存放的,先V后U
占用空间 Width*Height + Width*Height/4 + Width*Height/4
每两个Y分量,共一个UV分量
Y是连续的,U是连续的,V也是连续的
占用空间Width *Height + Width*Height/2 +Width*Height/2
YUYV422
每两个Y分量,共一个UV分量
YUV是间隔排列,按照 YUYV依次排列
占用空间Width *Height + Width*Height/2 +Width*Height/2
每一个Y分量对应一个U分量,对应一个V分量
占用空间Width *Height*3