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

标签 android opengl-es android-ndk egl

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

  1. Create a texture through OpenGL
  2. Pass this texture to the constructor of new SurfaceTexture.
  3. Give this new SurfaceTexture to the camera.
  4. Make sure you are using OES_External (see documentation for details).

但是,创建 OpenGL 纹理(如答案的第 1 步)需要一个 EGL 上下文,这需要一个 EGLSurface 成为当前的,这需要一个 SurfaceTexture。创建 EGL 上下文的唯一方法似乎是创建一个 SurfaceView(或另一个具有 SurfaceTexture 的 View ),并使用它来初始化 EGLSurface,然后使 EGLContext 成为当前 View 。

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

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

在 NDK 方面,曾经有一个私有(private) API 调用来创建 native 窗口 android_createDisplaySurface(),但它不再起作用了,好吧,它是一个私有(private) API。有什么方法可以使用 NDK 创建表面吗?

我对使用 EGL 很陌生,我不明白为什么需要 EGLSurface 才能使 EGLContext 成为最新的。在iOS中,可以先创建EAGLContexts,然后根据需要创建framebuffers。使用 EGL,您似乎总是需要一个 native 窗口。

最佳答案

您可以在 Grafika 中看到许多操作相机输出、SurfaceTexture 和 EGL 的示例. “连续捕获” Activity 是其中之一,但它使用了您提到的技术:为了避免必须创建 EGLSurface,它只是从附近的 SurfaceView 借用了一个。

您确实需要有一个 EGLSurface,但它不需要是一个窗口 表面。您可以创建一个 1x1 pbuffer 表面并直接使用它。这是通过 eglCreatePbufferSurface() 调用完成的;有关示例,请参见 Grafika 中的 EglCore 类。

这些示例是用 Java 编写的,但 Java 实现只是包装了 native EGL/GLES 调用。

android_createDisplaySurface() 是一个内部调用,正如您所发现的,它在较新的设备上不起作用。而是在 NDK 中搜索 ANativeWindow

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

关于Android:是否可以在没有 SurfaceView 的情况下创建 SurfaceTexture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23378993/

相关文章:

iphone - iPhone 上的《会说话的汤姆猫》应用程序中使用什么软件来制作动画和创建猫

android-ndk - 运行 ProGuard 后 JNI RegisterNatives() 找不到类方法

android - xamarin.android 6.1 应使用哪个 android ndk 版本

android - 在移动设备或 iPad 上查看时背景图片无响应

Android:在 Opengl 应用程序中播放视频的最佳方式

android - 是否可以让用户从非市场版本的应用程序更新到市场版本?

android - 通过 VBO 将附加数据传递给 fragment 着色器 - DynamicSpriteBatch

android - APK 打包时重复文件,libpjsua2.so

android - 如何从 Activity 中停止 START_STICKY android 服务

android - 字符串中的字符不替换