调整Grafika RecordFBOActivity以使用Android GPUImage

时间:2014-11-17 23:43:25

标签: android opengl-es surfaceview glsurfaceview android-gpuimageview

我有一个应用程序使用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 有一个重载方法来构建 SurfaceSxture 以及Surface的 WindowSurface ,但如果我这样做了 mSurface iVar总是为空,因为我从来没有表面传递给它,这会导致 makeCurrent()方法中的NPE记录。

第二 GPUImage 将自身附加到 GLSurfaceView ,而不是像grafika示例所使用的 SurfaceView ,所以我有点不确定是否存在可能导致我冲突的低级别不一致......

第三次,我认为这是主要问题,至少在目前,我似乎无法协调 GPUImage 的相机预览与grafika的 WindowSurface 。如果我注释掉 prepareGl()方法, GPUImage setUpSurfaceTexture()会从 SurfaceTexture设置相机的预览纹理创建的 glGenTextures(),预览工作正常..以及附加到过滤器渲染链。但是,如果我尝试调用 prepareGL()方法,并将完全相同的 SurfaceTexture 传递给 mWindowSurface 的构造函数,则相机服务将死亡我得到 EGL_BAD_SURFACE 错误。

很长的问题,有一些活动部分,我知道......会尝试编辑/更新,因为我可以澄清自己的问题和方法。但如果有人有任何想法/审讯,我会很高兴...特别是@fadden:D

1 个答案:

答案 0 :(得分:0)

我也试图达到同样的目的,并尝试过fadden的建议。试图将CameraSurfaceRenderer功能集成到GPUImageRenderer。预览很好,但录制只是一个黑框的视频。 EGL14.eglGetCurrentContext()返回null以进行后续调用,我的猜测是,如果创建了新的上下文,它将与GPUImage可能具有的内容不同

mVideoEncoder.startRecording(new TextureMovieEncoder.EncoderConfig(
                                    mOutputFile, 640, 480, 1000000, EGL14.eglGetCurrentContext()));

@ Jesses.co.tt你能实现吗?

(因为我无法添加评论,因此将其添加为答案)。