我正在开发一个 Camera2 应用程序,其中设置了一个自定义 OpenGL 管道来处理视频帧。
在我的管道中,我使用了几个不同的第三方帧处理 API,它们需要
android.media.Image
作为参数(例如,用于检测人脸或其他模型)。
我有一个 OpenGL 纹理,我可以用它来创建和填充 AHardwareBuffer。我现在如何同步创建由我的 OpenGL 纹理/硬件缓冲区支持的
android.media.Image
实例?
android.media.Image
类的实现几乎完全在 NDK/C++ 中,但是 AImage
中的 mediandk
也不提供构造函数。ImageReader
然后流入它的Surface,但这不是我想要的,因为它们不是同步创建的,而是仅在setOnImageAvailableListener
回调中创建。虽然 Android
media.Image
实际上主要是图形缓冲区的包装器,因此在低级别上可以被视为 AHardwareBuffer(加上元数据),但不幸的是没有公共 API 可以从 AHardwareBuffer 创建 media.Image (尽管反过来也是可能的),因为 media.Image
也具有与 ImageReaders 和 Writers 相关的所有权语义。
我知道您想要一个同步解决方案,但我不相信公共 API 中有这样的解决方案。您基本上必须使用 ImageReader 作为 EGL 渲染的目标。