在iOS中,如何将y平面,u平面和uv平面与yuv双平面分开?

use*_*635 3 objective-c avfoundation video-streaming

在应用程序中,我使用了AVCaptureVideo。我获得了kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式的视频。

现在我从imagebuffer获得y平面和uv平面。

  CVPlanarPixelBufferInfo_YCbCrBiPlanar *planar = CVPixelBufferGetBaseAddress(imageBuffer);

    size_t y-offset = NSSwapBigLongToHost(planar->componentInfoY.offset);
    size_t uv-offset = NSSwapBigLongToHost(planar->componentInfoCbCr.offset);
Run Code Online (Sandbox Code Playgroud)

这里yuv是双平面格式(y + UV)。

什么是紫外线平面?是uuuu,yyyy格式还是uvuvuvuv格式?如何分别获得u平面和y平面?

有人可以帮助我吗?

jgh*_*jgh 5

Y平面表示亮度分量,UV平面表示Cb和Cr色度分量。

对于kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式,您会发现亮度平面为8bpp,尺寸与视频相同,色度平面为16bpp,但仅为原始视频尺寸的四分之一。在此平面上,每个像素将具有一个Cb和一个Cr成分。

因此,如果您输入的视频是352x288,则Y平面将为352x288 8bpp,而CbCr 176x144 16bpp。得出的数据量与12bpp 352x288图像大约相同,仅为RGB888的一半,但仍少于RGB565。

因此,在缓冲区中,Y将看起来像这样, [YYYYY . . . ] 而UV [UVUVUVUVUV . . .]

vs RGB当然, [RGBRGBRGB . . . ]