我正在用命令捕捉一个安卓模拟器的屏幕。
adb shell screencap -p /sdcard/screencap.png
但是执行命令和保存png文件需要500ms,有什么更快的方法来捕获屏幕数据?我其实不需要PNG文件本身,只需要 "图像数据",因为我只是创建PNG并将其加载到.NET Bitmap类中以读取像素颜色。
我需要一个更快的方法来捕捉图像,因为我需要每秒10张模拟器屏幕的图像来与之互动,所以录制屏幕来生成视频文件对我来说不是一个 "解决方案"。
老问题了,但你可以试试 adb shell screencap screen.dump 。这将跳过将文件转换为png的步骤,并将生成一个可在Hex中读取的文件。
adb shell screencap screen.dump
有12个字节的头,然后文件从位置(0,0)(左上角)的像素颜色开始,为RGBA。
文件的最终大小取决于你的显示器的大小。
AFAIK,除了你在目标设备上编写和运行一个应用程序,不存在这样的方法。然后通过网络把它送回来。在仿真器的情况下,使用 adb forward 。
adb forward
See 创建虚拟显示(CreateVirtualDisplay 了解更多细节。
adb
You can use adb shell screencap -j /sdcard/screencap.jpg
adb shell screencap -j /sdcard/screencap.jpg
它将把图像保存为jpg格式,对我来说,这几乎比png快3倍。
我其实不需要PNG文件本身,只需要 "图像数据"。
如果你不希望文件被保存,你不需要指定图像位置。
adb shell screencap -p 图像数据是PNG格式,以字节数组形式打印出来。这和你使用adb命令的速度一样快(在我使用Bluestacks 4.2的电脑上通常为150ms)。 如果你仍然想要更快的速度,这种方法使用win32 api也许是最快的。你需要确保你的模拟器窗口被设置为正确的大小,并在屏幕上可见。
图像数据是PNG格式,以字节数组形式打印出来。这和你使用adb命令的速度一样快(在我使用Bluestacks 4.2的电脑上通常为150ms)。
如果你仍然想要更快的速度,这种方法使用win32 api也许是最快的。你需要确保你的模拟器窗口被设置为正确的大小,并在屏幕上可见。
Usama 发布于 2020-09-24
0 人赞同
image = check_output(["adb", "-s", emulator, "shell", "screencap -p"]) image = cv2.imdecode(np.fromstring(image, np.uint8), cv2.IMREAD_COLOR)