将RGBA转换为IYUV

时间:2019-01-21 16:45:47

标签: java android android-studio yuv rgba

作为我的应用程序的一部分,我需要将RGBA转换为IYUV格式。

我正在使用openGL ES进行glReadPixels()调用,然后使用glMapBufferRange()调用将其加载到字节缓冲区中。我已经能够可靠地从屏幕上读出像素,并将数据另存为图像。 glReadPixels()仅返回RGBA格式的数据。

下一步是将这些数据送入h.264编码器进行压缩。我相信h.264编码器会使用IYUV格式的数据。

所以我正在寻找一种将RGBA转换为IYUV色彩空间的方法。我是图像处理的新手,所以我仍然在做很多事情。任何朝着正确方向前进的人将不胜感激!

我已经看过许多本机android colorspace转换实用程序,但它们都没有涵盖这种特定情况。 Android似乎只本地支持几种YUV,而IYUV并不是其中一种。

此代码通过glReadPixelsPBO()读取屏幕数据

            //generate and bind buffer ID
            GLES30.glGenBuffers(1, pboIds);
            checkGlError("Gen Buffers");
            GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pboIds.get(0));
            checkGlError("Bind Buffers");

            //creates and initializes data store for PBO.  Any pre-existing data store is deleted
            GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, (mWidth * mHeight * 4), null, GLES30.GL_STATIC_READ);
            checkGlError("Buffer Data");


            glReadPixelsPBO(0, 0, mWidth, mHeight, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, 0);
            checkGlError("Read Pixels");

此代码将像素加载到ByteBuffer

            //read pixels from PBO into a byte buffer for processing.  Unmap buffer for use in next pass
            mapBuffer = ((ByteBuffer) GLES30.glMapBufferRange(GLES30.GL_PIXEL_PACK_BUFFER, 0, 4 * mWidth * mHeight, GLES30.GL_MAP_READ_BIT)).order(ByteOrder.nativeOrder());
            checkGlError("Map Buffer");

            byte[] mBuffer;
            //ByteBuffer.get(destination) will dump bytes into byte array, then probs easier to print out in human readable
            Log.d(TAG, "Mapped Buffer Contents: \n");

            GLES30.glUnmapBuffer(GLES30.GL_PIXEL_PACK_BUFFER);
            checkGlError("Unmap Buffer");

            convertColorSpace(mapBuffer);

0 个答案:

没有答案