Android,屏幕截图

时间:2014-11-06 18:37:44

标签: android android-ndk adb

我正在构建一个应该为任何具有Android 4及以上版本的非root 设备实现屏幕〜镜像〜的应用程序,2帧/秒就足够了。

我正在尝试使用ADB“framebuffer:”命令来抓取设备屏幕截图

ADB USB通信协议是面向消息的(不是流式传输),因此,为了获得一大块数据,接收/发送一组读取(A_WRTE @ 4096bytes)/确认(A_OKEY @ 24bytes)命令对。 >只要接收方没有发送A_OKEY,设备就不会推送其他数据(因此,不是流媒体协议)。

为了优化性能,我直接实现了ADB USB协议,而不是使用ADB.exe

三星Galaxy 5设备的图像分辨率为1920 * 1080和32位深度,因此,RAW帧缓冲图像的重量为1920 * 1080 * 4 = 8294400字节(对于iPAD,它甚至会更大) ,使用“framebuffer:”命令通过面向ADB消息的协议,接收单个屏幕截图(grrr ..)需要约2秒。

如果这是一个流媒体协议,它应该花费大约150毫秒的USB 2.0 @ 480Mbps

  • 考虑到上述情况,有没有办法让“framebuffer:”更快?
  • 在通过USB发送之前有没有办法降低分辨率?
  • 是否有其他方法(所有设备都可以使用)以更快的方式全天候截屏?
  • Android的AirPlay等效项(所有设备的通用)是最佳的吗?

P.S。
我已经尝试过ASL项目,它不适用于我的“三星Galaxy 5”,因为ADB.exe shell没有运行系统权限(而是在“shell”帐户下运行)。

1 个答案:

答案 0 :(得分:2)

在Android 4.3及更高版本中,您可以执行screenrecord所做的操作,并将镜像虚拟显示提供给视频编码器。 Version 1.2附带5.0" Lollipop",内置USB流式传输功能,包括通过adb shell发送二进制数据的termio代码。使用"隐藏"参数--output-format=h264并指定连字符(-)作为输出文件名。

源代码位于frameworks/av/cmds/screenrecord

这是通过USB获得不错的帧速率的唯一方法。您可以通过指定--output-format=raw-frames来体验未压缩的数据,但即使在VGA分辨率下,您也无法以合适的速度获取帧。

FWIW,当前设备通常不使用帧缓冲区开发,除非可能在恢复模式下。相反,它们使用由硬件编写器组合的叠加层,因为显示器被扫描出来。完整的详细信息位于architecture doc

相关问题