如何将SurfaceTexture保存为位图

时间:2013-10-14 18:24:25

标签: android opengl-es-2.0 mediacodec decoder

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

2 个答案:

答案 0 :(得分:10)

你必须渲染纹理。

如果它是正常纹理,并且您使用的是GLES 2或更高版本,则可以将其附加到FBO并直接从中读取。 SurfaceTexture由“external texture”支持,并且可能采用GL驱动程序不支持完整操作集的格式,因此您无法执行此操作。你需要渲染它,并阅读结果。

FWIW,您保存帧的方式可能会对性能产生重大影响。现在,演示MediaExtractorMediaCodecglReadPixels()和PNG文件创建的完整示例现已推出bigflake(ExtractMpegFramesTest)。

答案 1 :(得分: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+设备)。

  5. 我并不是说这会添加任何其他地方无法提供的信息。但是有这么多看似相似的选择(仍然无法发挥作用)令人困惑。我不是OpenGL专家,因此上述任何错误都很乐意得到纠正。