6

当我将视频解码到表面时,我想将我想要的帧保存为位图/jpeg 文件。我不想在屏幕上绘图,只想将 SurfaceTexture 的内容保存为图像文件。

4

2 回答 2

10

我最近一直在看这个,在 Android 平台上。总结各种选项以及为什么它们适用/不适用。

  1. glReadPixels() Android Java 程序员目前真正拥有的唯一选项。据说很慢。从帧缓冲区读取,而不是纹理(因此必须首先将纹理渲染到内部帧缓冲区,除非想要记录屏幕本身)。好的。有事情要做。

  2. EGL_KHR_image_base() 似乎在本机 (NJK) 级别上可用但在 Java 中不可用的扩展。

  3. glGetTexImage() 看起来很有希望,但在 OpenGL 2.0 ES 变体中不可用。

  4. 像素缓冲区对象 可能是做事的“正确”方式,但需要 OpenGL 3.0 ES(即选定的 Android 4.3+ 设备)。

我并不是说这是在添加任何其他地方无法获得的信息。但是有这么多看似相似的选项(仍然行不通)令人困惑。我不是 OpenGL 专家,因此很乐意纠正上述任何错误。

于 2014-03-19T14:29:43.503 回答
9

您必须渲染纹理。

如果它是普通纹理,并且您使用的是 GLES 2 或更高版本,则可以将其附加到 FBO 并直接从中读取。ASurfaceTexture由“外部纹理”支持,并且可能采用 GL 驱动程序不支持完整操作集的格式,因此您不能这样做。您需要渲染它并读取结果。

FWIW,您保存框架的方式可能会对性能产生重大影响。Bigflake (ExtractMpegFramesTest) 上展示了如何使用 、 、 和 PNG 文件创建MediaExtractor完整MediaCodec示例。glReadPixels()

于 2013-10-14T22:19:09.147 回答