我正在使用以下命令捕获Android模拟器屏幕:亚洲开发银行 shell 屏幕封装-p/sdcard/屏幕封装. png但是执行命令和保存PNG文件需要500毫秒,有没有更快的方法来捕获屏幕数据?我不需要PNG文件本身,只需要“图像数据”,因为我只是创建PNG并将其加载到.NET Bitmap类中以读取像素颜色。我需要一个更快的方式来捕捉图像,因为我需要像模拟器屏幕每秒10个图像与它交互,所以录制屏幕生成视频文件对我来说不是一个“解决方案”。谢谢
thigvfpy1#
老问题了,但是你可以试试adb shell screencap screen.dump。这将跳过将文件转换为png的步骤,并将生成一个可以以十六进制读取的文件。有12个字节的头,然后文件以位置(0,0)(左上)的像素颜色作为RGBA开始。文件的最终大小取决于显示器的大小。
adb shell screencap screen.dump
o4tp2gmn2#
当然,除了你在目标设备上编写并运行一个应用程序,然后通过网络将其发送回来之外,没有这样的方法存在。在模拟器的情况下,使用adb forward。有关详细信息,请参见createVirtualDisplay。
adb forward
cnh2zyt33#
您可以使用adb shell screencap -j /sdcard/screencap.jpg它将保存图像的jpg格式,这对我来说几乎是3倍的速度比png。
adb shell screencap -j /sdcard/screencap.jpg
wwodge7n4#
我并不需要PNG文件本身,只需要“图像数据”如果不希望保存文件,则无需指定图像位置:
adb shell screencap -p
图像数据是PNG格式打印出来的字节数组。这是你用ADB命令能达到的最快速度(在我装有Bluestacks 4. 2的PC上通常是150ms)。如果你仍然想要更快的速度,使用win32 api的方法可能是最快的。你需要确保你的模拟器窗口被设置为正确的大小并且在屏幕上可见。
zbdgwd5y5#
image = check_output(["adb", "-s", emulator, "shell", "screencap -p"]) image = cv2.imdecode(np.fromstring(image, np.uint8), cv2.IMREAD_COLOR)
近100 ms延迟
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方法总是快两倍或更多。
adb exec-out screencap >screenshotName.raw
adb exec-out screencap -p >screenshotName.png
adb exec-out "screencap | gzip -1" >screenshotName.gz
7kjnsjlb7#
我也在使用Memu模拟器进行图像识别。如果你在Windows上,你可以使用各种工具来编程Memu窗口特定句柄的截图功能。我通过调用本机Windows函数得到了大约24- 36 FPS的截图。
7条答案
按热度按时间thigvfpy1#
老问题了,但是你可以试试
adb shell screencap screen.dump
。这将跳过将文件转换为png的步骤,并将生成一个可以以十六进制读取的文件。有12个字节的头,然后文件以位置(0,0)(左上)的像素颜色作为RGBA开始。
文件的最终大小取决于显示器的大小。
o4tp2gmn2#
当然,除了你在目标设备上编写并运行一个应用程序,然后通过网络将其发送回来之外,没有这样的方法存在。在模拟器的情况下,使用
adb forward
。有关详细信息,请参见createVirtualDisplay。
cnh2zyt33#
您可以使用
adb shell screencap -j /sdcard/screencap.jpg
它将保存图像的jpg格式,这对我来说几乎是3倍的速度比png。
wwodge7n4#
我并不需要PNG文件本身,只需要“图像数据”
如果不希望保存文件,则无需指定图像位置:
图像数据是PNG格式打印出来的字节数组。这是你用ADB命令能达到的最快速度(在我装有Bluestacks 4. 2的PC上通常是150ms)。
如果你仍然想要更快的速度,使用win32 api的方法可能是最快的。你需要确保你的模拟器窗口被设置为正确的大小并且在屏幕上可见。
zbdgwd5y5#
近100 ms延迟
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方法总是快两倍或更多。7kjnsjlb7#
我也在使用Memu模拟器进行图像识别。如果你在Windows上,你可以使用各种工具来编程Memu窗口特定句柄的截图功能。
我通过调用本机Windows函数得到了大约24- 36 FPS的截图。