我对使用 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) 我在Nexus 5上运行的Grafika MediaCodec示例代码中执行了一些简单的MoviePlayer.java计时.我在这些位置放了一个日志语句:
在前一行的203行
decoder.queueInputBuffer
Run Code Online (Sandbox Code Playgroud)
在第244行之后
decoder.dequeueOutputBuffer
Run Code Online (Sandbox Code Playgroud)
我使用了日志语句presentationTimeUs
.
以下是logcat的摘录:
01-29 10:56:43.295: I/Grafika(21286): queueInputBuffer index/pts, 2,0
01-29 10:56:43.305: I/Grafika(21286): queueInputBuffer index/pts, 0,33100
01-29 10:56:43.315: I/Grafika(21286): queueInputBuffer index/pts, 3,66466
01-29 10:56:43.325: I/Grafika(21286): queueInputBuffer index/pts, 1,99833
01-29 10:56:43.325: I/Grafika(21286): queueInputBuffer index/pts, 2,133200
01-29 10:56:43.335: I/Grafika(21286): queueInputBuffer index/pts, 0,166566
01-29 10:56:43.345: I/ATSParser(21286): discontinuity on stream pid 0x1011
01-29 10:56:43.345: I/ATSParser(21286): discontinuity on stream pid 0x1100
01-29 10:56:43.345: I/Grafika(21286): queueInputBuffer index/pts, 3,199933
01-29 10:56:43.345: I/Grafika(21286): dequeueOutputBuffer index/pts, 7,0
01-29 10:56:43.345: …
Run Code Online (Sandbox Code Playgroud)