首页 文章

Android:是否可以在没有SurfaceView的情况下创建SurfaceTexture?

提问于
浏览
9

我想在类似于this answer的设置中创建一个我可以管理的OpenGL纹理 SurfaceTexture . (引用到这里:)

通过OpenGL创建纹理将此纹理传递给新SurfaceTexture的构造函数 . 将这个新的SurfaceTexture提供给相机 . 确保您使用的是OES_External(有关详细信息,请参阅文档) .

但是,创建OpenGL纹理(如答案的第1步),需要 EGL context ,这需要使EGLSurface成为当前,这需要SurfaceTexture . 似乎创建EGL上下文的唯一方法是创建一个SurfaceView(或具有SurfaceTexture的其他视图),并使用它初始化EGLSurface,然后使EGLContext保持最新 .

我的目标是创建一个EGLContext并使其在后台线程中是最新的,在相机预览图像上进行一些屏幕外计算(主要使用NDK) . 我想创建一个库,并使其尽可能独立于UI . 两个相关问题:

在Java方面,是否可以在不事先创建SurfaceTexture的情况下创建EGLContext?

在NDK方面,曾经有一个私有API调用来创建本机窗口 android_createDisplaySurface() ,但它没有私有API . 有没有办法用NDK创建表面?

我对使用EGL很陌生,我不明白为什么你需要一个EGLSurface来使EGLContext成为最新的 . 在iOS中,可以首先创建EAGLContexts,然后根据需要创建帧缓冲区 . 使用EGL似乎总是需要一个原生窗口 .

1 回答

  • 6

    您可以在Grafika中看到许多操作Camera输出,SurfaceTexture和EGL的示例 . "Continuous capture"活动是一个,但它使用您提到的技术:为了避免创建EGLSurface,它只是借用附近SurfaceView中的那个 .

    你需要有一个EGLSurface,但它不需要是一个窗口表面 . 您可以创建1x1 pbuffer表面并使用它 . 这是通过 eglCreatePbufferSurface() 调用完成的;请参阅Grafika的EglCore课程 .

    这些示例使用Java,但Java实现只包含本机EGL / GLES调用 .

    android_createDisplaySurface() 是一个内部调用,正如您所发现的,它不适用于较新的设备 . 搜索NDK以获取 ANativeWindow .

    Update: 对于通过搜索到达此处的任何人, android_createDisplaySurface() 依赖于一个名为 FramebufferNativeWindow 的内部类,该类在this change中的Android 5.0中被标记为过时 . 使用它的内部OpenGL ES测试代码在this change中使用基于SurfaceFlinger的替换进行了更新 . 测试代码的原始版本需要关闭Android应用程序框架,以便它可以获取帧缓冲区;较新的版本只是要求SurfaceFlinger提供一个覆盖屏幕的窗口,并在其他所有窗口上进行合成 .

相关问题