gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:10 26 4
gpt4 key购买 nike

我想在类似于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com