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

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

Create a texture through OpenGL

Pass this texture to the constructor of new SurfaceTexture.

Give this new SurfaceTexture to the camera.

Make sure you are using OES_External (see documentation for

details).

但是,创建OpenGL纹理(如答案的第1步),需要EGL上下文,这需要使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似乎总是需要一个原生窗口.

解决方法:

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

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

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

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

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

标签:android,opengl-es,android-ndk,egl

来源: https://codeday.me/bug/20191005/1855517.html

好的,我会给您讲解使用 SurfaceTexture 和 SurfaceView 实现相机预览的方法。 首先,在布局文件中添加一个 SurfaceView: ```xml <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后在 Activity 或 Fragment 中获取 SurfaceView,并设置相机预览: ```java // 获取 SurfaceView SurfaceView surfaceView = findViewById(R.id.surfaceView); // 获取相机实例 Camera camera = Camera.open(); try { // 设置相机预览显示的 Surface camera.setPreviewDisplay(surfaceView.getHolder()); // 开始预览 camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } ``` 接下来,我们来使用 SurfaceTexture 来实现相机预览。 首先,在布局文件中添加一个 TextureView: ```xml <TextureView android:id="@+id/textureView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 然后在 Activity 或 Fragment 中获取 TextureView,并设置相机预览: ```java // 获取 TextureView TextureView textureView = findViewById(R.id.textureView); // 获取相机实例 Camera camera = Camera.open(); try { // 创建 SurfaceTexture SurfaceTexture surfaceTexture = new SurfaceTexture(0); // 设置相机预览显示的 Surface camera.setPreviewTexture(surfaceTexture); // 开始预览 camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } ``` 使用 SurfaceTexture 来实现相机预览的好处在于,可以通过 TextureView 的 setSurfaceTextureListener() 方法来监听 SurfaceTexture 的状态,例如当 SurfaceTexture 准备好后,可以获取它的宽高等信息,从而进行一些额外的操作。 希望这些代码可以帮助到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值