3

我一直在研究适用于 iOS 的 OpenGL ES。我想知道YUV格式的数据是否可以在不转换RGB的情况下显示。在大多数情况下,yuv 数据必须转换为 RGB 才能显示。但是,转换过程很慢,那就是显示不流畅。 所以,我想尝试在不转换为 RGB 的情况下显示 YUV 数据。可能吗?如果可能,我能做什么? 请让我给个建议。

4

3 回答 3

5

您可以使用 OpenGL ES 2.0 着色器非常轻松地做到这一点。我将这种技术用于我的超快速 iOS 相机应用 SnappyCam。片段着色器将执行矩阵乘法以将您从YCbCr(" YUV") 带到RGB. 您可以将每个{Y, Cb, Cr}通道放在单独的GL_LUMINANCE纹理中,或者如果您的色度数据已经交错(Apple 称之为双平面格式),则可以{Cb, Cr}使用纹理将纹理组合在一起。GL_LUMINANCE_ALPHA

请参阅我对 Apple A4 上 YUV 到 RGBA 问题的相关回答,我应该使用着色器还是 NEON?在 StackOverflow 上。

您也可以使用 ES 1.1 的固定渲染管道来执行此操作,但我没有尝试过。我会关注纹理混合功能,例如在这个 OpenGL 纹理组合器 Wiki 页面中给出的。

于 2012-02-18T00:36:11.860 回答
5

我认为在不转换为 RGB 数据的情况下,OpenGL ES 无法显示 YUV 数据。

于 2012-02-08T16:09:28.533 回答
1

您是否正在寻找 IOS、iPhone 应用程序的解决方案,然后有解决方案。

当视频像素类型设置为kCVPixelFormatType_420YpCbCr8BiPlanarFullRange时,这是将CMSampleBufferRef转换为UIImage的方法

-(UIImage *) imageFromSamplePlanerPixelBuffer:(CMSampleBufferRef) sampleBuffer{

    @autoreleasepool {
        // Get a CMSampleBuffer's Core Video image buffer for the media data
        CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        // Lock the base address of the pixel buffer
        CVPixelBufferLockBaseAddress(imageBuffer, 0);

        // Get the number of bytes per row for the plane pixel buffer
        void *baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);

        // Get the number of bytes per row for the plane pixel buffer
        size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0);
        // Get the pixel buffer width and height
        size_t width = CVPixelBufferGetWidth(imageBuffer);
        size_t height = CVPixelBufferGetHeight(imageBuffer);

        // Create a device-dependent gray color space
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();

        // Create a bitmap graphics context with the sample buffer data
        CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
                                                     bytesPerRow, colorSpace, kCGImageAlphaNone);
        // Create a Quartz image from the pixel data in the bitmap graphics context
        CGImageRef quartzImage = CGBitmapContextCreateImage(context);
        // Unlock the pixel buffer
        CVPixelBufferUnlockBaseAddress(imageBuffer,0);

        // Free up the context and color space
        CGContextRelease(context);
        CGColorSpaceRelease(colorSpace);

        // Create an image object from the Quartz image
        UIImage *image = [UIImage imageWithCGImage:quartzImage];

        // Release the Quartz image
        CGImageRelease(quartzImage);

        return (image);
    }
}

如果您正在寻找移动设备,那么我可以提供其他设备。

于 2015-10-28T05:56:14.107 回答