解決android opengl glReadPixels 慢的問題 二
1, 如上圖所示,要創建2個PBO
GLES30.glGenBuffers(2, pbo);
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(0));
GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, oWidth * oHeight * 4, null, GLES30.GL_DYNAMIC_READ);
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(1));
GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, oWidth * oHeight * 4, null, GLES30.GL_DYNAMIC_READ);
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);
2, 使用 pbo進行操作
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pbo.get(nextIndex));
Buffer buf = GLES30.glMapBufferRange(GLES30.GL_PIXEL_PACK_BUFFER, 0, 4 * mWidth * mHeight, GLES30.GL_MAP_READ_BIT);
ByteBuffer bytebuffer = ((ByteBuffer) buf).order(ByteOrder.nativeOrder());
bb.put(bytebuffer);
//tool.fwrite("/sdcard/src.rgba", bb.array(), bb.array().length, 0);
video.RecordVideoAddFrame(bb.array(), mWidth, mHeight, 1, 1);
GLES30.glUnmapBuffer(GLES30.GL_PIXEL_PACK_BUFFER);
long end = System.currentTimeMillis();
Log.d("jni", "time = " + (end - start));
3,可以把讀取的保存成視頻進行處理
使用2個pbo過後,再我的手機上測試情況下,1080x1080的圖片大概平均耗時10毫秒左右,有了質的提高, 這也滿足了我們一般拍攝錄製的需求,但是要求需要降低更
多,顯示這種方式還不沒達到我們最低的要求,請參照下篇介紹,把處理一楨的時間耗時2毫秒左右,這樣會大大節省你錄製視頻的時間