相关文章推荐
沉稳的火车  ·  android ...·  1 周前    · 
礼貌的消防车  ·  Android P 跳过 Gapps ...·  3 周前    · 
很拉风的课本  ·  Android ...·  1 月前    · 
刚毅的鸵鸟  ·  Hadoop ...·  1 年前    · 
成熟的柳树  ·  Oops!!! - 简书·  1 年前    · 

比 "adb shell screencap "更快的命令?

4 人关注

我正在用命令捕捉一个安卓模拟器的屏幕。

adb shell screencap -p /sdcard/screencap.png

但是执行命令和保存png文件需要500ms,有什么更快的方法来捕获屏幕数据?我其实不需要PNG文件本身,只需要 "图像数据",因为我只是创建PNG并将其加载到.NET Bitmap类中以读取像素颜色。

我需要一个更快的方法来捕捉图像,因为我需要每秒10张模拟器屏幕的图像来与之互动,所以录制屏幕来生成视频文件对我来说不是一个 "解决方案"。

5 个评论
你在哪里使用这些数据?你是否从设备上提取PNG,然后在其他地方处理?
Imac
我使用MEmu模拟器,所以当我把它保存在/sdcard/时,它就保存在电脑的一个共享文件夹中。
你是否与MEmu的开发者联系过你的问题?
Imac
好吧,实际上这并不是MEmu的问题,它与所有我必须使用ADB交互的模拟器有关,比如Nox、Memu、Droid4X等等。在搜索这方面的信息时,我看到有人说主要的问题是生成.png文件,而不是真正的获取屏幕帧缓冲区(生成.png),但我不确定如何在不生成真正的.png的情况下使用'screencap',甚至不确定这是否真的可能
"但我不确定如何使用'屏幕cap'而不生成真正的.png" -- 你不能。你可以使用未记录的(?)工具API,这些程序如 Droid@Screen 使用。或者,正如本建议的那样,让一个安卓应用使用媒体投影API,并通过网络向你发送屏幕截图。
android
shell
adb
Imac
Imac
发布于 2017-05-11
6 个回答
GuiFGDeo
GuiFGDeo
发布于 2020-09-24
已采纳
0 人赞同

老问题了,但你可以试试 adb shell screencap screen.dump 。这将跳过将文件转换为png的步骤,并将生成一个可在Hex中读取的文件。

有12个字节的头,然后文件从位置(0,0)(左上角)的像素颜色开始,为RGBA。

文件的最终大小取决于你的显示器的大小。

最后如何将其转换为png/jpg或创建位图对象?
Ben
Ben
发布于 2020-09-24
0 人赞同

AFAIK,除了你在目标设备上编写和运行一个应用程序,不存在这样的方法。然后通过网络把它送回来。在仿真器的情况下,使用 adb forward

See 创建虚拟显示(CreateVirtualDisplay 了解更多细节。

Imac
'adb forward'会不会更快地拍下屏幕?或者这只是另一种与安卓设备/模拟器沟通的方式?
Ben
@IgorM 检查 adb 的帮助。它只是端口转发,理想的最大速度低于480Mbps(USB 2.0典型)。大多数时候它提供超过20Mbps的速度,我认为这足以满足你的需要。
user5636914
发布于 2020-09-24
0 人赞同

You can use adb shell screencap -j /sdcard/screencap.jpg

它将把图像保存为jpg格式,对我来说,这几乎比png快3倍。

Alex
adb没有这个选项'-j'。
Anthony
Anthony
发布于 2020-09-24
0 人赞同

我其实不需要PNG文件本身,只需要 "图像数据"。

如果你不希望文件被保存,你不需要指定图像位置。

adb shell screencap -p

图像数据是PNG格式,以字节数组形式打印出来。这和你使用adb命令的速度一样快(在我使用Bluestacks 4.2的电脑上通常为150ms)。

如果你仍然想要更快的速度,这种方法使用win32 api也许是最快的。你需要确保你的模拟器窗口被设置为正确的大小,并在屏幕上可见。

Usama
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)