【问题标题】:How to save SurfaceTexture as bitmap如何将 SurfaceTexture 保存为位图
【发布时间】:2013-10-14 18:24:25
【问题描述】:

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

【问题讨论】:

  • 你试过什么。你见过这个 SO 问题吗:stackoverflow.com/questions/12600023/…
  • 我是 GLES 的新手,如果我错了,请纠正我:我正在考虑直接将 SurfaceTexture 的内容转换为基于 Surface 颜色格式的 RGB,而不实际渲染纹理。

标签: android opengl-es-2.0 android-mediacodec decoder


【解决方案1】:

我最近一直在看这个,在 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 专家,因此很乐意纠正上述任何错误。

【讨论】:

  • 一个可以节省我时间的答案,否则我可能会花时间探索和绘制每个兔子洞(只是发现一半的洞没有结果)是一个有用的答案。 +1,与我们分享最初的研究/工作。
  • EGL_KHR_image_base() 似乎没有在 NDK 中提供,所以我可以使用 EGLImage。
【解决方案2】:

你必须渲染纹理。

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

FWIW,保存帧的方式会对性能产生重大影响。 Bigflake (ExtractMpegFramesTest) 上提供了一个完整示例,演示了 MediaExtractorMediaCodecglReadPixels() 和 PNG 文件的使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多