我有一个应用程序使用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
答案 0 :(得分:0)
我也试图达到同样的目的,并尝试过fadden的建议。试图将CameraSurfaceRenderer
功能集成到GPUImageRenderer
。预览很好,但录制只是一个黑框的视频。 EGL14.eglGetCurrentContext()
返回null
以进行后续调用,我的猜测是,如果创建了新的上下文,它将与GPUImage
可能具有的内容不同
mVideoEncoder.startRecording(new TextureMovieEncoder.EncoderConfig(
mOutputFile, 640, 480, 1000000, EGL14.eglGetCurrentContext()));
@ Jesses.co.tt你能实现吗?
(因为我无法添加评论,因此将其添加为答案)。