将 android.media.Image.hardwareBuffer 读取为 opengl 纹理

问题描述 投票:0回答:1

在Android中使用Kotlin和camera2。 在本节中如何将 image.hardwareBuffer 读取为 opengl 纹理?

val onImageAvailableListener = ImageReader.OnImageAvailableListener { reader ->
            val image = reader.acquireLatestImage()
            if(image != null && image.hardwareBuffer != null){
                //read image.hardwareBuffer in opengl es 3.0
                image.close()
            }
        }

搜索我认为需要的东西。

eglGetNativeClientBufferANDROID()
eglCreateImageKHR()
glEGLImageTargetTexture2DOES()
eglClientWaitSyncKHR()

哪些只能在 C++ 中使用? 有没有另一种更简单的方法而不使用c++? 如果没有,那么您可以编写一个示例,将这些函数放在一起以便能够读取 opengl es 3.0 着色器中的纹理吗?

android c++ android-camera2 opengl-es-3.0
1个回答
0
投票

最简单的选择是根本不使用 ImageReader,而是切换到 SurfaceTexture,它设计用于将帧读入 GPU。

如果这不可行,您需要确保 ImageReader.newInstance() 包含 USAGE_GPU_SAMPLED_IMAGE 标志。

然后您可以通过 Image.getHardwareBuffer() 将 Image 转换为 HardwareBuffer。 然后你可以将其包装在 EGL 纹理中;这可能必须在本机代码中完成,我找不到正确的 EGL 调用的快速参考。 但看起来您可能需要 eglCreateImageFromHardwareBufferglEGLImageTargetTexture2DOES 执行必要的步骤。

因此,如果可能的话,坚持使用 SurfaceTexture。

© www.soinside.com 2019 - 2024. All rights reserved.