如何将 Android MediaCodec Surface 连接到 Vulkan

Pet*_*ran 6 android vulkan android-mediacodec

我对使用 Android MediaCodec 进行解码并将 YUV 通过 Surface 馈送到 OpenGL 纹理有很好的理解。我想用 Vulkan 做类似的事情。但是我没有成功找到任何文档或示例代码。

我的问题是:我将如何连接以下管道?

MediaCodec Video Decoder ? Surface ? texture ? Vulkan
Run Code Online (Sandbox Code Playgroud)

细节

OpenGL 比较

为了进行比较,在 OpenGL 的情况下,Android Surface 的构造和使用方式如下

 textureId = glGenTextures( &textureId )
 surface = new Surface( new SurfaceTexture( textureId ) )
 mediaCodec.configure( surface )
Run Code Online (Sandbox Code Playgroud)

Jes*_*all 9

目前这是不可能的,因为无法从 Vulkan 外部导入内存对象,也无法从任何可以导出 Surface 的 SDK Vulkan 对象导入。查看VK_KHX_external_memory相关扩展,了解其中的部分内容将来如何工作。

编辑 2018-05-23:现在可以使用VK_ANDROID_external_memory_android_hardware_buffer扩展及其依赖的扩展。您可以使用它AImageReader_newWithUsage()来创建AImageReader与 GPU 兼容的采样。ANativeWindow从中获取AImageReader并将其用作 的AMediaCodec输出表面。然后,对于您收到的每个图像,获取并使用扩展名将AHardwareBuffer其导入到VkDeviceMemory/对中。VkImage