我正在构建一个应用程序,该应用程序应为具有Android 4及更高版本的任何无根设备实现屏幕“镜像”功能,启动2帧/秒就足够了。
我正在尝试使用ADB“ framebuffer:”命令来抓取设备屏幕截图
ADB USB通信协议是面向消息的(不是流传输),因此,要获取数据块,需要接收/发送一组已读取(A_WRTE @ 4096bytes)/确认(A_OKEY @ 24bytes)命令对。
只要接收方没有发送A_OKEY,设备就不会推送其他数据(因此,不是流协议)。
为了优化性能,我直接实现了ADB USB协议,而不是使用ADB.exe
Samsung Galaxy 5设备的图像分辨率为1920 * 1080,深度为32位,因此,RAW帧缓冲图像的权重为1920 * 1080 * 4 = 8294400字节(对于iPAD,它甚至更大),使用通过面向ADB消息的协议的“ framebuffer:”命令大约需要2秒钟才能收到单个屏幕截图(grrr ..)。
如果这将是流协议,则在USB 2.0 @ 480Mbps上应该花费约150毫秒
PS
我已经尝试过ASL项目,但由于ADB.exe Shell并未以系统特权运行(而是在“ shell”帐户下运行),因此它无法在我的“三星Galaxy 5”上运行。
在Android 4.3及更高版本上,您可以执行screenrecord
操作并将镜像的虚拟显示输入视频编码器。带有5.0“ Lollipop”的1.2版具有内置的USB流传输功能,其中包括termio代码以在上发送二进制数据adb shell
。使用“ hidden”参数--output-format=h264
并指定连字符(-
)作为输出文件名。
源代码在frameworks / av / cmds / screenrecord中。
这是通过USB获得体面帧速率的唯一方法。您可以通过指定来对未压缩的数据进行实验--output-format=raw-frames
,但是即使在VGA分辨率下,也无法以适当的速度获得帧。
FWIW,当前的设备通常不在恢复模式下使用帧缓冲区dev。取而代之的是,它们使用覆盖层,这些覆盖层是在扫描显示时由硬件编辑器组合而成的。完整细节在体系结构文档中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句