【问题标题】:Can I reuse SurfaceView to encode after display to screen?我可以在显示到屏幕后重复使用 SurfaceView 进行编码吗?
【发布时间】:2021-10-16 15:50:30
【问题描述】:

我正在使用 OpenGLES2 输出显示到 SurfaceView 或使用 MediaCodec 编码为 mp4。

但是,我一次只能做一个。显然,我可以使用 OpenGLES2 在两个单独的表面上进行绘制,但这对 GPU 的使用效率非常低。

我想要的是使用某种引用计数来重用缓冲区以在屏幕上绘制和编码单个 OpenGLES2 输出。就像相机服务在共享表面概念中的作用一样。

可以同时显示和编码缓冲区吗? Android 中是否存在某种 tee 元素(如在 GStreamer 中)?

【问题讨论】:

    标签: android surfaceview android-mediacodec


    【解决方案1】:

    目前没有可用的 T 组件。

    但是您可以通过绘制到帧缓冲区对象然后将帧复制到屏幕和编码器来避免渲染两次。

    这是example(相当旧)。

    【讨论】:

    • 感谢您的回答,您提到的是在不同的表面上绘制两次(我已经知道),而不是像 tee 那样我们应该能够复制完成的缓冲区。因此,我不能接受你的回答。
    • 另外,我希望有一个引用计数解决方案,这样就不需要复制,从而提高速度并减少内存使用量。
    • FBO 包含完成的帧,然后将其复制到多个表面。有几种方法可以从 FBO 复制帧(例如使用 glBlitFramebuffer)。这通常比绘制整个场景两次要快得多。
    • khronos.org/registry/OpenGL-Refpages/es3.0/html/… 告诉 glBlitFramebuffer 不适用于 OpenGLES2,你有 OpenGLES2 android 的替代品吗?
    • 首先,我认为没有充分的理由在 2021 年不需要 OpenGL ES 3。另一种方法是使用您的框架作为纹理绘制一个全屏纹理四边形。由于您的直通着色器代码中没有逻辑,因此性能应该与 BIT BLIT 几乎相同。
    【解决方案2】:

    你不能让你的surfaceView 比屏幕大。 尽管有多种方法可以以不同的方式执行此操作,但您不能直接重用surfaceview在显示到屏幕后进行编码。

    【讨论】:

    • 我不想让我的 SurfaceView 比我的屏幕大。你所说的“有多种方法可以以不同的方式做到这一点”是什么意思?
    猜你喜欢
    • 2015-03-11
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多