我正在构建一个应该为任何具有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
P.S。
我已经尝试过ASL项目,它不适用于我的“三星Galaxy 5”,因为ADB.exe shell没有运行系统权限(而是在“shell”帐户下运行)。
答案 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。