命令比“adb shell screencap”更快?

6ovsh4lw  于 2023-01-17  发布在  Shell
关注(0)|答案(7)|浏览(465)

我正在使用以下命令捕获Android模拟器屏幕:
亚洲开发银行 shell 屏幕封装-p/sdcard/屏幕封装. png
但是执行命令和保存PNG文件需要500毫秒,有没有更快的方法来捕获屏幕数据?我不需要PNG文件本身,只需要“图像数据”,因为我只是创建PNG并将其加载到.NET Bitmap类中以读取像素颜色。
我需要一个更快的方式来捕捉图像,因为我需要像模拟器屏幕每秒10个图像与它交互,所以录制屏幕生成视频文件对我来说不是一个“解决方案”。
谢谢

thigvfpy

thigvfpy1#

老问题了,但是你可以试试adb shell screencap screen.dump。这将跳过将文件转换为png的步骤,并将生成一个可以以十六进制读取的文件。
有12个字节的头,然后文件以位置(0,0)(左上)的像素颜色作为RGBA开始。
文件的最终大小取决于显示器的大小。

o4tp2gmn

o4tp2gmn2#

当然,除了你在目标设备上编写并运行一个应用程序,然后通过网络将其发送回来之外,没有这样的方法存在。在模拟器的情况下,使用adb forward
有关详细信息,请参见createVirtualDisplay。

cnh2zyt3

cnh2zyt33#

您可以使用adb shell screencap -j /sdcard/screencap.jpg
它将保存图像的jpg格式,这对我来说几乎是3倍的速度比png。

wwodge7n

wwodge7n4#

我并不需要PNG文件本身,只需要“图像数据”
如果不希望保存文件,则无需指定图像位置:

adb shell screencap -p

图像数据是PNG格式打印出来的字节数组。这是你用ADB命令能达到的最快速度(在我装有Bluestacks 4. 2的PC上通常是150ms)。
如果你仍然想要更快的速度,使用win32 api的方法可能是最快的。你需要确保你的模拟器窗口被设置为正确的大小并且在屏幕上可见。

zbdgwd5y

zbdgwd5y5#

image = check_output(["adb", "-s", emulator, "shell", "screencap -p"])
image = cv2.imdecode(np.fromstring(image, np.uint8), cv2.IMREAD_COLOR)

近100 ms延迟

oipij1gg

oipij1gg6#

一般来说,adb exec-out screencap >screenshotName.raw用于获取原始图像数据,adb exec-out screencap -p >screenshotName.png用于获取png文件,但两者都不是最快的:原始文件较大,速度受限于adb带宽;png在文件大小方面要好得多,但可能需要太长的时间来压缩。
传输数据的更好方法是adb exec-out "screencap | gzip -1" >screenshotName.gz。“-1”是最低压缩级别。您可以进一步试验压缩级别(从-1到-9). Gzip压缩图像的速度更快,虽然结果大小稍大,但仍然足够好,可以更快地传输结果数据。我已经尝试了一些示例图像(界面屏幕以及全屏照片),而gzip方法总是快两倍或更多。

7kjnsjlb

7kjnsjlb7#

我也在使用Memu模拟器进行图像识别。如果你在Windows上,你可以使用各种工具来编程Memu窗口特定句柄的截图功能。
我通过调用本机Windows函数得到了大约24- 36 FPS的截图。

相关问题