目前我正在尝试使用textureView和OpenGL,我的目标是从SurfaceTexture读取缓冲区。经过大量的搜索,我找到了grafika,但未找到使用textureview的合适示例。(并且,由于某种原因,我必须使用textureView)
我尝试的是我创建了一个纹理并试图设置textureView来使用它:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(null);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_textureview);
displayTextureView=(TextureView) findViewById(R.id.camera_textureview);
mEglCore = new EglCore(null, EglCore.FLAG_RECORDABLE);
mOffscreenSurface=new OffscreenSurface(mEglCore,VIDEO_WIDTH,VIDEO_HEIGHT);
mOffscreenSurface.makeCurrent();
mFullFrameBlit = new FullFrameRect(
new Texture2dProgram(Texture2dProgram.ProgramType.TEXTURE_EXT));
mTextureId = mFullFrameBlit.createTextureObject();
mCameraTexture = new SurfaceTexture(false);
mCameraTexture.attachToGLContext(mTextureId);
displayTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
displayTextureView.setSurfaceTexture(mCameraTexture);
mHandler = new MainHandler(this);
Initialized=true;
}
但后来它给我一个错误:
GLConsumer已经附加到上下文中
我也找到了this,但是在我尝试了这里描述的方法后,我从glReadPixels获得的是完全黑色的,所以我想SurfaceTexture必须附加到GLcontext才能读取像素。
有人可以给我一些帮助吗?
这个例子使用surfaceView,你只需要替换到textureView。
386行:“mDisplaySurface = new WindowSurface(mEglCore,holder.getSurface(),false);”只需用textureView中的surfacetexture替换holder.getSurface()。
并且有一种方法来读取缓冲区https://github.com/google/grafika/blob/master/app/src/main/java/com/android/grafika/gles/EglSurfaceBase.java
看一下saveFrame方法。