【发布时间】:2014-11-17 23:43:24
【问题描述】:
我有一个应用程序使用Android port of GPUImage 作为 OpenGL 渲染器和几个过滤器的管理器。
它目前没有视频实现,所以我正在尝试调整来自Google grafika repository 的 RecordFBOActivity 以与 GPUImage 架构一起使用。
基础 GPUImage 类管理 GLContext 和 GLSurfaceView,GPUImageRenderer 类实现 Renderer 类。
这是我试图从 grafika 的 RecordFBOActivity 改编 RenderThread 的类。有一些问题。
首先,在 preparegl() 方法中,我传递的是 SurfaceTexture 而不是 Surface,因为 GPUImage 根本不使用 SurfaceHolder (我想我可以实现它,但我尽量不要过多地更改基本代码,因为我想推动将我的实现返回到上述回购)。我知道 WindowSurface.java 有一个重载方法来从 SurfaceTexture 以及 Surface 构造一个 WindowSurface,但如果我这样做mSurface iVar 始终为空,因为我从来没有要传递给它的表面,这会导致 makeCurrent() 记录方法中出现 NPE。
Second,GPUImage 将自己附加到 GLSurfaceView,而不是像 grafika 示例使用的 SurfaceView,所以我有点不确定是否有任何可能导致我冲突的低级不一致......
第三,我认为这是主要问题,至少目前,我似乎无法将 GPUImage 的相机预览与WindowSurface 的 grafika。如果我注释掉 prepareGl() 方法,GPUImage 的 setUpSurfaceTexture() 从 SurfaceTexture 设置相机的预览纹理由 glGenTextures() 创建的 并且预览工作正常.. 以及附加到过滤器渲染链。但是,如果我尝试调用 prepareGL() 方法,并将完全相同的 SurfaceTexture 传递给 mWindowSurface 的构造函数,那么相机服务就会死掉我得到一个 EGL_BAD_SURFACE 错误。
很长的问题,有一些活动的部分,我知道......将尝试编辑/更新,因为我可以澄清问题和自己的方法。但是如果有人有任何想法/审讯,我会很高兴......特别是@fadden:D
【问题讨论】:
-
@fadden 会很高兴如果你能在这里插话......
-
您能否说明您是否正在使用相机。你看过camera2 api吗?还是您打算让它在旧相机 api 上运行?
-
@MorrisonChang 是的,我将相机从我的 MainActivity 传递到 GPUImage 类,并且该相机在 GPUImageRenderer 类中设置了其预览纹理...一切正常,直到相机和预览我尝试使用与相机相同的 SurfaceTexture 设置 WindowSurface...
-
是的,我正在研究 Lollipop 上的新相机 API,但这将不得不在以后发布……从我对课程的初步审查中,我不确定它会改变什么,我认为这是共享 OpenGLES 上下文的潜在逻辑问题,这是我的问题...
-
我不熟悉你提到的其他软件,所以我对问题是什么有点模糊。初步想法:使用 GLSurfaceView 意味着 EGL 上下文的管理是在“幕后”处理的,因此您必须为记录表面创建第二个上下文,并将其配置为共享,而不是使用单个上下文渲染到两个表面状态与 GLSurfaceView 上下文。 “显示 + 捕获相机”活动执行此操作。如果您使用的是独立的 EGL 上下文,则 GLSurfaceView 上下文中的纹理 ID 不会映射到您想要的。
标签: android opengl-es surfaceview glsurfaceview android-gpuimageview