作为我的应用程序的一部分,我需要将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);