【问题标题】:get screenshots from SurfaceComposerClient从 SurfaceComposerClient 获取屏幕截图
【发布时间】:2014-02-01 08:52:31
【问题描述】:

是否可以使用 SurfaceComposerClient 来获取屏幕截图,就像 MediaCodec 使用 createInputSurface() 一样。

我不能为此使用 MediaCodec,因为我需要原始视频而不是编码数据。

从 4.3 开始,ScreenshotClient 似乎无法进行多张截图。

【问题讨论】:

    标签: android android-ndk android-mediacodec


    【解决方案1】:

    是的,假设您以shellroot 运行,并且您不介意使用非公共本机API(即您不在乎您的应用是否会在每次新版本的操作系统时中断推出)。

    典型示例是screenrecord,在 Android 4.4 中引入。它创建一个虚拟显示并将输出定向到Surface。对于正常操作,MediaCodec 输入表面接收输出。对于screenrecord v1.1 中引入的“bugreport”模式,输出会发送到GLConsumer(大致相当于SurfaceTexture),然后会呈现到Surface 并带有重叠文本。

    【讨论】:

    • 在 screenrecord 1.1 Overlay 中,我需要做什么才能从 outputSurface (IGraphicBufferProducer) 获取图像原始字节?
    • setup_l() 中,Overlay 为 IGraphicBufferProducer 创建了一个 EGL 窗口表面。输入视频编码器。如果您改为创建 pbuffer 表面,则可以使用 glReadPixels() 提取 processFrame_l() 中纹理 blit 后的数据。
    • 我终于让它开始工作了,但是它让设备速度变慢了,不像 MediaCodec 一点也不慢(而且它还编码应该比抓取原始数据更慢的​​东西,不?)。有什么办法可以加快速度?
    • 我最近了解到的一点是,如果 EGL 没有配置 alpha 平面,glReadPixels(GL_RGBA) 在某些设备上可能会花费很长的时间(177 毫秒对 6 毫秒)。在eglSetupContext()(或任何你为你的pbuffer配置EGL的地方),在EGL_BLUE_SIZE, 8,下面添加EGL_ALPHA_SIZE, 8,看看是否有帮助。
    • EGL_ALPHA_SIZE,8 岁,你介意看看我的代码,也许我正在做 glReadPixels() 。 dl.dropboxusercontent.com/u/36894441/EglWindow.cppdl.dropboxusercontent.com/u/36894441/Overlay.cpp
    【解决方案2】:

    Android 4.3 中存在一个错误(请参阅 Android 开源项目问题跟踪器上的问题 5964960638),这意味着 ScreenshotClient 不能用于截取多个屏幕截图。

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2014-09-26
      相关资源
      最近更新 更多