如何单独的Y平面,U平面和UV-平面从IOS YUV双平面?(How seperate y-plan

2019-07-03 21:46发布

在应用我使用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);

这里YUV是双平面格式(Y + UV)。

什么是UV-平面? 这是UUUU,yyyy格式或uvuvuvuv格式? 如何我得到的U平面和y平面seperatly?

任何一个可以请帮我吗?

Answer 1:

所述Y平面表示亮度分量,并且在UV平面表示Cb和Cr色度分量。

在kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式的情况下,你会发现亮度平面是与8bpp的尺寸相同的视频,你色度平面将16bpp的,但只有原始视频的大小的四分之一。 您将有一个Cb和这架飞机上每个像素一个Cr分量。

所以,如果您的视频输入是352×288,你的Y平面将是352×288 8bpp的,和你的CBCR 176×144 16bpp的。 该工程以大致相同量的数据作为一个12bpp 352×288的图像,有一半会是什么需要RGB888,仍然低于RGB565。

所以在缓冲区,Y看起来像这样[YYYYY . . . ] [YYYYY . . . ] [YYYYY . . . ]和UV [UVUVUVUVUV . . .] [UVUVUVUVUV . . .]

VS RGB之中,当然, [RGBRGBRGB . . . ] [RGBRGBRGB . . . ]



Answer 2:

下面的代码从pixelBuffer格式为kCVPixelFormatType_420YpCbCr8BiPlanarFullRange复制YUV数据。

CVPixelBufferLockBaseAddress(pixelBuffer, 0);

size_t pixelWidth = CVPixelBufferGetWidth(pixelBuffer);
size_t pixelHeight = CVPixelBufferGetHeight(pixelBuffer);
// y bite size
size_t y_size = pixelWidth * pixelHeight;
// uv bite size
size_t uv_size = y_size / 2;
uint8_t *yuv_frame = malloc(uv_size + y_size);
// get base address of y
uint8_t *y_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);
// copy y data
memcpy(yuv_frame, y_frame, y_size);
// get base address of uv
uint8_t *uv_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1);
// copy uv data
memcpy(yuv_frame + y_size, uv_frame, uv_size);

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);


文章来源: How seperate y-planar, u-planar and uv-planar from yuv bi planar in ios?