2

我有一个应用程序使用GPUImage 的 Android 端口作为 OpenGL 渲染器和几个过滤器的管理器。

它目前没有视频实现,因此我正在尝试调整Google grafika 存储库中的 RecordFBOActivity 以与 GPUImage 架构一起使用。

基础 GPUImage 类管理 GLContext 和 GLSurfaceView,GPUImageRenderer 类实现 Renderer 类。

这是我试图从 grafika 的 RecordFBOActivity 改编 RenderThread 的类。有几个问题。

首先,在preparegl()方法中,我传递的是SurfaceTexture而不是Surface,因为GPUImage根本不使用SurfaceHolder(我想我可以实现它,但我尽量不要过多地更改基本代码,因为我想将我的实施推迟到上述回购)。我知道WindowSurface.java具有从SurfaceTexture和 Surface 构造WindowSurface的重载方法,但如果我这样做,mSurface iVar 始终为空,因为我从来没有要传递给它的表面,这会导致 NPE在makeCurrent()记录方法中。

其次GPUImage将自己附加到GLSurfaceView,而不是像 grafika 示例使用的SurfaceView,所以我有点不确定是否有任何可能导致冲突的低级不一致...

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

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

4

1 回答 1

0

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

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

@Jesses.co.tt 你能做到吗?

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

于 2014-12-06T17:17:23.443 回答