当前,我正在尝试使用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上才能读取像素。
有人可以给我一些帮助吗?
答案 0 :(得分:1)
此示例使用surfaceView,您只需要替换为textureView。
386行:“ mDisplaySurface =新的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方法。