gpt4 book ai didi

java - Android OpenGL 获取渲染结果为 Java Byte 数组

转载 作者:行者123 更新时间:2023-11-30 10:58:39 26 4
gpt4 key购买 nike

我有 2 OES_EGL_image_external我组合(从两者采样)并渲染到 MediaCodec 给出的输入 Surface 的纹理,然后编码并保存到 mp4 文件。

我想做的是将组合框架作为 Java 字节数组获取。我读到将它渲染到纹理并使用 glReadPixels() 真的很慢,我必须跟上大约 30-40 FPS。

在 Android 中最有效的方法是什么?

最佳答案

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

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

你不太可能有PBOs在 Android 上的 GLES 2 中,即使你这样做了,你也可能需要使用 NDK,因为我认为不存在 Java 语言绑定(bind)。 (说到 'K' 和可能的 'L',不知道 'M' 会发生什么。)

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

glReadPixels() 的输出进入“直接”ByteBuffer,不保证由 byte[] 支持。在最近的 Android 版本中(可能是 Jellybean?),它可以保证使用 allocDirect() 分配的缓冲区,但可能不适用于使用 JNI 函数创建的缓冲区。因此,请谨慎选择您选择的分配方法。

综上所述...一旦您将数据保存在 byte[] 中,您就无法通过 Java 对它做很多事情来保持所需的帧速率,除非你的图片很小。最好找到一种方法来解决 GPU 的问题。

关于java - Android OpenGL 获取渲染结果为 Java Byte 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com