Android OpenGL以Java字节数组的形式获取渲染结果

Android OpenGL以Java字节数组的形式获取渲染结果,java,android,opengl-es,Java,Android,Opengl Es,我有两个纹理,我将它们组合(从两者中采样)并渲染到由MediaCodec提供的输入曲面,然后编码并保存到mp4文件中 我想做的是将组合帧作为Java字节数组。 我读到将其渲染为纹理并使用glReadPixels()的速度非常慢,我必须保持30-40 FPS的速度 在安卓系统中,最有效的方法是什么?没有真正的“快”路径,但“慢”路径并不那么慢 获取“外部”纹理内容的唯一方法是将其渲染到某个位置(例如,pbuffer),然后读取像素。这是因为外部纹理可以是“外来”颜色格式(通常是一些YUV风格),因

我有两个纹理,我将它们组合(从两者中采样)并渲染到由
MediaCodec
提供的输入
曲面
,然后编码并保存到mp4文件中

我想做的是将组合帧作为Java字节数组。 我读到将其渲染为纹理并使用
glReadPixels()
的速度非常慢,我必须保持30-40 FPS的速度

在安卓系统中,最有效的方法是什么?

没有真正的“快”路径,但“慢”路径并不那么慢

获取“外部”纹理内容的唯一方法是将其渲染到某个位置(例如,pbuffer),然后读取像素。这是因为外部纹理可以是“外来”颜色格式(通常是一些YUV风格),因此支持的操作集是有限的。不过,听起来您需要合并两个帧的GLES操作的输出,所以这不是问题

您不太可能在Android上安装GLES 2,即使安装了,您也可能需要使用NDK,因为我认为Java语言绑定不存在。(说到“K”和可能的“L”,我不知道“M”中会出现什么。)

至于读取像素,我用的实验发现,拉出720p帧大约需要8毫秒,这对于您的目的来说已经足够快了。速度会因设备和版本的不同而有很大差异(可能还有颜色格式——例如,我运行的某些代码是指定的RGB而不是RGBA,并且发送速度很慢)。有一个基本的基准,可以用来获得一个普遍的意义

glReadPixels()
的输出转到一个“direct”ByteBuffer,它不保证由
字节[]
支持。在Android的最新版本中(因为可能是Jellybean?),它保证分配给
allocDirect()
的缓冲区,但可能不适用于使用JNI函数创建的缓冲区。因此,请小心您选择的分配方法


尽管如此。。。一旦您将数据保存在
字节[]
中,您就无法从Java中使用它来保持所需的帧速率,除非您的图像非常小。如果你能找到一种解决GPU问题的方法,你会感觉更好。

glReadPixels(…)
如果你能正确使用它,它不会太慢,因为时间太晚了。当您可以容忍等待2-3帧以使结果在像素缓冲区对象中可用时,维持一定的帧速率要容易得多。您使用的是哪个版本的OpenGL ES(顺便说一句,您的问题被标记为错误)?在3.0+版本中,像素缓冲区对象是核心,否则您可能只能在可用的情况下执行此操作。Opengl es 2。我不熟悉像素缓冲区对象。你介意提供一个例子或者更多的细节吗?非常感谢你的帮助为什么投反对票?这是一个合理的问题!这个问题也不琐碎!我不想代表根普福尔特发言,但通常情况下,如果你看到一个带有根普福尔特名字的“x小时前编辑”的问题,它也会与-1票一致。至于你的情况,我认为你无法访问像素缓冲区对象,我也不知道在ES 2.0中如何有效地做到这一点。@genpfault,你对我的“谢谢”的下一票和编辑有何帮助?我在问一个合理的问题。如果你帮不上忙,那也没关系,但通过否决它,你就阻止了其他人看到它并提供帮助。