【发布时间】:2014-02-01 08:52:31
【问题描述】:
是否可以使用 SurfaceComposerClient 来获取屏幕截图,就像 MediaCodec 使用 createInputSurface() 一样。
我不能为此使用 MediaCodec,因为我需要原始视频而不是编码数据。
从 4.3 开始,ScreenshotClient 似乎无法进行多张截图。
【问题讨论】:
标签: android android-ndk android-mediacodec
是否可以使用 SurfaceComposerClient 来获取屏幕截图,就像 MediaCodec 使用 createInputSurface() 一样。
我不能为此使用 MediaCodec,因为我需要原始视频而不是编码数据。
从 4.3 开始,ScreenshotClient 似乎无法进行多张截图。
【问题讨论】:
标签: android android-ndk android-mediacodec
是的,假设您以shell 或root 运行,并且您不介意使用非公共本机API(即您不在乎您的应用是否会在每次新版本的操作系统时中断推出)。
典型示例是screenrecord,在 Android 4.4 中引入。它创建一个虚拟显示并将输出定向到Surface。对于正常操作,MediaCodec 输入表面接收输出。对于screenrecord v1.1 中引入的“bugreport”模式,输出会发送到GLConsumer(大致相当于SurfaceTexture),然后会呈现到Surface 并带有重叠文本。
【讨论】:
setup_l() 中,Overlay 为 IGraphicBufferProducer 创建了一个 EGL 窗口表面。输入视频编码器。如果您改为创建 pbuffer 表面,则可以使用 glReadPixels() 提取 processFrame_l() 中纹理 blit 后的数据。
glReadPixels(GL_RGBA) 在某些设备上可能会花费很长的时间(177 毫秒对 6 毫秒)。在eglSetupContext()(或任何你为你的pbuffer配置EGL的地方),在EGL_BLUE_SIZE, 8,下面添加EGL_ALPHA_SIZE, 8,看看是否有帮助。